Прекратите использовать "else"

Это может звучать так, как будто я прошу вас ходить на одной ноге, но на самом деле я, скорее всего, попрошу вас перестать ходить на четвереньках.

Я впервые обнаружил это правило благодаря PHPMD:



Я действительно не понимал, почему, но мне это понравилось, и я начал пробовать. Это не относится к конкретному языку, я покажу примеры на PHP, но он будет достаточно общим, чтобы работать на большинстве других языков программирования. Давайте вместе попробуем и посмотрим, какая разница.

Результат точно такой же. Но со вторым мы делаем более очевидным, чем метод всегда возвращает значение. Действительно, если мы начнем использовать вложенные if-else, значение по умолчанию тоже может быть очень вложенным.

Хорошо, вы думаете, что это еще не кажется революционным. Тогда вы можете подумать, что это просто, но что бы произошло, если бы мне было чем заняться после оператора else:

Теперь звучит так, будто я не могу использовать ранние операторы возврата и поэтому не могу избавиться от операторов else.

Да, я могу. Здесь правило else помогает понять, что я возложил слишком много ответственности на свою функцию. Помимо PHPMD также рекомендуется не использовать логический аргумент (https://phpmd.org/rules/cleancode.html#booleanargumentflag), как я сделал с $ important по той же причине.

Оба эти правила говорят мне: если вы не можете написать одну функцию, не нарушив этих правил, вам следует разделить ее на более мелкие.

Следование правилам заставляет нас переписывать функции с четкой и более атомарной ответственностью за каждую. Теперь вместо вызова getWaterState (40, true или false) мы вызываем getWaterState (40) или getImportantWaterState (40)

Другой пример:

Я знаю, что мы могли бы просто удалить первое else, повторно используя ту же переменную $ градусов, но предположим, что мы не хотим изменять ввод функции и будем использовать $ celsiusDegrees, чтобы сделать более явным, что это масштаб, который мы, наконец, используем для расчет.

Хорошо, так как мы могли бы удалить else, если мы не хотим использовать слишком много функций позже (getWaterStateFromCelsius, getImportantWaterStateFromCelsius, getWaterStateFromFahrenheit, getImportantWaterStateFromFahrenheit), тогда 2 варианта для рассмотрения:

Тернарный оператор:

Я знаю, что тернарный оператор не нравится многим как не очень явный, за исключением некоторых языков, таких как Python или CoffeeScript, где на самом деле все еще есть слова «if» и «else». И вы можете подумать, что тернарное выражение - это просто краткий стиль if-else, но не совсем. Большая разница в том, что операторы if {} else {} представляют 2 разных действия (в каждом блоке кода), в то время как тернарный код предназначен для возврата значения. В приведенном выше коде мы фактически выполняем одно и то же действие (присваиваем $ celsiusDegrees) как в if, так и в else, но с другим значением. Вот почему тернарный оператор действительно имеет смысл и почему он позволяет нам упростить дублированный код $celsiusDegrees =, потому что мы используем его как селектор значения, а не переключатель операций.

Тройной вариант никогда не бывает одиноким. Вы также можете использовать промежуточную функцию:

Это дает понятное название каждой операции. Каждый метод имеет свою специфику и делегирует другому то, что не относится к его роли.

Вывод

Я не говорю, что мы не смогли бы достичь этого результата, сохраняя else утверждения. И я не говорю, что без них у нас не может быть запутанного кода. Но, следуя этому правилу, вы сможете легче освоить кодекс, в котором соблюдается принцип единоличной ответственности.

И помните, ни одна из рекомендаций, которые может дать вам какой-либо инструмент, не может быть универсальной, правило запрета на другие действия, как и многие другие, - это просто запах кода, то есть инструмент говорит вам: у него слишком много обязанностей ». но инструмент (пока) не определяет, почему вы именно его использовали, он просто указывает вам, что нужно проверить. И вы никогда не должны следовать указаниям вашего инструмента очистки, не ставя под сомнение его актуальность в данной ситуации, например, когда он предупреждает, что у вас дублированный код (см. Https://www.sandimetz.com/blog/2016/1/ 20 / неправильная-абстракция ).

Так что моя личная рекомендация - не никогда не использовать else, а всегда сначала пробовать что-нибудь другое.