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


98

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

Чи вважаєте ви, що з багатьох моделей деякі непотрібні в такій динамічній мові, як Python (наприклад, тому, що вони заміщені динамічною ознакою)?


1
Вигляд цікавого питання, оскільки він передбачає, що вибір мови може ефективно замінити конструкції коду.
joshin4colours

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

Дуже цікаве запитання. Я б хотів, щоб я міг +5 замість +1.
MathAttack

1
Огляньте увагу на те, що в моделях дизайну відсутні мовні функції, а в шаблонах дизайну немає мовних особливостей на рівні c2. Це навіть не „динамічна мова”. Найпростіший приклад - візерунок ітератора, який є тривіальним у python, perl (і навіть Java - не динамічний).

Відповіді:


92

Пітер Норвіг демонструє, що 16 з 23 моделей дизайну, знайдених у книзі GOF, невидимі або простіші в динамічних мовах (він зосереджується на Ліспі та Ділані).

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

Я також зберігаю сховище github з реалізацією (іншими людьми) найбільш поширених моделей дизайну в Python .


Чудово! Це було б місце у відповідь :) Я хотів би, щоб усі зрозуміли це питання чітко.
Геренюк

2
За словами Норвіга, 2 із 16 (Інтерпретатор та Ітератор) є "невидимими чи простішими" завдяки макросам (яких у Python немає).
міс

1
мені незрозуміло, що всі ці зразки не потрібні, тому що lisp є динамічним, а скоріше через інші функції, такі як сильна функціональна мова
jk.

@mjs Ітератори - це вбудована функція Python.
sakisk

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

59

Жодні шаблони дизайну не потрібні. На будь-якій мові.

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

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

Це також допомагає мислити дизайнерські шаблони як концепцію, щоб думати про проблему, а не про конкретний код котла для написання. І про більшу частину котлованної панелі, як для вирішення Java, яка не має вільних функцій та стандартних функціональних об'єктів, якими ви користуєтесь у більшості інших мов, на яких вони є (наприклад, Python, C #, C ++ тощо).

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

Тож вивчіть усі закономірності як поняття . І забудьте конкретні реалізації. Реалізація різниться і повинна відрізнятися в реальному світі, навіть лише на Java.


28
Ваше вступне слово є надто спрощеним до крайньої міри. Це правда, що шаблони мають свою вартість, тому їх не слід використовувати наосліп, лише заради цього. Але в потрібному місці вони можуть бути чудовою допомогою. І так, вони є специфічними для мови - деякі моделі непотрібні в деяких мовах, оскільки сама мова підтримує кращий підхід. Але це ще досить далеко від вашої претензії на вступ.
Péter Török

2
Btw Visitor не повністю замінений функціями вищого порядку - це рішення здійснити подвійну розсилку мовою, яка не підтримує її (наприклад, C # та C ++). (І справді його слід використовувати дуже ощадливо - я вважаю це однією з найсміливіших та найдорожчих моделей, використання яких IMHO настільки важко виправдати, що я сам ніколи цього не використовував.)
Péter Török

14
Ну, вам ніколи не потрібен візерунок. Що потрібно - це вирішити проблему . Якщо ви не знаєте жодної схеми для неї, ви все одно можете її вирішити, це займе більше роздумів, і ви можете придумати рішення, яке відповідає певній схемі або тій, яка не відповідає. Знання шаблонів просто полегшує.
Ян Худек

3
@Gerenuk: Так, але справа в тому, що шаблони не є мовними, а для вашої голови. Часто ви виявляєте, що деякий шаблон реалізується набагато простіше і за допомогою різних інструментів у python, але зазвичай існує одна і та ж концепція.
Ян Худек

4
@ PéterTörök: Відвідувача не замінює нічим. Справа в тому, що одна і та ж концепція може бути реалізована з використанням різних інструментів у різних випадках, але я все одно вважаю це однаковою схемою.
Ян Худек

13

Абстрактний заводський візерунок непотрібний у мові типу качки, як-от Python, оскільки він практично вбудований у мову.


10
ну, вам ще потрібні різні фабрики. Ви просто не потребуєте визначення інтерфейсу.
Стефано Борині

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

13

Єдине, що спадає на думку, - це шаблон Singleton.

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

Здебільшого, одиночні пітони замінюються модулем. Модулі в пітоні за своєю суттю є одиночними; інтерпретатор пітона створює їх один раз і лише один раз.

Всі інші зразки дизайну Patters я використовував у Python в той чи інший час, і ви знайдете приклади їх у всій стандартній бібліотеці Python та в самому Python.


2
Хіба це насправді не антидіаграма в наші дні?
День

16
Сінглтон - антипатерн . На всіх мовах. Він був створений для вирішення декількох непов'язаних проблем і не підходить для жодної (зауважте, що навіть у Java є статичні члени, які існують один раз у класі, тому для цього вам не потрібен примірник).
Ян Худек

1
І в Python ми ніколи не переймалися цим, як і ніколи не було проблеми вирішити.
Martijn Pieters

1
"Python не змушує вас використовувати предмети для всього". Неправда. Це просто не прикро, як у Java, але все-таки в Python все є об'єктом. Рівний модуль - це об'єкт.
vartec

3
@Darthfett: Я добре знаю, як lenпрацює; Гвідо зробив тут чіткий вибір . Моя думка - показати, що Python не є чистою мовою ООП; це прагматична мова. Мені це подобається.
Martijn Pieters

8

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

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

Python вважається мовою «багато парадигми»; Ви можете використовувати будь-які шаблони, які Ви хочете. Це навмисно. Наприклад, він передбачає складні ієрархії класів, хоча вони абсолютно непотрібні і трохи штучні. Але для деяких людей саме ця абстракція корисна. Не тому, що проблема цього вимагає, а тому, що це робить програміст. Так що ви йдете.


Це, звичайно, цікаво. Тож про які зразки ви, зокрема, маєте на увазі, що про них можна забути, оскільки в Python є кращі способи?
Геренюк

4

Оригінальна книга "Шаблони дизайну" задокументувала та назвала деякі загальні ідіоми, корисні в імперативних, об'єктно-орієнтованих мовах, таких як C ++ та Smalltalk. Але Smalltalk - мова, що динамічно набирається, тому не може бути суто питанням бути динамічним.

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

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

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


1

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

Люди намагаються адаптувати шаблони дизайну скрізь так, як ніби найкраща практика мати у своєму проекті шаблони дизайну. Це навпаки. Ви стикаєтесь з проблемою, яку можна вирішити за допомогою заводського зразка? Класно. Адаптуйте його. Не шукайте свій код і не намагайтеся знайти потрібне місце для реалізації синглтона (або фабрики, або фасаду, або будь-якого іншого ...).

Можливо, Python має власні шаблони дизайну, недоступні для людей Java та .NET (через характер цих мов)?


1

Я б сказав, що закономірності завжди залежать від мови. Саме більшість шаблонів python виглядають як ті, що визначені в GoF, це через OOP Python, що, як кажуть, OOP не схожий на OOP (жодна дві мови не визначають об'єкти та їх маніпулювання на 100% однаково).

Тому немає сумнівів, що деякі зразки не застосовуватимуться "як є", а деякі можуть не мати сенсу, і є деякі зразки, які можуть мати значення лише для Python.

Щоб точно повернутися до вашого запитання: Візерунки потрібні лише в тому випадку, якщо вони вам потрібні . Не потрібно їх використовувати, якщо в них немає потреби (як уже сказав Ян Худець).

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

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