Что такое шаблонное программирование?

16

Может кто-нибудь объяснить одержимость шаблонами и анти-шаблонами в программировании? Я спрашиваю, потому что я понятия не имею, что означает любой из паттернов. Когда я сталкиваюсь с задачей программирования, я немного думаю о проблеме, записываю некоторые структуры данных, которые, на мой взгляд, будут актуальны, создаю прототип решения, выделяю некоторые модули и выполняю итерации. Нигде в процессе я не думаю: «О, мне нужен шаблон FunkyLookyTastic здесь».

davidk01
источник
12
Одержимость моделями - это в некотором роде анти-паттерн
Анто
1
С последним пунктом я частично согласен. Я назову несколько шаблонов, но некоторые шаблоны в учебниках кажутся незначительными вариантами друг друга, и обычно интересным моментом является то, как вы в любом случае адаптируете шаблон для соответствия конкретному случаю, поэтому вы, конечно, не должны быть догматичными.
Steve314
1
Вы программируете на динамическом языке? Многие шаблоны, на которые ссылаются люди, - это способы обойти ограничения в Java.
Джоннип
Кроме того, рассмотрение каждой проблемы отдельно не зависит от размера команды. Например, в рамках MVC модели часто нормализуются, но представления могут иметь дело с производными данными. Есть несколько способов справиться с этим, но люди не должны решать эту проблему (потенциально по-разному) каждый раз, когда она возникает. И другие, читающие код, не должны выяснять, как проблема X была решена в этом случае, в отличие от всех остальных.
Джоннип

Ответы:

19

Шаблон - это общий подход к решению общей проблемы; Не больше, не меньше. Зная и понимая их, вы можете использовать опыт других людей, чтобы направить вас к решению, которое, как было показано, работает хорошо, избежать ошибок, с которыми встречались в прошлом, и обсудить решение, используя терминологию, знакомую другим, кто знать эту модель.

Конечно, вы можете придумать хорошее решение без явного использования шаблона, и в равной степени вы можете найти плохое решение, пытаясь применить шаблон, который не соответствует вашей конкретной проблеме. Я думаю, что «навязчивая идея», которую вы наблюдаете, обычно исходит от людей, которые только что открыли эту концепцию, и думают, что она довольно сильна, чем на самом деле. Большинство людей быстро узнают их за то, что они есть: полезный инструмент, а не волшебная пуля.

С другой стороны, антишаблоны - это обычно наблюдаемые поведения, которые имеют тенденцию снижать качество кода. Опять же, полезно знать и понимать некоторые из них, чтобы вы могли избежать такого поведения и попытаться исправить его (с аргументированными аргументами), когда вы наблюдаете это в других. Некоторые описывают чрезмерное использование шаблонов как анти-шаблон.

Майк Сеймур
источник
1
Например, знаменитые объектно-ориентированные шаблоны «банды четырех» были составлены на основе опыта авторов и людей, с которыми они общались. Причина, по которой некоторые шаблоны имеют несколько имен - они были независимо заново изобретены и названы несколько раз. Большинство программистов, естественно, изобретут несколько шаблонов, оставленных для их собственных устройств, и, конечно, несколько антипаттернов.
Steve314
3
«одержимость», которую вы наблюдаете, обычно исходит от людей, которые только что открыли эту концепцию - в основном это правда, ИМХО. Я полагаю, что есть те, кто считает, что вы должны подойти к проблеме с готовыми шаблонами ... и если ваше решение не содержит очевидных шаблонов, то ваше решение неверно ... нам следует потратить время на изучение шаблонов, как используются, а когда и когда не использовать их - они являются частью нашего ящика для инструментов
IAbstract
9

Шаблоны - это как богатый опыт программистов в кулинарной книге, так и полезный способ общения программистов.

Как показывают другие ответы, шаблоны действительно являются общими решениями общих проблем. Преимущество заключается в том, что вы часто можете получить более эффективные решения, используя существующий шаблон или обнаружив возможные ловушки, прежде чем приступить к кодированию.

