Чи банда чотирьох ретельно досліджувала «Простір візерунка»?


144

З того часу, як я вперше дізнався про шаблони дизайну Gang of Four (GoF) , щонайменше 10 років тому, у мене складається враження, що ці 23 візерунки повинні бути лише невеликим зразком чогось набагато більшого, що мені подобається називати Pattern Space . Цей гіпотетичний простір шаблонів складається з усіх рекомендованих рішень (відомих чи невідомих) для загальних об'єктно-орієнтованих проблем проектування програмного забезпечення.

Тому я очікував, що кількість відомих та задокументованих моделей дизайну значно зросте.

Це не сталося. Через 20 років після виходу книги GoF у статті Вікіпедії вказано лише 12 додаткових зразків, більшість з яких набагато менш популярні, ніж оригінали. (Я не включав сюди шаблони одночасності, оскільки вони охоплюють певну тему.)

Які причини?

  • Чи є набір моделей GoF насправді більш вичерпним, ніж я думаю?

  • Чи впав інтерес до пошуку нових зразків, можливо, тому, що вони виявилися не такими корисними в розробці програмного забезпечення?

  • Щось ще?


49
Візерунки є скрізь, але їх часто використовують несмачно і робототехнічно. З цієї причини, я думаю, ідея каталогу моделей стала менш популярною.
usr

6
Дизайнерський простір? Хтось забирає Марка Розоводу сюди, стат!
corsiKa

16
У 2003 році Мартін Фаулер опублікував « Шаблони архітектури прикладних програм підприємства», в яких було подано близько 50 шаблонів, багато з яких досі є досить зрозумілими і добре використовуються сьогодні, наприклад, «Map Mapper», «Plugin», «Lezy Load», «Service Layer» тощо.
Брайан Роджерс

2
Вивчення простору всіх можливих шаблонів було б як би взагалі не досліджувати простір можливих шаблонів. Ви можете зробити все за зразком. Якщо ви зробите все зразком, то нічого не є шаблоном, оскільки слово втрачає значення.
СподіваюсьДопомога

4
@BradThomas: Звичайно, як і у більшості цікавих питань, люди, як правило, мають певну думку. Але думки, принаймні частково, ґрунтуються на фактах, і я знайшов багато цікавих фактів у відповідях на це питання, які допоможуть собі і сподіваюся, що інші переосмислюють свою думку та приходять до більш обґрунтованих.
Френк Пуффер

Відповіді:


165

Коли вийшла Книга, багато людей думали саме так, і було докладено багато зусиль для створення "бібліотек шаблонів" або навіть "спільнот зразків". Ви все ще можете знайти деякі з них:

Але потім...

Чи впав інтерес до пошуку нових зразків, можливо, тому, що вони насправді не такі корисні в розробці програмного забезпечення?

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

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

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


50
Суперечлива думка: абстрактна фабрика все одно має запах коду :)
MetaFight

66
Суперечлива думка, можливо, але така важлива думка висловити. Моделі дизайну загрожують стати прикладом нового одягу імператора, де ми всі боїмося запитати, чи вони корисні. Молодці.
Девід Арно

18
@MetaFightControversialDesignPatternOnlineOpinionHumanReadableRetortFactory.newInstance().getText();
corsiKa

11
" Суть дизайнерських моделей - це покращення спілкування між розробниками ". Я вважав, що шаблони дизайну повинні вирішити проблеми, з якими зазвичай (і досить часто незалежно) стикаються розробники. Стандарти покращують комунікацію, а через коливання (зразки, що виникають із-за проблем XY, а моделі вважаються анти-зразками) багато хто не вважає шаблони дизайну стандартними. Шаблони дизайну добре вказують на відсутність мовних особливостей, і я вважаю, що дизайнери мови впроваджують ці виправлення проблем, перш ніж вони стануть моделями дизайну. Не сприймайте мого слова за факт
Вінс Емі

