Идиома против картины
В контексте программирования, как 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), но они не являются и не будут языковыми конструкциями, и все же они могут понадобиться им на любом языке из этой парадигмы.