Другое преимущество, когда вы говорите с кем-то о своем коде. Шаблоны - это другой тип жаргона, который объединяет длинные описания в несколько слов. Попробуйте объяснить «тогда у нас есть фабричный наблюдатель», не обращаясь к шаблонам. Вы можете сделать это, но это занимает много времени.


источник
2
+1 за общение. Повседневная рутина проходит намного более гладко, когда все находятся на одной странице и имеют общий лексикон.
День
3

Большинство разработчиков будут недовольны любой новой парадигмой или методологией, которая появляется. Я сделал это, когда впервые услышал о шаблонах проектирования. Шаблоны дизайна - это то, что предлагает название: дизайн или шаблон для создания классов и моделирования их поведения и взаимодействия предсказуемым образом.

Посмотрите на дома. У них есть некоторые сходства. В каждом доме есть гостиная, кухня, спальня, ванная комната, туалет как минимум. Никто не построит дом без ванной, верно? Квартиры имеют рисунок, который отличается от бунгало. У замков совсем другая картина. Одежда тоже имеет узоры. Куртка и формальная рубашка имеют одинаковый базовый дизайн, но ведут себя по-разному: вы не наденете ковбойскую куртку для интервью. Точно так же классы и их действия могут быть сгруппированы согласно их поведению и дизайну. Глядя на общие элементы в их поведении, вы получаете шаблоны проектирования для классов.

Шаблоны проектирования в моем понимании важны только в том случае, если первостепенное значение имеют возможность повторного использования и расширения. Если вы создаете небольшие приложения (скажем, менее 10 классов), они могут вам вообще не понадобиться. Но крупные проекты, особенно те, в которых работают большие команды и которые имеют длительные циклы обслуживания и добавления функций, определенно нуждаются в шаблонах. Это даже не вариант в больших проектах.

Взгляните на некоторые онлайн-учебники по шаблонам. В Википедии есть хороший набор статей. Этот сайт тоже хорош: http://sourcemaking.com/ . Если вы опытный программист, вы обнаружите, что вы столкнулись с несколькими шаблонами, возможно, даже реализовали нечто подобное сами, не зная этого под определенным именем.

Не игнорируйте их вообще! Вы можете найти их полезными в будущем, если не сейчас. Ключом к непредсказуемому подходу к шаблонам проектирования является вопрос: «Что произойдет, если я не буду использовать шаблоны проектирования?» Паттерны не подразумеваются как «лекарства» (хотя вы можете использовать их как лекарство от проблемы); скорее они воплощают изречение «профилактика лучше лечения».

Тем не менее, я бы предостерег от одержимости реализацией шаблонов везде и всегда, когда вы видите небольшой предлог для его использования. Я столкнулся с этой проблемой в одном проекте, где архитектор был убежден, что без DP проект был бы полной катастрофой. У нас было групповое собрание, на котором инженеры перешли к дизайну и отметили, что многие рекомендованные им шаблоны не будут иметь никакого смысла, кроме как показывать «вау взгляд на прекрасные образцы». Потребовалось много убедительных и некоторых переговоров, чтобы сократить количество мест, где шаблоны использовались только для нужд.

DPD
источник
1

Люди, которые ответили, правы в терминах «программирования на основе шаблонов», как обычно думают. У меня есть немного другое определение, которое я считаю более релевантным для того, что я делаю, и я склонен использовать «программирование на основе шаблонов» для описания подхода с использованием плагинов, а не подхода к планированию.

Поскольку я программирую плагины jQuery, облачный плагин CMS и плагины eCommerce, «программирование на основе шаблонов» с этой точки зрения означает изучение основной технологии и существующих вариантов использования, а также попадание в наиболее статистически значимые из них. В частности, плагины должны быть основаны на шаблонах, чтобы они хорошо вписывались в контекст программирования.

Однако лучше всего применять шаблон ПОСЛЕ ТОГО, КАК вы видите действительные варианты использования для нескольких проектов, поэтому он является статистически действительным для повторного использования.

Джейсон
источник