В контексте программирования, как идиомы отличаются от шаблонов?
Я использую термины попеременно и обычно следую за самым популярным способом, которым я услышал что-то позвонившее или способ, которым это назвали последний раз в текущем разговоре, например, "идиоме подкачки копии" и "шаблоне"одиночка"".
Лучшим различием, которое я могу придумать, является код, который предназначен, чтобы быть скопированным, почти буквально чаще называется шаблоном, в то время как код означал быть взятым, менее буквально чаще называется идиомой, но такой даже не всегда верно. Это, кажется, не больше, чем стилистическое различие или различие в модном словечке. Это соответствует Вашему восприятию того, как термины используются? Существует ли семантическое различие?
Вопреки мысли о том, что шаблоны - это агностический язык, как Пол Грэм , так и Питер Норвиг предположили, что необходимость использования шаблона - это признак того, что в вашем языке отсутствует какая-либо особенность. (В качестве наиболее яркого примера часто выделяют шаблон посетителя)
Обычно я считаю, что основное различие между "шаблонами" и "идиомами" должно быть одним из размеров. Идиома - это что-то маленькое, например, "использовать интерфейс для типа переменной, которая содержит коллекцию", в то время как Patterns, как правило, больше. Я думаю, что небольшие идиомы действительно означают, что они чаще специфичны для языка (пример, который я только что привел, был Java идиомой), но я не думаю, что это их определяющая характеристика.
Идиомы являются определенными для языка.
Узоры являются независимыми от языка принципами разработки, обычно писавшимися на "языке образца" (универсальный шаблон) описание вещей, таких как обстоятельства мотивации, достоинства и недостатки, связанные узоры, и т.д.
Так как если вы поставили 5 программистов в комнате, они, вероятно, даже не согласны с тем, что делают шаблоны, нет реального «правильного ответа».
Одно мнение, которое я слышал один раз и действительно понравился (хотя не может за жизнь меня вспомнить источник), заключается в том, что идиомы - это то, что должно быть на вашем языке, или есть какой-то язык. И наоборот, они являются хитростью, которые мы используем, потому что наш язык не предлагает для них прямую примитию. Например, в Java нет синглтона, но мы можем имитировать его, скрывая конструктор и предлагая метод GetInstance.
Узоры, с другой стороны, более языковые агностики (хотя они часто относятся к определенной парадигме). У вас может быть некоторая инфраструктура для их поддержки (например, весна для MVC), но они не и не будут языковыми конструкциями, и все же вы могли бы понадобиться ними на любом языке этой парадигмы.
Когда люди наблюдают за разработкой программы от на высоком уровне (аналитики, консультанты, академики, методологии Gurus и т. Д.), видят разработчики, делающие то же самое снова и снова в различных ситуациях и средах, а затем разум Из этого наблюдения можно отгонить в шаблон. Узор - это способ «делать вещи» с помощью программных инструментов под рукой, которые представляют собой обычную абстракцию.
Некоторые примеры:
Программирование OO приняло глобальные переменные от разработчиков. Для тех случаев, когда им действительно по-прежнему нужны глобальные переменные, но нужен способ сделать их использование чистых и ориентированных на объект, есть диаграмма синглтон .
Иногда вам необходимо создать новый объект, имеющий один из различных возможных различных типов, в зависимости от некоторых обстоятельств. Уродливый путь может включать в себя заявление о постоянно расширяющейся
. Принятый «элегантный» способ достижения этого способом OO - через «Фабрика» или «Фабричный метод».
Иногда многие разработчики делают вещи определенным образом, но это плохой способ, которым следует поправить. Это может быть формализовано в Antipattern .
Узоры являются высокоуровневым способом делать вещи, и большинство из них независимо от языка. Может ли вы создавать свои объекты с Новым объектом
или Object.New
нематериально на шаблон.
Поскольку шаблоны являются чем-то немного теоретическим и формальным, обычно есть формальный шаблон (хе - перегрузка слов! Давайте скажем «шаблон») для их описания. Такой шаблон может включать в себя:
Идиомы - это что-то гораздо более низкий уровень, и обычно работают в язык языка. Пример:
*dst++ = *src++
В C копирует элемент данных из SRC
на DST
при увеличении указателей на обои; Обычно это делается в петле. Очевидно, вы не увидите эту идиому в Java или Object Pascal.
while <INFILE> { print chomp; }
(примерно цитируется из памяти) IDIOM Perl для обработки входного файла и распечатывать все строки в файле. В этом операторе много неявная переменная использования. Опять же, вы не увидите этот конкретный синтаксис где угодно, кроме как в Perl; Но старый хакер Perl будет быстро посмотреть на утверждение и сразу узнаю, что вы делаете.