Идиома против образца - PullRequest
14 голосов
/ 09 января 2010

В контексте программирования, чем идиомы отличаются от паттернов ?

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

Лучшее отличие, которое я могу придумать, - это код, предназначенный для почти буквального копирования, его чаще называют pattern , в то время как код, предназначенный для менее буквального восприятия, чаще называют idiom , но это не всегда так. Кажется, это не больше, чем стилистическая разница или модное различие. Это соответствует вашему восприятию того, как используются термины? Есть ли смысловая разница?

Ответы [ 4 ]

11 голосов
/ 09 января 2010

Идиомы зависят от языка.

Шаблоны - это независимые от языка принципы проектирования, обычно написанные на «языке шаблонов» (единый шаблон), описывающие такие вещи, как мотивирующие обстоятельства, плюсы и минусы, связанные шаблоны и т. Д.

7 голосов
/ 10 января 2010

Когда люди, наблюдающие за разработкой программ из On High (аналитики, консультанты, ученые, гуру методологов и т. Д.), Видят, что разработчики делают одно и то же снова и снова в различных ситуациях и средах, тогда интеллект, полученный в результате этого наблюдения, может быть извлечен в шаблон. Шаблон - это способ «делать вещи» с помощью имеющихся программных инструментов, представляющих общую абстракцию.

Некоторые примеры:

  • ОО-программирование отняло у разработчиков глобальные переменные. Для тех случаев, когда им все еще нужны глобальные переменные, но нужен способ, чтобы их использование выглядело чистым и объектно-ориентированным, есть шаблон Singleton .

  • Иногда вам нужно создать новый объект, имеющий один из множества возможных различных типов, в зависимости от некоторых обстоятельств. Уродливый путь может включать в себя постоянно расширяющийся оператор case. Принятый «элегантный» способ добиться этого с помощью OO-clean - это шаблон «Фабрика» или «Метод фабрики».

Иногда многие разработчики делают что-то определенным образом, но это плохой способ, который следует не рекомендовать. Это может быть оформлено в antipattern .

Шаблоны - это высокоуровневый способ ведения дел, и большинство из них не зависят от языка. Создавать ли вы объекты с помощью new Object или Object.new не имеет значения для шаблона.

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

  • Имя
  • Эффект достигнут
  • Обоснование
  • Ограничения и ограничения
  • Как это сделать

Идиомы являются чем-то гораздо более низким уровнем и обычно работают на уровне языка. Пример: * * тысяча сорок-две

*dst++ = *src++

в C копирует элемент данных с src до dst, увеличивая указатели на оба; обычно это делается в цикле. Очевидно, вы не увидите эту идиому в Java или Object Pascal.

while <INFILE> { print chomp; }

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

6 голосов
/ 10 января 2010

Вопреки идее, что шаблоны не зависят от языка, оба Пол Грэм и Питер Норвиг предположили, что необходимость использования шаблона является признаком того, что в вашем языке отсутствует функция,(Шаблон посетителя часто выделяется как наиболее яркий пример этого.)

Я обычно считаю, что основное различие между «шаблонами» и «идиомами» заключается в размерах.Идиома - это что-то маленькое, например «используйте интерфейс для типа переменной, которая содержит коллекцию», в то время как шаблоны имеют тенденцию быть больше.Я думаю, что малость идиом означает, что они чаще зависят от языка (пример, который я только что привел, был идиомой Java), но я не считаю это своей определяющей характеристикой.

3 голосов
/ 09 января 2010

Так как, если вы поместите 5 программистов в комнату, они, вероятно, даже не согласятся с тем, что является шаблонами, нет реального «правильного ответа» на это.

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

Шаблоны, с другой стороны, более независимы от языка (хотя они часто относятся к определенной парадигме). У вас может быть некоторая инфраструктура для их поддержки (например, Spring для MVC), но они не являются и не будут языковыми конструкциями, и все же вам могут понадобиться они на любом языке из этой парадигмы.

...