Наскільки важливі шаблони дизайну в програмуванні?


19

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

Яке їх призначення і чи важливо їм вчитися?


7
Їх добре знати на співбесіді з роботи!
Вім

5
Шаблон дизайну - це лише названий, часто повторюваний спосіб вирішення проблем. Зазвичай вони виникають через дефіцит мов.
Джон Перді

7
Розуміння мети моделей дизайну вимагає розуміння проблем, які вони вирішують. Розуміння цих проблем вимагає досвіду зробити це важким способом :)
MattDavey

Відповіді:


36

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

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


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

3
Чому голоси "за"? Це насправді найкраща відповідь ІМХО. Кодування - це здоровий глузд, і іноді ви можете швидко використовувати шаблони, які добре підходять для вирішення проблеми. Але як тільки люди починають зловживати ними скрізь, це перетворюється на один безлад.
Кодер

1
Кожен код містить деяку модель, навіть якщо ви цього не знаєте. Шаблони дизайну, про які ви говорите, просто перегрупуйте та назвіть набір широко використовуваних та корисних моделей. Коли ви їх знаєте, ви можете думати про них більш свідомим способом. Якщо ви називаєте один із своїх класів "ControlDispenser", напевно, ніхто не дізнається, що він повинен робити. Однак якщо ви знаєте заводський зразок, тоді ви назвете його "ControlFactory", і інші відразу зрозуміють.
Олів'є Якот-Дескомбс

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

2
@Nate: Однією метою може бути кілька моделей. Немає причин, що один клас повинен включати лише один зразок. Шаблони не є "атомними" обов'язками. Для однієї відповідальності може знадобитися кілька моделей.
DeadMG

26

З статті wikipedia про шаблони дизайну :

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

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


3
Порівняння розробки програмного забезпечення з електротехнікою є настільки ж точним, як порівняння ракети Сатурна з велосипедом. Обидва способи транспортування (проходження від точки А до точки В), але йдуть про це абсолютно різними, несумісними способами.
jer

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

6
@Mike: є принципова різниця: електричні кола обмежені жорсткими фізичними межами. Програмні системи обмежені нечіткими межами людського інтелекту.
Кевін Клайн

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

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

9

Дійсно є дві різні, істотні причини існування шаблонів.

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

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

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

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

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


2
Неправильне уявлення про те, що дизайнерські зразки є рішенням, що не впадають у дію. Вони "ПАТЕРНІ", це не завжди перекладається в код.
Мартін Йорк

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

5

Шаблони - це про повторне використання ідей та концепцій та про створення спільної / послідовної платформи для спілкування одних і тих же.

Ми всі згодні (!), Що теоретично повторне використання коду - це добре, але це виявляється важче, ніж ми хотіли б зробити це практично (в деяких аспектах це змінюється, але це завжди буде викликом ). Але насправді багато з того, що ми хочемо повторно використовувати - це спосіб робити речі, використовувати своєрідний шаблон для побудови рішення певної проблеми - це Шаблони. Отже, ви потрапляєте у випадок, коли ви говорите, що вдалий підхід до розв’язання задачі X полягає у використанні шаблону Y, і ми знаємо, що елементами візерунка Y є a, b і c і ми йдемо. Оскільки шаблони широко зрозумілі, вам не доведеться глибоко пояснювати, яка користь від комунікацій.

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


4

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

  1. Вони є мовними агностиками. Як тільки ви дізнаєтесь, який шаблон дизайну підходить для даної проблеми / архітектури / завдання, ви зможете реалізувати його на будь-якій мові багатопарадигми - нехай це буде C #, Java або Python - рішення буде в більшості випадків однаковим, просто у вас є адаптувати синтаксис. Це означає, що ви можете перенести свій досвід роботи з програмування на одній мові на інші мови, якщо ви знаходитесь в одному і тому ж проблемному домені (а може бути, навіть у різних доменах).

  2. Незважаючи на те, що шаблони дизайну мають прив'язку до парадигми програмування , це означає, що шаблони дизайну для об'єктно-орієнтованого програмування (найвідоміші, відомі також як шаблони "Банда чотирьох" ). Шаблони дозволяють зрозуміти, для чого найкраще парадигма, і допоможуть вам вийти за рамки просто синтаксису.Наприклад, я бачив багато реалізацій в C # і Java, де люди просто програмували так, як це робили в Basic або Fortran - у них ідеальний розум для вирішення проблем, і вони використовують OOP просто для того, щоб зробити це рішення - ніякої спадщини , немає поліморфізму, всі методи є загальнодоступними тощо. Шаблони дизайну допомагають вам оглянути за цими поняттями і побачити, як вони працюють у реальному житті. Те саме стосується дизайну в інших парадигмах, як функціональне програмування.

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

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


2

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


1

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


1

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

Джо Грегоріо велику розмову про відсутність моделей дизайну в Python


Дякуємо за посилання про відсутність моделей дизайну в Python. Редагувати: На жаль !! Відео було видалено з цього місця !! :(
Saurabh Patil

0

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

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