[@McConnell2004]

Классы

  • Формирует ли интерфейс класса согласованную абстракцию?
  • Удачное ли имя присвоено классу? Описывает ли оно главную цель класса?
  • Ясно ли интерфейс описывает применение класса?
  • Достаточно ли абстрактен интерфейс класса, чтобы можно было не думать о том, как реализованы его сервисы? Можете ли вы рассматривать класс как “черный ящик”?

Методы

  • Точно ли имя каждого метода описывает выполняемые в нем действия?
  • Выполняет ли каждый метод одну и только одну хорошо определенную задачу?
  • Все ли части метода, которые целесообразно поместить в отдельные методы, сделаны отдельными методами?
  • Очевиден ли и ясен ли интерфейс каждого метода?

Имена данных

  • Достаточно ли описательны имена типов, чтобы помогать документировать объявления данных?
  • Удачно ли названы переменные?
  • Переменные используются только с той целью, в соответствии с которой они названы?
  • Присвоены ли счетчикам циклов более информативные имена, чем i, j и k?
  • Используете ли вы грамотно названные перечисления вместо самодельных флагов или булевых переменных?
  • Используете ли вы именованные константы вместо магических чисел или магических строк?
  • Проводят ли конвенции именования различия между именами типов, перечислений, именованных констант, локальных переменных, переменных класса и глобальных переменных?

Организация данных

  • Используете ли вы дополнительные переменные для пояснения кода?
  • Сгруппированы ли обращения к переменным?
  • Просты ли типы данных? Способствуют ли они минимизации сложности?
  • Обращаетесь ли вы к сложным данным при помощи абстрактных методов доступа (абстрактных типов данных)?

Управление

  • Очевиден ли номинальный путь выполнения кода?
  • Сгруппированы ли связанные операторы?
  • Вынесены ли относительно независимые группы операторов в отдельные методы?
  • Следует ли нормальный вариант после if, а не после else?
  • Просты ли управляющие структуры? Способствуют ли они минимизации сложности?
  • Выполняет ли цикл одну и только одну функцию, как это делает хорошо спроектированный метод?
  • Минимизировали ли вы вложенность?
  • Упростили ли вы булевы выражения путем использования дополнительных булевых переменных, булевых функций и таблиц принятия решений?

Форматирование

  • Характеризует ли форматирование программы ее логическую структуру?

Проектирование

  • Прост ли код? Избегаете ли вы “хитрых” решений?
  • Скрыты ли детали реализации настолько, насколько возможно?
  • Стараетесь ли вы писать программу в терминах проблемной области, а не структур вычислительной техники или языка программирования?