Чому до конструкцій мов не додаються шаблони дизайну?


11

Нещодавно я спілкувався з колегою, який зазначив, що його компанія працює над тим, щоб додати модель дизайну MVC як розширення PHP.

Він пояснив, що вони написали код C для додавання Controllers, Models and Viewsдо мовних конструкцій для підвищення продуктивності.

Тепер я знаю, що MVC - це схема архітектурного дизайну, яка широко використовується у веб-додатках, але мені все ж доводиться стикатися з мовами, які мають, наприклад, мовну конструкцію для контролерів.

Інтегрування моделей дизайну IMHO в мову може підкреслити важливість хорошого дизайну OO.

Отже, чому до мовних конструкцій не додаються найбільш використовувані шаблони дизайну (MVC, Factory, Strategy, ... тощо)?

Якщо питання звучить занадто широко, ви можете обмежити це питання лише PHP.

Редагувати:

Я не маю на увазі, що при розробці проекту потрібно використовувати модель дизайну. Насправді я просуваю методологію, щоб вона була простою, поки вона працює.


19
Існує школа думки, яка говорить про те, що до багатьох моделей - це запах мови. Напевно багато зразків у книзі GO4 зникають або стають 1 лайнером у Ліспі.
Захарій К

5
"Будівництво фабрик - це 100% гарантія будь-якого проекту." Тоді ви працювали над поганими проектами. Хоча фабрика є корисною схемою, це далеко не гарантоване. Будь-який ООП має заводський зразок. Його називають конструктором.
Ейфорія

9
Я взагалі скептично ставлюсь до всієї справи OO загалом. Можливо, є ідея сприяння повторній юзабіліті, так, але це просто не працює. І, як тільки ви отримаєте доступні реально потужні інструменти, такі як метапрограмування, функції високого замовлення, системи потужного типу, модулі тощо, ви зможете легко висловити всі шаблони проектування OO як нові мовні конструкції - але ви б не хочуть цього робити, тому що при всьому цьому вам більше не знадобиться жодне ОО.
SK-логіка

2
Оскільки це означає, що для додавання функцій, загальномовної мови, ви не хочете, щоб мова мала дві тисячі можливостей, тому що всі ці синтаксиси та тонке перехресне взаємодія між функціями не впишуться вам у голову. Натомість ви хочете мову з мінімальним набором функцій, яка може вмістити в себе досить багато шаблонів дизайну досить лаконічно. Якщо модель дизайну може бути написана у відповідності з існуючими мовними особливостями з не надто поганим синтаксисом, тоді вартість додавання нової функції набагато вище і зайво ускладнить мову.
Лежи Райан

5
Існує також школа думки (до якої я належу), яка каже, що шаблони дизайну - це лише обхідні шляхи для дефіциту мови. На їхніх очах, усі існуючі моделі дизайну не існували б ідеальною мовою; але, враховуючи, що найпопулярніші мови далеко не ідеальні, ми стикаємося з цими обхідними шляхами. (Приклад)
BlueRaja - Danny Pflughoeft

Відповіді:


20

Шаблони дизайну постійно додаються до мовних конструкцій. Ви коли-небудь чули про шаблон розробки викликів підпрограми ? Немає? Я також ні. Це тому, що виклики підпрограми, які були зразком дизайну на початку 1950-х років, додалися до мов майже зараз. Сьогодні вони навіть присутні в наборах інструкцій машинного коду ЦП.

А як щодо моделі дизайну для циклу ? While Loop Design Pattern? Перемикач Design Pattern? Object Design Pattern? Class Design Pattern? Все це було додано до деяких мов.


Насправді, різні схеми дизайну для викликів підпрограми були поширеними (як мінімум, у асемблері та машинному коді) аж до кінця 50-х, початку 60-х, а також були представлені, скажімо, у M6800 (8-бітний). Шукати Wheeler jumpабо Modified Wheeler jump.
Ватін

Відсутність такої конструкції в TI-83 Plusосновній мові призвело до подібної схеми ще тоді, коли я вчився програмувати близько 2001 року.
Izkata

