[@McConnell2004]

Входит в Код ревью Код ревью

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

  • Интерфейс класса должен формировать согласованную абстракцию. Многие проблемы объясняются нарушением одного этого принципа.
  • Интерфейс класса должен что-то скрывать — особенности взаимодействия с системой, аспекты проектирования или детали реализации.
  • Включение обычно предпочтительнее, чем наследование, если только вы не моделируете отношение “является”.
  • Наследование — полезный инструмент, но оно повышает сложность, что противоречит Главному Техническому Императиву Разработки ПО, которым является управление сложностью.
  • Классы — главное средство управления сложностью. Уделите их проектированию столько времени, сколько нужно для достижения этой цели.

@abstract-data-types:Абстрактные типы данных

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

@abstraction:Абстракция

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

@encapsulation:Инкапсуляция

см. Инкапсуляция в ООП

@inheritance:Наследование

  • Используется ли наследование только для моделирования отношения “является”, т.е. придерживаются ли производные классы принципа подстановки Лисков?
  • Описана ли в документации класса стратегия наследования?
  • Избегают ли производные классы “переопределения” непереопределяемых методов?
  • Перемещены ли общие интерфейсы, данные и формы поведения как можно ближе к корню дерева наследования?
  • Не слишком ли много уровней включают иерархии наследования?
  • Все ли данные — члены базового класса сделаны закрытыми, а не защищенными?

@other:Другие вопросы реализации

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

@language-specifics:Аспекты, специфические для языков

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