When you write code, it can happen that you nest some ifs or loops inside each other. Here is an example:

Because of the shape of the indentation, this code smell is called an anti-arrow pattern. The deepest indentation depth is the tip of the arrow. In my opinion, such a style is detrimental to readability and comprehension.
In the following, I would like to present a simple way of resolving such arrow anti-patterns.
Extract Method
First we extract the arrow pattern as a new method. This allows us to use return values instead of variable assignments and makes the code clearer.
public string PrintElephantMessage(Animal animal)
{
Console.WriteLine(IsAElephant(animal));
}
public string IsAElephant(Animal animal)
{
if (animal.IsMammal())
{
if (animal.IsGrey())
{
if (animal.IsBig())
{
if (animal.LivesOnLand())
{
return "It is an elephant";
}
else
{
return "It is not an elephant. Elephants live on land";
}
}
else
{
return "It is not an elephant. Elephants are big";
}
}
else
{
return "It is not an elephant. Elephants are grey";
}
}
else
{
return "It is not an elephant. Elephants are mammals";
}
}
Turn over ifs
A quick way to eliminate the arrow anti-pattern is to invert the if conditions. This will make the code look like this:
public string IsAElephant(Animal animal)
{
if (!animal.IsMammal())
{
return "It is not an elephant. Elephants are mammals";
}
if (!animal.IsGrey())
{
return "It is not an elephant. Elephants are grey";
}
if (!animal.IsBig())
{
return "It is not an elephant. Elephants are big";
}
if (!animal.LivesOnLand())
{
return "It is not an elephant. Elephants live on land";
}
return "It is an elephant";
}
Some IDEs like Visual Studio can help flip the Ifs.
Conclusion
Arrow anti-pattern are code smells and make your code less legible. Fortunately, you can refactor the code with a few simple steps.