12

Деякі з них є. Наприклад, ітератори є мовною особливістю для багатьох мов та їх стандартних бібліотек (привіт, передбачити та повернути урожай). Спостерігач також часто присутній у формі подій (не в PHP - підписку на зворотний дзвінок потрібно керувати самостійно). Команда є основною особливістю WPF.

Багато хто з них не отримав би користі від мовної підтримки (і зробив би мову більш громіздкою) - як би ви спростили контролери, якби ви могли спроектувати особливості мови для них? Як класи, вони отримують перевагу від усієї інфраструктури, яка вже є для підтримки класів - ви можете створити їх, подати їх і, наприклад, блок перевірити їх як будь-який інший об'єкт.

Єдиний компонент MVC, яким IMO може скористатись якоюсь підтримкою мови, є View (з деяким офіційним двигуном для шаблонів) - і він у PHP вже підтримується - ви зможете динамічно створювати та завантажувати PHP-скрипти (які часто з якась попередня обробка, що використовується як шаблони).

Це ж стосується і заводського методу - як би ви спростили це, якби у вас була будь-яка потрібна мова мова? Однією з особливостей, якої у деяких мовах (наприклад, C ++) бракує, є можливість побудови об’єкта з цього типу імені, але це може зробити більшість мов вищого рівня (і навіть не потрібно створювати корисні заводські методи). Крім цього, все, що вам потрібно, - це вміти створювати метод, який створює екземпляр, повертає та заперечує.


10
Навіть орієнтація на об'єкт може розглядатися як особливий зразок, який вважався корисним і, отже, випечений на багатьох мовах. Взагалі наявність візерунка є показником відсутності мовної особливості.
Андреа

7

Деякі зразки дизайну дійсно додаються як мовні конструкції - вони просто не ідентифікуються як такі, тому що люди починають сприймати їх як "синтаксис", як тільки вони вбудовані. Обробка винятків на Java - хороший приклад - багато людей чітко кодують щось подібне як шаблон дизайну, якщо він не був частиною синтаксису основної.

Але зосередитись на питанні - є багато причин, чому ви не хочете додати занадто багато моделей дизайну до мови:

  • Додавати їх як мовні конструкції не потрібно - всі шаблони дизайну можуть бути реалізовані іншими способами
  • Це ускладнить мову - це погана ідея, оскільки це ускладнює вивчення мови, ускладнює написання та компілятори
  • Альтернативні підходи до реалізації існують для багатьох моделей дизайну. Вибір одного підходу та благословення його як частини основної мови, ймовірно, змусить людей використовувати такий підхід над іншими (що може бути набагато краще в деяких умовах)
  • Перевиконання дизайнерських моделей , мабуть, погана ідея в будь-якому випадку - мовні дизайнери, мабуть, усвідомлюють, що не варто їх ще більше заохочувати.

Крім того, якщо ви використовуєте досить потужну мову з можливостями метапрограмування (наприклад, Lisp), стає досить просто розширити мову самостійно, щоб реалізувати будь-яку модель дизайну. У основній мові вам зовсім не потрібні шаблони, якщо легко додати свій власний 5-рядковий макрос.


4

Чому до мовних конструкцій не додаються найбільш використовувані моделі дизайну (MVC, Factory, Strategy, ... тощо)?

Більшість цих моделей може бути реалізована в більшості мов програмування без конкретної лінгвістичної підтримки. Візьмемо для прикладу MVC на Java:

  • Ви можете кодувати це безпосередньо.
  • Ви можете реалізувати це за допомогою генератора додатків ... і одночасно доглядати за цілою низкою інших котлових плит.
  • Ви можете реалізувати його, використовуючи «рамкові» бібліотечні класи.
  • Ви можете реалізувати його, використовуючи анотації та статичну або обробку анотацій під час виконання.

