Вибір правильної моделі дизайну


32

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

Наприклад:

Якщо об'єкти пов'язані, але конкретний клас ми не хочемо вказувати, розглянемо Анотацію

Коли примірник залишається похідним класам, врахуйте Factory

Потрібно отримувати доступ до елементів сукупного об'єкта послідовно, спробуйте Iterator

чи щось подібне?


8
Як ви думаєте, яке значення має? programmers.stackexchange.com/questions/70877/…
пдр

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

Я згоден з @pdr. Я думаю про те, що мені потрібно зробити, і запам'ятовування назви шаблону допомагає мені назвати Клас, щоб інші знали, що він також робить.
Емі Бланкенсіп

4
Справді. Це може бути просто зведено до "Як правильно вибрати дизайн?". По-перше, немає правильного дизайну, просто багато неправильних. Крім того, він має досвід палі (вибираючи неправильні).
Теластин

Відповіді:


109

Основна помилка в сучасному світі кодування полягає в тому, що моделі є будівельними блоками. Ви берете AbstractFactoryтут і Flyweightтам, а може і Singletonтам і з'єднуєте їх разом з XML та presto, у вас є робоча програма.

Їх немає.

Гм, це було недостатньо велико.

Візерунки не є будівельними блоками

Так краще.

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

Але зауважте, що це щось, що ви виявите у своєму коді, а не те, з чого ви починаєте. Творці Java не сказали : «О, ми будемо ставити муху в Integer» на самому початку, а скоріше зрозуміли , проблеми з продуктивністю , яка може бути вирішена з допомогою балансира .

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

Почати з Шаблону - це як знайти рішення та шукати проблему. Це погано: це призводить до надмірної інженерії та в кінцевому рахунку до гнучкості в дизайні.

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

Ось уривок з інтерв'ю з Еріхом Гаммою (про Gamma, Helm, Johnson та Vissides ): Як використовувати шаблони дизайну :

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


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

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

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


11
+1 для "рішення проблеми." Знання шаблонів дозволить вам пропустити природне відкриття їх, коли виявиться, що вам потрібно вирішити проблему, яку вони мають вирішити. Дізнатися про них, ймовірно, допоможе покращити ваші навички кодування та дизайну так само, як читання коду інших людей чи вивчення іншої мови програмування. Але ви, безумовно, не повинні активно намагатися «вписувати шаблони» у свій код.
gregmac

1
Я завжди рекомендую розробникам починати дивитися на шаблони, щоб спочатку ознайомитися з принципами дизайну. Кожна модель є ілюстрацією деяких принципів дизайну (набір принципів "SOLID" - лише один приклад).
ryscl

2
Можливо, ви додасте декоратора та фасаду, у якого ви будете мати додаток ;-) Сказав інший спосіб, що узори дизайну полягають у тому, щоб дати нам ім’я, загальну мову під час обговорення того, що ми будуємо. Це скорочення стеку важко здобутих знань про розвиток.
EBarr

2
Читаючи між рядками тут, кроки до вибору шаблону дизайну: 1. Завжди критично продумайте будь-який код, над яким ви працюєте. 2. Анотація конкретного коду до базової проблеми 3. Чи має ця проблема відоме рішення (модель дизайну )? 4. Так, як я застосувати це рішення до моєї специфіки? 5. Пристосуйте загальне рішення до абстрактної проблеми, щоб створити рішення вашої конкретної проблеми.
Кріс

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

18

Я запитую себе:

  1. Яку проблему я намагаюся вирішити?
  2. Яка схема дизайну програмного забезпечення (якщо така є) найбільш тісно вирішує ту саму проблему або забезпечує логічний шлях до вирішення моєї проблеми?
  3. Чи потрібна мені додаткова абстракція (і складність), яку надає модель, чи це надмірна інженерія для моєї конкретної проблеми? Чи можна вирішити проблему більш простим та ефективним способом без шаблону?

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


Звичайно, це щось із досвіду та експертів, а не план або блок-схема, і я з вами згоден. Але повинні бути використані повні ресурси, як розширений шпаргалка, в якій вона була класифікована, принаймні у випадку з найважливішими та найчастішими зразками, такими як фабрика тощо. який вам краще використовувати візерунок. ти знаєш такий ресурс там, в Інтернеті ?!
Pmpr

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