Ваш «вернуться ложным» также называют GuardClause - как объясняет Уорд Каннингем:
... [G] uards подобны утверждениям в том, что как защитить последующий код из особых случаев.Охранники отличаются от от утверждений тем, что они производят материальный вклад в логику метода и, следовательно, не могут быть безопасны опущены как часть оптимизации. I заимствовал термин охранник от EwDijkstra при именовании этого шаблона.
Если ваше защитное предложение имеет любую сложность, часто бывает полезно инкапсулировать с помощью BouncerPattern.
Как указывает Уорд, вы должны использовать утверждения, когда код может быть безопасно опущен. Если у вас есть ключевое слово assert
на вашем языке, компиляторы часто снимают утверждения из производственного кода.
Сегодня мы понимаем, что в большинстве случаев не рекомендуется вводить утверждения в ваш код. Классическое разделение проблем. Отдельные утверждений от кода и инкапсулируют их в единичном тесте. Это устраняет сложность перекомпиляции вашего кода без распространения утверждений (вы не будете распространять свои тесты ...), а также дает вам набор тестов, которые можно запускать непрерывно, чтобы отслеживать регрессии и рефакторинг дисков.
Другие ответы были упомянуты Дизайн по контракту, который полностью исключает эти проблемы из вашего кода и в объявленные предварительные условия, постусловия и инварианты, которые применяются в отношении кода, о котором идет речь. Если вы часто это делаете, вы можете рассмотреть возможность изучения структуры Design by Contract для вашего языка.
Да, это моя точка зрения. Я использую assert() для проверки инвариантов в моей программе. Когда такие инварианты не соблюдаются, поскольку вызов assert генерирует coredump для моего приложения (при его отладке), я уверен, что не пропущу такую проблему. Кроме того, я ожидаю, что последующие «разработчики» заметят, что что-то не так, когда приложение рушится ... Хотя простой оператор возврата может в конечном итоге привести к дампу некоторых строк в файле, которые разработчик мог бы избежать. Я не имею в виду, что вы можете избежать if() тестов. Я просто хочу сказать, что assert() - это способ гарантировать, что разработчики были сильно уведомлены о возникшей проблеме. –