11
@ChrisW Я не бачу вашої суті ... Як я вже говорив, GoF намагався подолати недоліки OO, і особливо недоліки C ++ 98, оскільки це була їх мова вибору разом з Smalltalk. Насправді вони писали: "Вибір мови програмування важливий, оскільки він впливає на точку зору. Наші зразки передбачають особливості мови Smalltalk / C ++, і цей вибір визначає, що можна, а що не можна легко реалізувати".
Shautieh

108

У мене складається враження, що ці 23 візерунки повинні бути лише невеликим зразком чогось набагато більшого, яке я люблю називати "Простір візерунків".

Це жахливе припущення, яке розповсюджують неофітні програмісти скрізь, програмісти, які думають, що вони можуть написати програму просто шляхом зшивання разом програмних моделей. Це не працює так. Якщо є такий «простір візерунка», можна припустити, що його розмір фактично нескінченний.

Шаблони дизайну (в розумінні GoF) мають лише одну мету: компенсувати недоліки в мові програмування, яку ви використовуєте.

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


40
"Шаблони дизайну (у значенні GoF) мають лише одну мету: компенсувати недоліки в мові програмування, яку ви використовуєте." Я все ще чую це, але ще не вважаю це виправданим. Кожне передбачуване обґрунтування цього лише вказує на кілька шаблонів, які легше реалізувати в мовах з деякою особливістю - як правило, для відвідувачів і, можливо, Сінглтон -, і залишає переважну більшість шаблонів недоторканими, лише маючи на увазі, що їх теж можна зробити зайвими кращі мови. Але як ми знаємо? Яка мовна особливість робить спостерігача неактуальним? Ланцюг відповідальності? Композитний?
Жуль

56
@Jules Функції першого класу виключають значну частину їх, включаючи Ланцюг відповідальності (це лише склад списку функцій). Функціональне реактивне програмування виключає схему спостерігача. Композиційний малюнок - це лише менш жорстке визначення моноїдів, а мови з типовими класами та орієнтацією на закони алгебраїки дають потужні інструменти для роботи з моноїдами. Я міг би перелічити ще багато, але ви зрозумієте,
Джек

12
@Jules: Я вважаю, що в оригінальній книзі GoF перелічено ітератор як зразок, але тепер його трансформація в мовну функцію в основному завершена в кожній віддаленій мові OOP.
Кевін

9
@RubberDuck, як це вже реалізувати шаблон, зробивши шаблон застарілим? Це все ще реалізована модель дизайну. Різні набори мовних особливостей можуть призвести до різних реалізацій шаблону, але сам шаблон все ще є. Моделі існують, щоб полегшити спілкування, даючи імена повторюваним стратегіям, які часто використовуються. На всякий випадок називаються класи .NET, ObservableSomething<T>що полегшує розуміння їх призначення, оскільки в ньому використовується загальновідома назва шаблону. Шаблон - це ідея, а не точна реалізація.
null

29
@Jules: Що таке програма? Вирішення проблеми, що виникає наново. Що таке модель дизайну? Вирішення проблеми, що виникає наново. Чому це не програма? Тому що ми не можемо виразити це програмою. Ерго, модель дизайну - це рішення проблеми, що виникає знову, яка, скоріше, повинна бути програмою, а не дизайном, але не може бути програмою, оскільки мова не є достатньо виразною для вираження програми. Приклад: не надто давно "Виклик підпрограми" був дизайнерським зразком! Нині це мовна особливість.
Йорг W Міттаг

61

Я думаю, що тут грають три фактори.

Відсутність критичної маси

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

Зразки ніколи не встановлювали критичну масу, необхідну для цього. Скоріше навпаки, AAMOF. За 20 (або близько того) років, як вийшла книга GoF, я майже впевнений, що я не побачив десяток розмов, в яких усі учасники дійсно знали достатню кількість моделей дизайну для їх використання для покращення спілкування.

Якщо говорити трохи привабливіше: дизайнерські зразки вийшли з ладу саме тому, що вони не вдалися.

Занадто багато візерунків

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

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

