Вот очень упрощенный пример . Это не обязательно вопрос конкретного языка, и я прошу вас игнорировать многие другие способы написания функции и внесения в нее изменений. , Цвет уникального типа
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
else
{
return "No you can't";
}
}
Многие люди, с которыми я встречался, ReSharper, и этот парень (чей комментарий напомнил мне, что я некоторое время просил об этом) рекомендуют рефакторинг кода, чтобы удалить elseблок, оставив этот:
(Я не могу вспомнить, что сказал большинство, иначе я бы не спросил)
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
return "No you can't";
}
Вопрос: Есть ли увеличение сложности, вызванное отсутствием elseблока?
У меня сложилось впечатление, что elseболее прямо заявляет о своем намерении, заявляя, что код в обоих блоках напрямую связан.
Кроме того, я обнаружил, что могу предотвратить незначительные ошибки в логике, особенно после внесения изменений в код позднее.
Возьмите этот вариант моего упрощенного примера (игнорируя тот факт, что orоператор, поскольку это намеренно упрощенный пример):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
Кто-то может теперь добавить новый ifблок на основе условия после первого примера, не сразу правильно распознав, что первое условие накладывает ограничение на собственное условие.
Если бы elseблок присутствовал, то кто бы ни добавил новое условие, он будет вынужден переместить содержимое elseблока (и если каким-то образом они затенят его, эвристика покажет, что код недоступен, чего не происходит в случае, когда одно ifограничивает другое) ,
Конечно, есть и другие способы определения конкретного примера, которые предотвращают эту ситуацию, но это всего лишь пример.
Длина приведенного мною примера может исказить визуальный аспект этого, поэтому предположим, что пространство, занятое в скобках, относительно незначительно для остальной части метода.
Я забыл упомянуть случай, в котором я согласен с пропуском блока else, и это при использовании ifблока для применения ограничения, которое должно быть логически выполнено для всего следующего кода, такого как нулевая проверка (или любые другие средства защиты) ,
elseпредложения (на мой вкус, он будет еще более читабельным, если оставить ненужные скобки. Но я думаю, что пример не очень хорошо выбран, потому что в в вышеприведенном случае я бы написал return sky.Color == Color.Blue(без if / else). Пример с другим типом возврата, отличным от bool, вероятно, сделает это более понятным
