С подозрением относиться к классам, у которых есть только один экземпляр
tl;dr - Что означает приведенный ниже абзац?
С подозрением относитесь к классам, у которых есть только один экземпляр. Один экземпляр может указывать на то, что дизайн смешивает объекты с классами. Подумайте, можете ли вы просто создать объект вместо нового класса. Может ли вариант производного класса быть представлен в данных, а не как отдельный класс? Шаблон Singleton является одним заметным исключением из этого руководства.
Макконнелл, Стив (2004-06-09). Код завершен (2-е издание)
Расширенная версия:
В настоящее время я читаю Code Complete, и у меня возникают проблемы с пониманием вышеупомянутого абзаца. Для контекста, это из главы 6 под руководством для наследования. Сначала я подумал, что это был совет против использования синглетонов, но к моменту окончания абзаца я явно оказался неправ.
Я просто не могу понять, что автор пытается пройти через мой толстый череп. Например, я не знаю, что он подразумевает под дизайном, путающим объекты с классами, и что это значит в контексте наличия класса только с одним экземпляром. Помогите!
1 ответ
Формулировка там довольно запутанная, но я полагаю, что это означает, что иногда начинающий программист может создать совершенно новый тип только для того, чтобы создать один его объект. В качестве особенно вопиющего примера:
struct Player1Name
{
string data;
};
Там мы могли бы просто использовать string player1_name;
(или даже совокупность для нескольких игроков) без создания совершенно нового типа, поэтому возникает путаница при попытке использовать классы для моделирования того, что уже могут делать новые объекты (новые экземпляры существующих типов).
В таком случае разработчик может спамить кодовую базу сотнями новых пользовательских типов данных и, возможно, массивными иерархиями наследования без возможности повторного использования одного класса за одним экземпляром для каждой новой вещи, которую он хочет создать, когда существующих классов, как правило, достаточно.
Реальная проблема не в том, что классы создаются один раз, а в том, что их дизайн настолько узок, что его стоит создавать только один раз.
Классы обычно предназначены для моделирования отношений один-ко-многим с их экземплярами (объектами). Предполагается, что они, по крайней мере, несколько более применимы, чем один экземпляр этого класса. Грубо говоря, класс должен моделировать Dog
, а не конкретная собака вашего соседа, Spark
, Это должно моделировать Rectangle
не точный Rectangle42x87
это 4,2 метра на 8,7 метра. Если вы проектируете вещи для создания экземпляров один раз, вы, вероятно, проектируете их слишком узко и, возможно, у вас есть существующие вещи, которые вы можете использовать вместо них.
Новый тип данных обычно предназначен для решения, так сказать, класса (категории) проблем, а не одного очень точного, который требует только одного экземпляра этого класса. В противном случае ваши проекты классов будут однократными сделками, которые будут просто поверхностно создавать классы повсюду, чтобы решать очень индивидуальные проблемы, не имея возможности для более широкого применения.
Синглтон является исключением из правила, поскольку он не использует классы в этом обычном объектно-ориентированном виде. Там он намеренно собирается создать единый экземпляр с отложенным построением и глобальной точкой доступа. Таким образом, не случайно и недопонимание объектно-ориентированного проектирования разработчик создал класс, предназначенный для реализации один раз. Это, так сказать, очень обдуманное и осознанное дизайнерское решение, а не неправильное понимание того, как использовать инструменты.