Прежде всего, давайте оставим в стороне ситуации, когда лучше вообще не использовать «else» (я надеюсь, что все согласны с тем, что такие ситуации существуют, и определение таких случаев, вероятно, должно быть отдельной темой).
Итак, давайте предположим, что должно быть предложение "else".
Я думаю, что читаемость / понятность накладывает как минимум три ключевых требования или правила, которые, к сожалению, часто конкурируют друг с другом:
Чем короче первый блок (блок if), тем легче понять всю конструкцию if-else. Когда блок «если» достаточно длинный, становится слишком просто упускать из виду существование блока «еще».
Когда пути «if» и «else» логически асимметричны (например, «обычная обработка» или «обработка ошибок»), в автономной конструкции «if-else» это делает не имеет большого значения, какой путь первый, а какой второй. Однако, когда есть множественные конструкции if-else в непосредственной близости друг к другу (включая вложение), и когда все эти конструкции if-else имеют асимметрию одного и того же вида - тогда это очень важно организовать эти асимметричные пути последовательно.
Опять же, это может быть "если ... нормальный путь ... еще ... ненормальный путь" для всех или "если ... ненормальный путь ... еще ... нормальный путь" для всех, но это не должно быть сочетание этих двух вариантов.
При прочих равных условиях, на первом месте нормальный путь, вероятно, более естественен для большинства людей (я думаю, что это больше о психологии, чем эстетике: -).
Выражение, которое начинается с отрицания, обычно менее читабельно / понятно, чем выражение, которое этого не делает.
Итак, у нас есть эти три конкурирующих требования / правила, и реальный вопрос: какие из них важнее других. Для Аллена Голуба правило № 1, пожалуй, самое важное. Для Стива Макконнелла - это правило № 2. Но я не думаю, что вы действительно можете выбрать только одно из этих правил в качестве единой контрольной линии.
Могу поспорить, что вы уже догадались о моих личных приоритетах здесь (по тому, как я заказал правила выше :-).
Мои причины просты:
Правило № 1 является безусловным и его невозможно обойти. Если один из блоков настолько длинный, что выходит за пределы экрана, он должен стать «другим». (Нет, не рекомендуется создавать механическую функцию / метод просто для уменьшения количества строк в блоке «if» или «else»! Я предполагаю, что каждый блок уже имеет логически оправданную минимальное количество строк.)
Правило № 2 включает в себя множество условий: несколько конструкций if-else, все имеют асимметрию одинакового типа и т. Д. Поэтому оно просто не применяется во многих случаях.
Кроме того, я часто наблюдаю следующее интересное явление: когда правило № 2 действительно применяется и когда оно используется должным образом, оно фактически не конфликтует с правилом № 1! Например, всякий раз, когда у меня есть куча операторов if-else с асимметрией «нормальный или ненормальный», все «ненормальные» пути короче, чем «нормальные» (или наоборот). Я не могу объяснить это явление, но думаю, что это просто признак хорошей организации кода. Другими словами, всякий раз, когда я вижу ситуацию, когда правила № 1 и № 2 находятся в конфликте, я начинаю искать «запахи кода» и чаще всего нахожу их; а после рефакторинга - тада! нет больше болезненного выбора между правилом № 1 и правилом № 2 :-)
Наконец, правило № 3 имеет наименьшую область действия и поэтому является наименее критичным.
Кроме того, как отмечают здесь другие коллеги, часто очень легко «обмануть» это правило (например, написать «if (disabled) ,,,» вместо «if (! Enabled) ... «).
Я надеюсь, что кто-то может понять этот опус ...