Реальність, як правило, майже протилежна. Скажімо, ви на зустрічі та скажіть їм, що саме цей клас - це Фасад. Половина людей на зборах або ніколи не знала, або давно забула, що це означає. Один із них просить вас нагадати йому точну різницю між Фасадом і, скажімо, проксі. О, і пара людей, які насправді знають зразки, проводять решту зустрічей, обговорюючи, чи це дійсно слід вважати фасадом чи "просто" адаптером (при цьому один хлопець все ще наполягає на тому, що йому це здається проксі).

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

Відсутність інтересу

Більшість моделей дизайну насправді не стосуються цікавих частин коду. Вони мають справу з такими речами, як: "як я створю ці об'єкти?" Та "як змусити цей об'єкт поговорити з цим?" Запам'ятовування назв шаблонів для цих (а також вищезазначених аргументів над деталями та ін.) Просто вкладає багато енергії в речі, про які більшість програмістів не надто переймаються.

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

Підсумок

Помилка моделей дизайну через:

  1. Вони не змогли досягти критичної маси.
  2. Диференціація між моделями була недостатньою для гарантування чіткості.
  3. Вони здебільшого мали справу з частинами коду, майже нікого насправді не цікавило.

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

5
Дуже гарна відповідь.
Роберт Харві

4
@Trilarion: О, я розумію, що ці частини коду мають бути записані. Вони трохи схожі на, скажімо, шини на вашій машині. Вам дуже потрібні шини для водіння взагалі - але більшість людей досі ледве знають марку шин на своєму автомобілі. Це вимагає, щоб вони вивчили спеціальну термінологію для шини з асиметричними діагональними канавками. Хто знає - це, можливо, колись врятувало мені життя, але я все ще не витрачаю життя на вивчення їх імен.
Джеррі Труну

3
@DavidRicherby: Гаразд, тоді давайте скористаємось "аналогічною стороною" версією аналогії. Чи має значення те, що Джон, який розробляє шини для Goodyear, використовує одне слово для цього типу канавки, але П'єр, який працює на Michelin, використовує зовсім інше слово? Чи має значення те, що в одному використовується слово, що посилається лише на паз, а в іншому - повна шина з горизонтальними канавками на одній стороні від центру та діагональними канавками з іншого?
Джеррі Труну

2
@immibis: Я б сказав, головним чином, так, вони провалилися. Я б сказав, що більшість півдюжини моделей знає більшість програмістів. Сінглтон добре відомий, але насправді застосовується лише рідко (у кращому випадку). Назва "Фабрика" була загальновживаною задовго до появи "моделей" (я пам’ятаю її використання в кінці 1970-х або дуже на початку 1980-х). Шаблони повинні були формувати словниковий запас, але наразі вони приблизно схожі на мою лексику грецькою мовою - достатньо, щоб (можливо) потрапити в біду, але, звичайно, недостатньо, щоб замовити меню, а тим більше провести змістовну розмову.
Джеррі Труну

35

У шаблонах відсутні абстракції, прості візерунки абстрагуються, складні візерунки не розпізнаються, тому шаблони не корисні (за винятком кількох високорівневих).

Я думаю, що Пол Грехем сказав це найкраще:

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

Якщо ви розпізнаєте шаблон у своєму коді, це означає, що щось повторюється, і вам слід скористатися кращою абстракцією. Якщо у вас немає кращої абстракції, ви використовуєте шаблон як вирішення. Оскільки новіші мови програмування надають кращі абстракції, моделі стають набагато менш корисними.
Також прості візерунки часто легко абстрагуються, а складні візерунки рідко розпізнаються.
Коли шаблон замінюється абстракцією, це не означає, що поняття, що стоїть за шаблоном, зникає, але те, що концепція може бути написана явно замість непрямого, і що вона більше не є спеціальною порівняно з іншим кодом, і вона більше не впізнається як візерунок.


2
Особисто мені якось дуже подобається ця ідея. Але тоді код повинен читатись людьми та людьми, як шаблони. Шаблони допомагають нам знайти свій шлях. Видалення всіх шаблонів з нашого коду зробить його нечитабельним.
Френк Пуффер