З огляду на всі ці варіанти, мало значення для прямого розширення мови. І є ряд "мінусів":

  • Це, як правило, захаращує синтаксис мови, (імовірно), ускладнюючи життя початківцям програмістам.
  • Це, як правило, зробить специфікацію мови більш масштабною та складною, зробивши її складнішою для мовних виконавців. (І, звичайно, чим більше специфікація, тим більше ймовірність виникнення помилок та невідповідностей.)
  • Завжди буде тиск, щоб додати ще одну закономірність ... що призведе до проблем / проблем зі стабільністю мови.
  • Підтримуючи мовні конкретні шаблони, ви чітко визначаєте конкретні способи підтримки шаблонів, які можуть не відповідати деяким програмам.

4

Вони є.

Функції були схемою дизайну в асемблерному коді до того, як вони стали мовною конструкцією в C.

Віртуальні функції були дизайнерським зразком в C до того, як вони стали конструкцією мови в C ++.

Однак там є торгівля. Якщо модель включає створення кодового шаблону (навіть пару ключових слів), це є ознакою, що це буде корисною мовою. Але якщо візерунок простий і зрозумілий, наприклад. C "для (int i = 0; i <10; i ++)", все-таки корисно всім писати так само, але це не значно довше, ніж "для i = 0 до 10" і має значну перевагу, що це очевидно, як це змінити, щоб зробити трохи інший цикл.


3

Прочитайте книгу "банди чотирьох", і стане ясно, що:

  1. Шаблони дизайну в книзі насправді добре відомі конвенції про невеликі розмови, закодовані іншими мовами ОО.
  2. Таким чином, ці зразки не можуть бути включені до мови ОО - це було б повторним доповненням дрібних повідомлень всередині цих мов - краще використовувати малу розмову безпосередньо
  3. Чому шаблони дизайну корисні, це тому, що вони де-акцентують увагу на мові, що використовується в даний час, і фокусується на інших питаннях, ніж синтаксис. Кодування цих шаблонів всередині мови втратить цю особливість моделей дизайну.
  4. Справжня проблема вищезазначеного питання полягає в тому, що він пропускає те, що написання програмного забезпечення полягає не лише в вивченні мови. Важливо пройти достатню відстань від мови, яка безпосередньо надається, і зосередитися на поточних вимогах.

2

Оскільки шаблони дизайну чудово реалізуються з кодом користувача. Його приклад трапився лише тому, що це PHP, але якщо вам насправді потрібна продуктивність, ви просто працюєте на іншій мові або отримуєте HipHop або щось подібне.

Мовні особливості є складними як для уточнення, так і для реалізації, і це не виправдано створити одну з єдиною метою "Поточні ідіоми - X". Ви ледве збережете будь-який змістовний код користувача, і дарма.


0

Е-е, чергове питання, але я не згоден з великою кількістю відповідей залежно від того, де ви встановили "Шаблони дизайну" на циферблаті семантики, включаючи прийнятий.

У сенсі книги GoF Design Patterns, я б сказав, що це залежить. Наприклад, MVC (фактично не є формою GoF, але відповідає цій формі), абсолютно недоцільно виражати як мовні конструкції для масового споживання (хоча це може мати сенс для конкретного проекту PHP). Як архітектурний зразок існують постійні розбіжності в темі та велика різноманітність ідеально законних інтерпретацій на неї за різних обставин (хоча багато хто відходить далеко від MVC, вони, ймовірно, вже не повинні називати його MVC). Наприклад, в Інтернеті http-бар'єр робить його дещо незграбним, залежно від того, намагаєтесь ви включити сторону клієнта (без сумніву, болісно) в рівняння і що ви вважаєте "погляд" з більш належним чином суворо з точки зору сервера.

З іншого боку, ітератор - це дуже загальна концепція, яка може застосовуватися в дуже широкому спектрі способів до найрізноманітніших конструкцій.

Там, де має бути проведено лінію про те, чи належить щось в основному мовному дизайні, навіть в мові, орієнтованій на сервер-веб, IMO - це точка, коли щось переходить лінію, щоб полегшити робити незрівнянну кількість речей легше порівняно робити надмірно конкретну, але широко реалізовану річ, як зразок архітектури для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.