Ось дуже спрощений приклад . Це не обов'язково питання, що стосуються мови, і я прошу вас проігнорувати безліч інших способів написання функції та змін, які можуть бути внесені до неї. . Колір унікального типу
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, мабуть, зробить це зрозумілішим.