2
@Frank Я думаю, звідки походить PG - це те, що візерунок - це «запах» основної функції, яку ви можете абстрагувати, а той факт, що ви не вивели його у функцію чи макрос, викликає повторення - наприклад якщо у вас не було String.replaceфункції, ви можете уявити, що вона вискакує як візерунок, але краще написати її один раз, а не продовжувати її повторне виконання. Погодьтеся, що якщо ви не будете називати ці речі належним чином, це буде важче читати, але коли це буде зроблено правильно, код читає декларативніше ІМО (наприклад, getOrElseстиль опції монади проти нульової перевірки)
elsedave

11
Цитата Пола Грехема стосувалася збереження ваших рішень DRY, що відрізняється від ідеї "шаблону" GoF. Ідея GoF полягала у наданні імен загальновживаним рішенням. Ми це вже робили задовго до того, як Міністерство фінансів випустило свою книгу. Наприклад, я можу сказати своєму співробітникові, що я буду користуватися чергою , і мій колега одразу знає, про що я говорю, не потребуючи пояснення подробиць того, що робить черга чи як вона працює. Але, дивіться чудову відповідь Майкла Боргвардта вище.
Соломон повільно

10
На мою думку, ця відповідь неправильно розуміє, що таке закономірності. Шаблон дизайну - це часто зустрічається рішення поширеної проблеми. Це не якесь дублювання коду. Скажіть, візьміть ітератор. Ви вирішуєте проблему вилучення контейнера, щоб ви могли пройти елементи всередині нього, незалежно від того, який контейнер є. Таким чином, ви створюєте клас ітератора, який робить це для кожного з ваших контейнерів і змушує їх реалізувати загальний інтерфейс. Що тут абстрактно? Ітератор вже є абстракцією. І, звичайно, він реалізований по-різному для всіх контейнерів, тому не дублювання коду.
Малькольм

3
Ключовою частиною цитати Грема є часто те, що я вручну генерую розширення якогось макросу, який мені потрібно написати. Це конкретно посилається на макроси Lisp. Абстракції існує лише стільки, що можна обійтися без макросів.
Барт ван Нієроп

13

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


1
Правильно, шаблони можуть працювати лише тоді, коли їх не так вже й багато. Але чому саме GoF все ще є найпопулярнішими? Деякі з них нині багато людей вважають антитипами (Singleton, Builder тощо). Це повинно створити місце для нових, більш корисних моделей, не збільшуючи загальну кількість.
Френк Пуффер

2
Я думаю, це як 10 заповідей. Джерело знаходиться лише за два
знаки

9
Так, і часом здається, що сучасна інженерія програмного забезпечення стосується GoF, як середньовічна схоластика стосується Арістотеля.
Френк Пуффер

11

Щось, що жодна з інших відповідей не згадує, що також є актуальним:

Зростання динамічно набраних мов.

Коли книга вийшла вперше, відбулося серйозне обговорення того, що Java просто надто повільна, щоб зробити справжню роботу. Тепер Java часто використовується на більш виразних мовах через її швидкість. Можливо, Ruby, Python, JavaScript та ін все ще занадто повільні для деяких важливих класів додатків, але за великим рахунком вони досить швидкі для більшості цілей. І JavaScript принаймні стає швидшим, незважаючи на те, що в кожній версії пакується більше функцій.

Оригінальна книга GoF мала шаблони і в smalltalk, і в ++, і якщо пам'ять слугує, то шаблони завжди були коротшими у smalltalk, а іноді й істотно. Деякі особливості класичних моделей дизайну - це справді способи додати динамічні функції до статично типованої системи (як уже обговорювана AbstractFactory, в якій ви інстанціюєте правильний клас на основі даних часу виконання). Інші настільки коротші в динамічних мовах, що вони просто врізаються в ідіоматичне використання самої мови.


10

