Another possibility if you don't like to see too many the else's is to drop the use of else altogether and throw in an extra return statement. Else is kind of superfluous unless you require more complex logic to determine if there are more than just two action possibilities.
Thus your example might become:
void DoABunchOfStuff()
{
if(FileExists(file))
{
DoSomethingWithFileContent(file);
return;
}
DefaultAction();
}
void DoSomethingWithFileContent(file)
{
var contents = GetFileContents(file)
if(SomeTest(contents))
{
DoSomething(contents);
return;
}
DefaultAction();
}
AReturnType GetFileContents(file)
{
return OpenFile(file);
}
void DoABunchOfStuff()
{
if(FileExists(file))
{
DoSomethingWithFileContent(file);
return;
}
DefaultAction();
}
void DoSomethingWithFileContent(file)
{
var contents = GetFileContents(file)
if(SomeTest(contents))
{
DoSomething(contents);
return;
}
DefaultAction();
}
AReturnType GetFileContents(file)
{
return OpenFile(file);
}
Personally I don't mind using the else clause as it states explicitly how the logic is supposed to work, and so improves readability of your code. Some code beautification tools however prefer to simplify to a single if statement to discourage nesting logic.