[@McConnell2004]
Классы
- Формирует ли интерфейс класса согласованную абстракцию?
- Удачное ли имя присвоено классу? Описывает ли оно главную цель класса?
- Ясно ли интерфейс описывает применение класса?
- Достаточно ли абстрактен интерфейс класса, чтобы можно было не думать о том, как реализованы его сервисы? Можете ли вы рассматривать класс как “черный ящик”?
Методы
- Точно ли имя каждого метода описывает выполняемые в нем действия?
- Выполняет ли каждый метод одну и только одну хорошо определенную задачу?
- Все ли части метода, которые целесообразно поместить в отдельные методы, сделаны отдельными методами?
- Очевиден ли и ясен ли интерфейс каждого метода?
Имена данных
- Достаточно ли описательны имена типов, чтобы помогать документировать объявления данных?
- Удачно ли названы переменные?
- Переменные используются только с той целью, в соответствии с которой они названы?
- Присвоены ли счетчикам циклов более информативные имена, чем
i
,j
иk
? - Используете ли вы грамотно названные перечисления вместо самодельных флагов или булевых переменных?
- Используете ли вы именованные константы вместо магических чисел или магических строк?
- Проводят ли конвенции именования различия между именами типов, перечислений, именованных констант, локальных переменных, переменных класса и глобальных переменных?
Организация данных
- Используете ли вы дополнительные переменные для пояснения кода?
- Сгруппированы ли обращения к переменным?
- Просты ли типы данных? Способствуют ли они минимизации сложности?
- Обращаетесь ли вы к сложным данным при помощи абстрактных методов доступа (абстрактных типов данных)?
Управление
- Очевиден ли номинальный путь выполнения кода?
- Сгруппированы ли связанные операторы?
- Вынесены ли относительно независимые группы операторов в отдельные методы?
- Следует ли нормальный вариант после
if
, а не послеelse
? - Просты ли управляющие структуры? Способствуют ли они минимизации сложности?
- Выполняет ли цикл одну и только одну функцию, как это делает хорошо спроектированный метод?
- Минимизировали ли вы вложенность?
- Упростили ли вы булевы выражения путем использования дополнительных булевых переменных, булевых функций и таблиц принятия решений?
Форматирование
- Характеризует ли форматирование программы ее логическую структуру?
Проектирование
- Прост ли код? Избегаете ли вы “хитрых” решений?
- Скрыты ли детали реализации настолько, насколько возможно?
- Стараетесь ли вы писать программу в терминах проблемной области, а не структур вычислительной техники или языка программирования?