Идиома против картины

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Идиомы специфичны для языка.

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

Ответ 3

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

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

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

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

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

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

Поскольку шаблоны являются чем-то теоретическим и формальным, обычно существует формальный шаблон (heh-word overload! let say "template" ) для их описания. Такой шаблон может включать:

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

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

*dst++ = *src++

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

while <INFILE> { print chomp; }

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

Ответ 4

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

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

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