Итак, «в шаблонах дизайна отсутствуют языковые функции»? [закрыто]

12

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

Пол Грэхэм сказал: «Питер Норвиг обнаружил, что 16 из 23 шаблонов в шаблонах проектирования были« невидимыми или более простыми »в Лиспе».

или другое предложение, которое подтверждает то, что я недавно видел с людьми, пытающимися симулировать классы в JavaScript:

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

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

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

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

Эдуард Флоринеску
источник
16
Было бы ошибкой принимать все, что говорит Пол Грэхем по поводу языков программирования, как «объективное и фактическое».
Мейсон Уилер
5
Я не склонен не соглашаться с Полом Грэмом, но @MasonWheeler прав, евангелисты хороши по многим причинам, но не по своей объективности.
Джимми Хоффа
3
@JimmyHoffa: Это не «евангелисты» вообще. Я не согласен с долгой историей Грэхема о публикации нелепого материала, который часто противоречит самому себе или его источникам, и попытках превратить все это в последовательное. Неважно, за что вы выступаете, это ужасный путь, и мне немного страшно, что люди действительно его слушают.
Мейсон Уилер
5
Было бы неплохо увидеть некоторые исследования, но если вы когда-либо использовали современные функциональные языки - вы уже знаете, как устарели шаблоны проектирования GOF, и нет нужды в цифрах, чтобы доказать это больше . (Хотя они были важны в 1990 году, без сомнения).
c69
3
@DanielB, каждая конкретная парадигма потерпит неудачу, потому что реальность намного сложнее, чем любая парадигма. Следовательно, каждая проблема заслуживает своей собственной предметно-ориентированной модели и парадигмы.
SK-logic

Ответы:

10

Я не знаю ни о каком глубоком обсуждении или исследовании, которое принимает во внимание все эти вещи.

Тем не менее, по моему мнению, весь аргумент «шаблоны проектирования - это просто исправление недостающих возможностей в ОО-языках», является немного тонким. Да, некоторые шаблоны проектирования именно такие, они заполняют некоторый общий пробел, которого даже не существует в каком-либо другом языке X. Обычно это ваши простые, более простые шаблоны проектирования, как некоторые / многие из оригинальных в книге GoF.

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

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

Редактировать:

В некотором смысле, я говорю о том, что шаблоны позволяют практикующим специалистам думать на более высоком уровне и почти создавать тип DSL для своей среды, оставаясь в рамках синтаксиса своего языка. И да, я видел, что происходит, когда вы применяете их повсюду (см .: AbstractSingletonProxyFactoryBean , да, он существует) или думаете, что это какая-то серебряная пуля. Дело в том, что, хотя им и требуется по-настоящему много времени, чтобы по-настоящему чувствовать себя комфортно, предполагается, что они действительно снижают сложность, делая вещи предсказуемыми / понятными на высоком уровне. Это очень отличается от того, чтобы быть набором патчей для недостатков вашего языка.

Редактировать 2 - добавлен контрпример примера AbstractSingletonProxyFactoryBean, чтобы подшутить над шаблонами. Чтобы быть абсолютно справедливым, если смотреть с точки зрения АОП, даже этот контрпример оправдан.

Даниэль Б
источник
(+1) и примите, потому что вы сузили мой поиск по DSL и шаблонам приложений. Очень вдумчивый, и не могли бы вы расширить или дать ссылку для читателя, может быть, в скобках хотя бы один из аббревиатур DSL, я полагаю, это означает предметно-ориентированный язык.
Эдуард Флоринеску
@EduardFlorinescu спасибо, я обновил ссылки для DSL.
Даниэль Б.
Я также нашел эту статью, подтверждающую часть вашего ответа в этом случае с Groovy ibm.com/developerworks/java/library/j-eaed7/index.html
Эдуард Флоринеску
1
@EduardFlorinescu, это очень интересно, хотя я не просто имел в виду шаблон интерпретатора; скорее, я имел в виду, что многие шаблоны могут быть весьма специфичными для домена и становиться почти идиоматичными для разработчиков в этой области. В этом смысле они становятся своего рода DSL и не требуют особых усилий для понимания и использования. Например, когда я читаю шаблон команды (пример, не относящийся к домену), я знаю, какой шаблонный код я могу безопасно игнорировать, и это не требует особых усилий. Но спасибо за интересную ссылку, тем не менее.
Даниэль Б