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


16

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


12
Одержимость моделями - это в некотором роде анти-паттерн
Анто

1
С последним пунктом я частично согласен. Я назову несколько шаблонов, но некоторые шаблоны в учебниках кажутся незначительными вариантами друг друга, и обычно интересным моментом является то, как вы в любом случае адаптируете шаблон для соответствия конкретному случаю, поэтому вы, конечно, не должны быть догматичными.
Steve314

1
Вы программируете на динамическом языке? Многие шаблоны, на которые ссылаются люди, - это способы обойти ограничения в Java.
Джоннип

Кроме того, рассмотрение каждой проблемы отдельно не зависит от размера команды. Например, в рамках MVC модели часто нормализуются, но представления могут иметь дело с производными данными. Есть несколько способов справиться с этим, но люди не должны решать эту проблему (потенциально по-разному) каждый раз, когда она возникает. И другие, читающие код, не должны выяснять, как проблема X была решена в этом случае, в отличие от всех остальных.
Джоннип

Ответы:


19

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

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

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


1
Например, знаменитые объектно-ориентированные шаблоны «банды четырех» были составлены на основе опыта авторов и людей, с которыми они общались. Причина, по которой некоторые шаблоны имеют несколько имен - они были независимо заново изобретены и названы несколько раз. Большинство программистов, естественно, изобретут несколько шаблонов, оставленных для их собственных устройств, и, конечно, несколько антипаттернов.
Steve314

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

9

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

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

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


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

3

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

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

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

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

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

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


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.