Должен ли я использовать защитную оговорку и попытаться избежать оговорки else?

Я читал (например, от Мартина Фаулера), что мы должны использовать предложение защиты вместо одиночного возврата в (коротком) методе в ООП. Я также читал (откуда-то не помню), что по возможности следует избегать предложения else.

Но мои коллеги (я работаю в небольшой команде, в которой всего 3 человека) заставляют меня не использовать множественные возвраты в методе, а использовать else как можно чаще, даже если в блоке else всего одна строка комментария.

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

Я ошибаюсь или что мне с этим делать?


person chance    schedule 03.02.2011    source источник
comment
Что касается я не могу просмотреть весь код метода на одном экране, вы имели в виду, что они использовали if-els так много, что код стал с таким большим отступом, что он выходит за правый край окна? экран? Или что if-else занимает немного больше места, поэтому метод длиннее (выше), чем должен быть? Кстати. Мне нравятся охранные оговорки.   -  person KajMagnus    schedule 25.08.2015
comment
даже если в блоке else есть только одна строка комментария — один источник для этого взят из книги Code Complete. Однако похоже, что они слишком догматичны в отношении его применения.   -  person icc97    schedule 03.09.2015


Ответы (4)


Это спорный и чисто эстетический вопрос.

Раннего возврата исторически избегали в C и подобных языках, поскольку можно было пропустить очистку ресурсов, которая обычно помещается в конец функции в случае досрочного возврата.

Учитывая, что в Java есть исключения и «попробуй, поймай, наконец», не нужно бояться досрочного возврата.

Лично я согласен с вами, так как я часто возвращаюсь раньше - это обычно означает меньше кода и более простой поток кода с меньшим количеством вложений if/else.

person Marko    schedule 03.02.2011
comment
Если мне не изменяет память, еще одна причина избегать раннего возврата (или выхода из цикла) заключалась в том, что было легче теоретически доказать правильность кода. (также известная как формальная проверка) - person biziclop; 03.02.2011
comment
+1 за указание на то, что это спорно. Я также предпочитаю ранний возврат для удобочитаемости. - person Joeri Hendrickx; 03.02.2011
comment
Я также предпочитаю ранний возврат, если он примерно принимает форму защитных предложений и не приводит к многочисленным туманным операторам return. Вырваться из цикла for, например, совершенно нормально. for (Object o : objects) { if (someCondition) { return o; }} - person MC Emperor; 05.01.2018
comment
Я бы сказал, что это больше, чем просто эстетика, я бы сказал, что это сохраняет наш ментальный стек неглубоким и тем самым снижает когнитивную нагрузку. - person jxramos; 03.10.2019
comment
Это совершенно субъективно, но люди, предпочитающие условия гнездования, ошибаются. - person cambunctious; 23.09.2020

Предложение Guard — хорошая идея, потому что оно ясно указывает, что текущий метод не интересуется в определенных случаях. Когда вы в самом начале метода уточняете, что он не работает с некоторыми случаями (например, когда какое-то значение меньше нуля), то остальная часть метода является чистой реализацией его ответственности.

Существует еще один более сильный случай защитных предложений — операторы, которые проверяют ввод и выдают исключения, когда какой-либо аргумент неприемлем, например. нулевой. В этом случае вы не хотите продолжать выполнение, а хотите бросить в самом начале метода. Вот где защитные предложения являются лучшим решением, потому что вы не хотите смешивать логику создания исключений с ядром реализуемого вами метода.

Говоря о защитных предложениях, которые генерируют исключения, вот одна статья о том, как их можно упростить в C# с помощью методов расширения: Как уменьшить цикломатическую сложность: Guard Clause. Хотя этот метод недоступен в Java, он полезен в C#.

person Zoran Horvat    schedule 15.07.2015

Предложите им прочитать http://www.cis.temple.edu/~ingargio/cis71/software/roberts/documents/loopexit.txt и посмотрите, изменит ли это их мнение. (У их идеи есть история, но я на вашей стороне.)

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

person btilly    schedule 03.02.2011
comment
В этой статье слишком много всего нужно прочитать. Не могли бы вы упомянуть основную идею? - person HelloWorldNoMore; 17.05.2016
comment
@HelloWorldNoMore Принцип разовых выходов из структур управления принят принципиально, а не по данным наблюдений. Но данные наблюдений говорят о том, что предоставление нескольких способов выхода из управляющих структур облегчает точное решение определенных задач и не ухудшает читабельность. Запрещение этого делает код сложнее и с большей вероятностью содержит ошибки. Это относится к широкому кругу программистов, от студентов до авторов учебников. Поэтому мы должны разрешать и использовать несколько выходов, где это уместно. - person btilly; 17.05.2016
comment
Стиль имеет значение: есть несколько способов плавания, но в итоге кроль на груди почему-то побеждает... - person aka.nice; 01.06.2018

Я нахожусь в лагере многократного возврата/возвращения раньше, и я бы лоббировал, чтобы убедить в этом других инженеров. Вы можете приводить отличные аргументы и ссылаться на отличные источники, но, в конце концов, все, что вы можете сделать, это сделать презентацию, предложить компромиссы, прийти к решению, а затем работать в команде, как только получится. (Хотя время от времени возвращаться к этой теме тоже не исключено.)

Это действительно сводится к стилю и, по большому счету, относительно второстепенному. В целом, вы станете более эффективным разработчиком, если сможете адаптироваться к любому стилю. Если это действительно «затрудняет... следование их стилю кодирования», то я предлагаю вам поработать над этим, потому что, в конце концов, вы станете лучшим инженером.

Однажды ко мне пришел инженер и настоял на том, чтобы ему разрешили следовать его собственному стилю кодирования (а у нас был довольно минимальный набор правил). Он сказал, что устоявшийся стиль написания кода режет ему глаза и мешает ему сосредоточиться (думаю, он даже сказал «тошнит».) Я сказал ему, что если он собирается работать над кодом многих людей, а не только он написал, и наоборот. Если он не сможет приспособиться к работе в согласованном стиле, я не смогу его использовать, и, возможно, такой совместный проект ему не подходит. По совпадению, после этого проблем стало меньше (хотя каждый код-ревью по-прежнему был битвой).

person Bert F    schedule 03.02.2011