Есть ли мыслимый шаблон проектирования для какой-либо объектно-ориентированной программы? Я спрашиваю об этом, потому что недавно я увидел реализацию Door
класса с Lock
. Это было частью теста, и в ответ было сказано, что код соответствует шаблону Null Object:
class Lock
{
public:
virtual void close() = 0;
virtual void open() = 0;
virtual bool is_open() const = 0;
virtual ~Lock() { }
};
class DummyLock
: public Lock
{
private:
DummyLock();
DummyLock(const DummyLock&) = delete;
DummyLock& operator=(const DummyLock&) = delete;
private:
void close() { }
void open() { }
bool is_open() const { return true; }
public:
static DummyLock m_instance;
};
class Door
{
public:
Door() : m_lock(DummyLock::m_instance) { }
Door(Lock &lock) : m_lock(lock) { }
public:
Lock& get_lock() const { return m_lock; }
private:
Lock &m_lock;
};
Это заставило меня задуматься: этот код следует хорошему шаблону проектирования, даже если описание очень простое (этот класс разрабатывает класс дверей с замком), поэтому, если я пишу более сложный код, всегда должен быть какой-то шаблон проектирования, который я я следую?
Ответы:
Дорогой Бог НЕТ!
Я имею в виду, вы можете пойти дальше и сказать, что любой случайный код следует некоторому случайному шаблону XYZ, но это не более полезно, чем я, претендующий на звание короля моего компьютерного стула. Никто на самом деле не знает, что это значит, и даже те, кто это делает, не будут точно уважать мои требования.
Шаблоны проектирования являются средством коммуникации, так что программисты могут рассказать другим программистам, что сделано или что нужно сделать, не тратя много времени на повторение. И поскольку эти вещи возникают несколько раз, они полезны для программистов, которые учат: «Эй, создание XYZ всегда кажется подходящим, потому что это хорошо / полезно».
Они не заменяют вам необходимости думать самостоятельно, подгонять шаблоны для уникальной проблемы перед вами или обрабатывать все неизбежные вещи, которые не укладываются в хорошие ведра.
источник
the_cult
(тм) так же опасно.Нет.
Вот что «Банда четырех» (которая изначально популяризировала шаблоны проектирования) должна была сказать об этом в своей книге :
Пример, который вы показываете, на самом деле ничего не делает (я не думаю, что это было предназначено, я думаю, что это было просто предназначено для примера). Само по себе, он не нуждается в шаблоне нулевого объекта. В контексте более крупной программы это возможно.
Неправильный подход состоит в том, что если он был помечен как «шаблон проектирования», он должен быть хорошим, а затем искать больше мест, в которые можно втиснуть больше шаблонов. Используйте их, когда они соответствуют программе и фактически решают проблему для вас.
источник
Нет. Шаблоны проектирования - это просто шаблоны в отношениях между объектами. Другими словами, отношения, которые используются и используются повторно достаточно часто, чтобы кто-то сказал: «Эй, мы, кажется, делаем это много, давайте дадим ему имя». Список шаблонов проектирования не был определен сразу в начале ООП, а затем передан GOF ! Они были обнаружены и в конечном итоге задокументированы, а затем популяризированы книгой.
Тем не менее, большая часть преимуществ шаблонов проектирования заключается в том, что они позволяют легче думать о разработке программного обеспечения на более высоком уровне. Они позволяют вам не беспокоиться о деталях реализации и больше думать о картине. В этом смысле они освобождают вас от мелочей, но они также могут ограничивать вас так же, как то, как вы выражаете себя, может быть ограничено словами, которые вы знаете. Таким образом, может наступить время , когда есть шаблон дизайна для большинства из того, что вы делаете просто потому , что модели , которые вы знаете , являются условия , в которых вы думаете. Держите глаза открытыми на случаи, когда вы, возможно, злоупотребляете шаблоном, и где вам может потребоваться более глубоко подумать о лучших способах выполнения действий.
Кроме того, следует понимать, что на практике вы часто не реализуете данный шаблон проектирования в такой степени, как распознаете шаблон в некотором существующем коде, например в объектной среде. Знание общих шаблонов проектирования значительно облегчает изучение того, как должна использоваться среда, потому что вы можете видеть отношения между классами в терминах, которые вы уже понимаете.
источник
У шаблонов дизайна есть два преимущества
Цели каждой программы должны быть
Это все, как говорится, обратите внимание, что каждая ссылка на шаблоны проектирования ОО "они просто хороши в работе". Они не идеальны, но они очень эффективно заполняют нишу. Используйте их, когда они работают, избегайте их, когда они не работают.
В качестве примера «сложного кода», как вы упомянули в своем вопросе, возьмите язык сценариев, который я написал. В основном это ОО с шаблонами дизайна везде. Тем не менее, когда дело дошло до написания сборщика мусора, я бесцеремонно отбросил все притворства оО, потому что конкретные вещи, которые мне нужно было сделать, были лучше смоделированы как хорошие старомодные удары битами. Во всей этой вещи не было шаблона OO до тех пор, пока он не пришел к написанию финализаторов, где OO снова стал полезной моделью. Без каких-либо помпезностей и обстоятельств код неожиданно снова вернулся к использованию методов ОО.
Используйте шаблоны дизайна всякий раз, когда они делают ваш продукт лучше; избегайте их, когда они делают ваш продукт хуже.
источник
Я немного сломаю тенденцию, потому что ответ более тонкий, чем другие ответы. Каждый класс, который вы пишете, не должен использовать шаблон проектирования, но большинство нетривиальных программ, которые вы пишете, вероятно, должны.
Нетривиальная программа без шаблонов проектирования означает:
Оба сценария крайне маловероятны, без обид.
Это не означает, что шаблон дизайна должен управлять вашим дизайном, или что вы должны вставить его без разбора, потому что вы думаете, что это будет выглядеть плохо, если вы этого не сделаете. Неправильный шаблон дизайна хуже, чем ничего.
Это означает, что вы должны смотреть на отсутствие шаблонов проектирования в вашей программе как на запах кода. Что-то, что заставляет вас взглянуть еще раз и пересмотреть, если ваш дизайн не может быть чище. Если в этот момент вы решите исключить шаблоны проектирования из программы, это должно быть осознанное, обоснованное решение, а не случайность.
Например, вы не говорите: «Мне нужно смоделировать дверь и замок, какой шаблон дизайна мне использовать?» Однако, если вы спроектировали его сначала без использования каких-либо шаблонов проектирования, это впоследствии должно побудить вас сказать что-то вроде: «У меня ужасно много пустых проверок в этом коде, мне интересно, есть ли шаблон проектирования, который мог бы помочь управлять ими».
Увидеть разницу? Это тонкое, но важное различие.
источник
Сломанный вопрос. Позвольте мне дать вам новое определение шаблона проектирования, которое устранит большой ущерб, нанесенный GoF: шаблон проектирования - это хорошая практика кодирования . Вот и все.
Любой достаточно сложный модуль будет иметь несколько шаблонов проектирования. Каждый раз, когда вы кешируете, это, вероятно, шаблон с наименьшим весом, но я не собираюсь отменять вашу степень программирования, если вы не называете это так. Каждый раз, когда у вас есть обратный вызов, вы попадаете в какую-то модель события / огня / обратного вызова. и т.д. Если у вас есть слово «статический», у вас есть синглтон. Если у вас есть статический конструктор, у вас есть фабричный шаблон. Если ресурс передан вашему модулю, вы используете внедрение зависимостей.
«Шаблон дизайна» - это не пользующийся популярностью термин, не популярный в GoF, из-за которого все звучит так, будто все шаблоны находятся на одном уровне, или вам следует использовать рекомендованный врачом от 3 до 5 для каждого класса. Каждый раз, когда вы делаете что-то правильно, что кто-то сделал правильно, это шаблон дизайна . Например, A
for(;;)
- это общий шаблон, используемый для представления бесконечного цикла.Вы не должны пытаться выучить кучу шаблонов дизайна. Знание программирования не индексируется шаблонами проектирования! Скорее вы должны научиться писать хороший код , читая книги, блоги и посещая конференции в своей области. Например, если вы уже используете внедрение зависимостей, но просто не пометили его, вам может быть полезно всегда использовать DI или инфраструктуру IoC. Или, если вы пытаетесь правильно кодировать события и обратные вызовы, изучите Haskell, чтобы вы были знакомы с функциональными шаблонами проектирования, и это стало легко.
И если весь ваш класс читается как одна большая вещь, которую кто-то другой сделал правильно, почему вы изобретаете велосипед? Просто используйте их вещи.
источник
for(;;)
идиоматика? Это, вероятно, не лучший пример того, что кто-то сделал "правильно".while(true)
(илиwhile(1)
) в C, C ++, Java или C # за мои 20 с лишним лет программирования.Вы всегда должны следовать принципам проектирования ОО (например, модульность, скрытие информации, высокая сплоченность и т. Д.). Шаблоны проектирования - это относительно утонченная ниша принципов проектирования ОО, особенно если учесть принцип KISS .
Шаблоны - это решение общих проблем дизайна. Эти проблемы происходят из одного из двух мест (или из обоих): проблемное пространство (например, программное обеспечение для управления человеческими ресурсами в компании) и пространство решения . ОО-программы - это экземпляр в пространстве решений (например, один из многих способов, которыми вы могли бы разработать ОО-программу для облегчения управления персоналом).
Это не так легко узнать, когда использовать шаблон. Некоторые шаблоны являются низкоуровневыми, ближе к кодированию и пространству решения (например, Singleton, Null object, Iterator). Другие мотивированы требованиями в проблемном пространстве (например, шаблон Команды для поддержки отмены / повторения, Стратегия для поддержки нескольких типов файлов ввода / вывода).
Многие шаблоны исходят из необходимости поддержки изменений программного обеспечения в будущем. Если вам никогда не нужно вносить эти изменения, шаблон может быть чрезмерным. Примером может служить использование шаблона адаптера для работы с существующей внешней базой данных персонала. Вы решили применить Adapter, потому что текущая база данных работает с Oracle, и вы можете захотеть поддерживать NoSQL в будущем. Если NoSQL никогда не появится в вашей организации, этот код адаптера вполне может оказаться бесполезным. Смотри ЯГНИ . Поддержка вариаций, которые никогда не появляются, неправильно использует шаблон проектирования.
источник
Шаблоны - это общие решения общих проблем. Мы всегда следуем некоторым шаблонам, шаблоны от GoF обращаются к наиболее повторяющимся. Это, чтобы иметь общее понимание и общий подход, известный разработчикам программного обеспечения.
Тем не менее, мой ответ - нет, но да, вы всегда следуете какой-то своей схеме. Как правильно говорит GoF-
Отличная цитата.
источник
Когда я пишу код, я не планирую намеренно использовать столько шаблонов проектирования, сколько смогу. Но, я думаю, подсознательно, когда у меня возникает проблема с кодированием, один из шаблонов проектирования кажется подходящим, и я просто использую его. И иногда ничего не подходит. Что для меня важнее, так это написание кода, который выполняет свою работу, его легко поддерживать и расширять.
Вот статья о применении принципов OOD с использованием шаблонов проектирования, а также примеры кода (на C ++). Он показывает, как и когда применять некоторые шаблоны проектирования для написания чистого кода.
источник