[@McConnell2004]
Входит в Код ревью Код ревью
Ключевые моменты
- Интерфейс класса должен формировать согласованную абстракцию. Многие проблемы объясняются нарушением одного этого принципа.
- Интерфейс класса должен что-то скрывать — особенности взаимодействия с системой, аспекты проектирования или детали реализации.
- Включение обычно предпочтительнее, чем наследование, если только вы не моделируете отношение “является”.
- Наследование — полезный инструмент, но оно повышает сложность, что противоречит Главному Техническому Императиву Разработки ПО, которым является управление сложностью.
- Классы — главное средство управления сложностью. Уделите их проектированию столько времени, сколько нужно для достижения этой цели.
@abstract-data-types:Абстрактные типы данных
- Обдумали ли вы классы программы как абстрактные типы данных, оценив их интерфейсы с этой точки зрения?
@abstraction:Абстракция
- Имеет ли класс главную цель?
- Удачное ли имя присвоено классу? Описывает ли оно главную цель класса?
- Формирует ли интерфейс класса согласованную абстракцию?
- Ясно ли интерфейс описывает использование класса?
- Достаточно ли абстрактен интерфейс, чтобы вы могли не думать о реализации класса? Можно ли рассматривать класс как “черный ящик”?
- Достаточно ли полон набор сервисов класса, чтобы другие классы могли не обращаться к его внутренним данным?
- Исключена ли из класса нерелевантная информация?
- Обдумали ли вы разделение класса на классы-компоненты? Разделен ли он на максимально возможное число компонентов?
- Сохраняется ли целостность интерфейса при изменении класса?
@encapsulation:Инкапсуляция
@inheritance:Наследование
- Используется ли наследование только для моделирования отношения “является”, т.е. придерживаются ли производные классы принципа подстановки Лисков?
- Описана ли в документации класса стратегия наследования?
- Избегают ли производные классы “переопределения” непереопределяемых методов?
- Перемещены ли общие интерфейсы, данные и формы поведения как можно ближе к корню дерева наследования?
- Не слишком ли много уровней включают иерархии наследования?
- Все ли данные — члены базового класса сделаны закрытыми, а не защищенными?
@other:Другие вопросы реализации
- Класс содержит около семи элементов данных-членов или меньше?
- Минимально ли число встречающихся в классе непосредственных и опосредованных вызовов методов других классов?
- Сведено ли к минимуму сотрудничество класса с другими классами?
- Все ли данные-члены инициализируются в конструкторе?
- Спроектирован ли класс для использования полного, а не ограниченного копирования, если нет убедительной причины создания ограниченных копий?
@language-specifics:Аспекты, специфические для языков
- Изучили ли вы особенности работы с классами, характерные для выбранного языка программирования?