Существует длинный скучный технический отчет ISO / IEC 24772: 2013 с длинным скучным названием: «Информационные технологии - Языки программирования - Руководство по предотвращению уязвимостей в языках программирования путем выбора и использования языков». Он преследует две различные цели: во-первых, сократить численность инженеров, утомив их до смерти, и во-вторых, спасти жизни. Он в первую очередь применяется в критически важных областях безопасности, таких как автоматизация атомных электростанций, авиация, автомобилестроение, медицинское оборудование и т. Д. Везде, где цена глупой ошибки больше, чем яростная обратная связь от вашего клиента.

И среди всего скучного, что в нем содержится, есть одно особенно глупое правило:

Используйте последний оператор else или комментарий, объясняющий, почему последний оператор else не нужен во всех операторах if и else if.

Что ж, это очевидно глупо: он говорит вам делать дополнительную работу без всякой пользы. Просто напишите здесь что-то вроде «// this 'if' case doesn’t need 'else'», и это не поможет, не так ли?

Оказывается, было бы. Я соблюдаю это правило с 2013 года, и было много случаев, когда простая мысль о конечном if помогала мне написать лучший алгоритм. Очень легко упустить из виду правильную обработку в худшем случае, когда вы слишком сконцентрированы на том, что делать, когда оператор if соответствует требованиям. Простое отношение к «пустому» else как к подозрительному предотвращает логические ошибки на самой ранней стадии.

Все мы знаем, что это худшие ошибки; и это лучший этап.

Например, в последнее время я работал над устройством чтения сложных форматов изображений. Проще говоря, это выглядит так:

read integer gray values from the file;
convert integers read from the file to floating point numbers;
if required, make sign compensation;
if required, make rescale;
if required, invert gray value;
...
convert floating points to integers again.

Очевидно, что ни один из этих if не нуждается в else. Но вы знаете, что? Все вместе - делаем. Если ни одно из этих условий не выполняется, нам не нужно выполнять преобразование данных с плавающей запятой. Я провел небольшое исследование и выяснил, что такие случаи вовсе не редкость. Фактически, некоторые из наших самых тяжелых примеров уже представлены в виде файла и не требуют никакой постобработки. Мне нужно было добавить всего пару строк, чтобы учесть это.

read integer gray values from the file;
if any processing required,
  convert integers read from the file to floating point numbers;
  if required, make sign compensation;
  if required, make rescale;
  if required, invert gray value;
  ...
  convert floating points to integers again.
else
  // output values are the same as in the file

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

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

P. S. Кстати, вот хороший источник общедоступных стандартов и отчетов ISO / IEC, заполненных глупыми правилами вроде этого: http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html.