Я бы назвал практику «явного другого», которую вы называете анти-паттерном, так как она скрывает тот факт, что нет специального кода в качестве еще одного для вашего if.
Удобочитаемость / удобство сопровождения обычно улучшаются, когда у вас нет ничего, кроме необходимых конструкций потока кода, и вы минимизируете их. Это означает избыточные Elses и if, которые добавят область действия ко всей функции, затрудняют отслеживание и поддержку.
Скажем, например, у вас есть эта функция:
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
else
{
oblogonToConfigure.Color = _validColors[0];
oblogonToConfigure.ColorIndex = 0;
}
}
Теперь возникает требование, что во время конфигурации вы также должны указать индекс типа / типа облогона, есть несколько областей, в которые кто-то может поместить этот код и получить неверный код, т.е.
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (!_validOblogons.Contains(oblogonToConfigure.Type))
{
oblogonToConfigure.Type = _validOblogons[0];
oblogonToConfigure.TypeIndex = 0;
if (_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
else
{
oblogonToConfigure.Color = _validColors[0];
oblogonToConfigure.ColorIndex = 0;
}
}
else
{
oblogonToConfigure.TypeIndex = _validOblogons.IndexOf(oblogonToConfigure.Type);
}
}
Сравните это с тем, если исходный код был написан с минимальными необходимыми конструкциями потока управления и при этом свернутыми.
public void ConfigureOblogon(Oblogon oblogonToConfigure)
{
if (!_validColors.Contains(oblogonToConfigure.Color))
{
oblogonToConfigure.Color = _validColors[0];
}
oblogonToConfigure.ColorIndex = _validColors.IndexOf(oblogonToConfigure.Color);
}
Теперь было бы гораздо сложнее случайно поместить что-то в неправильную область или в конечном итоге вздутие области действия, что приведет к дублированию в долгосрочной перспективе роста и поддержания этой функции. Кроме того, очевидно, что возможные потоки через эту функцию повышают читабельность.
Я знаю, пример немного надуманный, но я много раз видел
SomeFunction()
{
if (isvalid)
{
/* ENTIRE FUNCTION */
}
/* Nothing should go here but something does on accident, and an invalid scenario is created. */
}
Поэтому формализация этих правил для конструкций потока управления, я думаю, может помочь людям развить интуицию, необходимую для того, чтобы что-то почувствовать, когда они начнут писать такой код. Тогда они начнут писать ..
SomeFunction()
{
if (!isvalid)
{
/* Nothing should go here, and it's so small no one will likely accidentally put something here */
return;
}
/* ENTIRE FUNCTION */
}
elseкажется фальшивой. Довольно часто просто нечего положить вelseблок, если вы не наклонитесь назад.