Це ж сталося. Десятки, якщо не сотні книг були опубліковані у тому, що виглядало як спроба звести всю інформатику до розробки моделей, оскільки видавці та автори намагалися перейти на (або створити) ще одну стрічку. У мене є полиця з ними. Ніколи не консультувався з моменту першого сканування, і так, я був присоском, тому що в ньому практично нічого не було, або фактично не було відомо (див., Наприклад, Тип об'єкта, що не більше ніж третя нормальна форма, висловлена ​​за десяток сторінок замість одного абзацу), і тому, що очевидно, що менше шаблонів, тим краще: пункт, який ухилявся від більшості практиків. Дійсно, коли я опублікував спростування Type Object, мені було доручено переробити текст як шаблон дизайну.Правдива історія. Що також свідчить про ще один недолік проекту: відсутність перегляду чи механізму виключення чи відхилення.

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

Що вони зробили , що було корисно, це дві речі:

  • опублікуйте кілька корисних прийомів, таких як шаблон відвідувачів
  • надайте стандартний набір імен, який значною мірою застряг: Factory, Adapter, Iterator, ... Якщо ви подивитесь на CORBA, який був розроблений заздалегідь, ви побачите значення цього: всілякі "іноземні" імена, такі як Interceptor , Слуга, Брокер, ...

Ще одна корисна концепція, що виникла, була "анти-шаблон", наприклад "журнал і кидок". Проект, як і багато прихильників у КС, був зірваний з-за власного євангелізму та неправильним прийняттям як чергової релігії СС, і пішов шляхом більшості таких релігій: корисний частинами, але, безумовно, "жодної срібної кулі" ((c ) Фред Брукс, 1965). Сумно, що нам доводиться постійно розкривати це кожні кілька років.


Чи все ще сумно, якщо це спричинило цю дискусію (і все, що тягне за собою)
r3wt

1
@ r3wt Не послідовність. Те, що я сказав сумно, є слабкістю ІТ-індустрії для того, щоб думати, що кожна нова розробка буде міфічною срібною кулею, і, до речі, для того, щоб вивалити якусь власну попередню роботу.
користувач207421

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

6

Існувало / є декілька книг під назвою PLoP ( Pattern Languages ​​of Programme Design ), які є антологією робіт, що були представлені на щорічній конференції .

Читаючи книги, я виявив, що деякі зразки були цікавими і новими для мене, деякі з них є стандартами (наприклад, "половина об'єкта плюс протокол").

Тож ні, колекція GoF не була вичерпною, і надихала / надихає людей збирати / описувати / відкривати / винаходити нові.

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


Так, ви можете знайти описи сотень моделей, якщо шукати їх. Але жодне з них не здається таким популярним, як GoF.
Френк Пуффер

Це тому, що мені подобалося читати книгу GoF, я читав більше (книги), коли вони були опубліковані (пізніше).
ChrisW

1
@FrankPuffer Сподіваюся, що моделі популярні, навіть якщо імена немає.
декор

5

У книзі "Банда чотирьох" (GoF) міститься більшість моделей, які досвідчений програміст не має жодної функціональної мови у своєму інструментальному поясі. Це як базовий набір інструментів, який усі будівельники вміють використовувати. Основний внесок книги полягав у тому, щоб дати чітко визначену назву тим моделям, які були загальноприйнятими більшістю досвідчених програмістів у той час, а отже, сприяти спілкуванню між програмістами, що обговорювали варіанти дизайну.

Ви очікуєте, що електромонтажник матиме деякі інструменти, яких звичайний будівельник не має, також ви очікуєте, що програміст WPF знати схеми проектування "Властивості залежності" або "SQL-програміст", щоб знати схему проектування для використання тригерів для створити дані аудиту.

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

Ще декілька модельних моделей дизайнерських книг - "Переймка, вдосконалення дизайну існуючого коду (Мартін Фаулер)" та "Чистий код: Довідник про гнучку майстерність програмного забезпечення" (Роберт К. Мартін) " Обидві ці книги представляють вміст як перетворення, яке ви робите. до вашого поточного коду, а не як "попередньо консервований дизайн багаторазового використання", однак вони є настільки ж "моделями дизайну".


3

Ось інтерв'ю з Еріхом Гаммою, де він розмірковував про їх вибір моделей і те, що вони змінили б сьогодні (ну і сьогодні, як 10 років тому, ха-ха).

http://www.informit.com/articles/article.aspx?p=1404056

Ларрі: Як би ви відтворили "Шаблони дизайну"?

Еріх: Ми зробили цю вправу в 2005 році. Ось кілька записок з нашої сесії. Ми з'ясували, що з тих пір об'єктно-орієнтовані принципи дизайну та більшість моделей не змінилися. Ми хотіли змінити категоризацію, додати нових членів, а також скинути деякі зразки. Більшість дискусій полягала у зміні категоризації та зокрема про те, які зразки слід відмовитись.

Обговорюючи, які зразки потрібно скинути, ми виявили, що ми все ще любимо їх. (Не дуже - я за те, щоб скинути Singleton. Його використання майже завжди є дизайнерським запахом.)

Ось ось деякі зміни:

  • Перекладача та полегшеної ваги слід перенести в окрему категорію, яку ми назвали «Інше / Складене», оскільки вони справді є іншими звірами, ніж інші зразки. Фабричний метод буде узагальнений до Фабричного.
  • Категорії: основні, творчі, периферійні та інші. Метою тут є наголосити на важливих зразках та відокремити їх від менш часто використовуваних.
  • Новими членами є: Null Object, Type Object, Injection Dependency, та Extension Object / Interface (див. "Об'єкт розширення" у "Мові шаблону". 3, Addison-Wesley, 1997).
  • Це були такі категорії:
    • Основні: композитний, стратегія, стан, команда, ітератор, проксі, метод шаблону, фасад
    • Творчі: завод, прототип, конструктор, впорскування залежностей
    • Периферія: абстрактна фабрика, відвідувач, декоратор, посередник, тип об’єкта, нульовий об'єкт, об’єкт розширення
    • Інше: Легка вага, Перекладач

Чому ти зволікаєш мене? Будь ласка, поясніть у коментарі, щоб я міг покращити відповідь.
akuhn

3

Дійсні візерунки в книзі іноді дуже корисні, але вони справді є лише примірниками більш потужного інструменту, який дає вам книга: глибоке розуміння того, коли і де краще вирізати монолітний код у незалежних частинах, розділених та регульованих інтерфейсом. .

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


Хороший момент, проте я сумніваюся, що багато людей розуміють книгу (або візерунки взагалі) саме так.
Френк Пуффер

@ lud1977 якщо ми не записуємо історію, що заважає майбутньому потрапляти в ті ж пастки? таким чином, він завжди повинен бути записаний. це не безглуздо.
r3wt

2

Тому я очікував, що кількість відомих та задокументованих моделей дизайну значно зросте.

Це не сталося. Через 20 років після виходу книги GoF у статті Вікіпедії вказано лише 12 додаткових зразків, більшість з яких набагато менш популярні, ніж оригінали. (Я не включав сюди шаблони одночасності, оскільки вони охоплюють певну тему.)

Книга GoF та Вікіпедія навряд чи є єдиним джерелом відомих моделей дизайну. Якщо ви просто шукаєте "шаблони дизайну" на Amazon.com, ви отримуєте сотні книг (спробуйте цей пошук ). Я здогадуюсь, що вони містять лише найвідоміший зразок у статті Вікіпедії .

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


-1

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

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

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

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


-2

Шаблони нескінченні. Ви можете налаштувати кожен візерунок або поєднати n відповідність, щоб створити нові .. Шаблони інтеграції підприємств також добре визначені. Так, так, Gof не відчував болю за документування шаблонів за допомогою uml та створив стандарт для їх пояснення. Але для кожного шаблону домену розвиваються, і вони також змінюються для експресивної мови на зразок python або scala.

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