Закоулки мозга

[@McConnell2004]

Числа в общем

  • Не содержит ли код магические числа?
  • Предупреждаются ли в коде ошибки деления на ноль?
  • Очевидны ли преобразования типов?
  • Если переменные двух разных типов используются в одном выражении, будет ли оно вычислено так, как вы это предполагаете?
  • Не происходит ли сравнение переменных разных типов?
  • Компилируется ли программа без предупреждений компилятора?

Целые числа

  • Работают ли выражения, содержащие целочисленное деление так, как это предполагалось?
  • Предупреждаются ли в целочисленных выражениях проблемы целочисленного переполнения?

Числа с плавающей запятой

  • Не содержит ли код операции сложения и вычитания слишком разных по величине чисел?
  • Предупреждаются ли в коде ошибки округления?
  • Не выполняется сравнение на равенство чисел с плавающей запятой?

Символы и строки

  • Не содержит ли код магических символов и строк?
  • Свободны ли операции со строками от ошибки потери единицы?

Логические переменные

  • Используются ли в программе дополнительные логические переменные для документирования проверок условия?
  • Используются ли в программе дополнительные логические переменные для упрощения проверок условия?

Перечислимые типы

  • Используются ли в программе перечислимые типы вместо именованных констант ради их улучшенной читабельности, надежности и модифицируемости?
  • Используются ли перечислимые типы вместо логических переменных, если все значения переменной не могут быть переданы с помощью true и false?
  • Проверяются ли некорректные значения перечислимых типов в условных операторах?
  • Зарезервирован ли первый элемент перечислимого типа как недопустимый?

Перечислимые константы

  • Используются ли в программе именованные константы вместо магических чисел для объявления данных и границ циклов?
  • Используются ли именованные константы последовательно, чтобы одно значение не представлялось в одном месте константой, а в другом — литералом?

Массивы

  • Находятся ли все индексы массива в его границах?
  • Свободны ли ссылки на массив от ошибок потери единицы?
  • Указаны ли все индексы многомерных массивов в правильном порядке?
  • В правильном ли порядке используются переменные-индексы во вложенных циклах, не происходит ли пересечения индексов?

Создание типов

  • Используются ли в программе отдельные типы для каждого вида данных, который может измениться?
  • Ориентируются ли имена типов на реальные сущности, которые эти типы представляют, а не на типы языка программирования?
  • Достаточно ли наглядны имена типов, чтобы помочь документированию объявлений данных?
  • Не произошло ли переопределение предопределенных типов?
  • Рассматривался ли вопрос создания нового класса вместо простого переопределения типа?

Ключевые моменты

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