Вот очень упрощенный пример . Это не обязательно вопрос конкретного языка, и я прошу вас игнорировать многие другие способы написания функции и внесения в нее изменений. , Цвет уникального типа
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, вероятно, сделает это более понятным