Що таке анти-візерунок?


193

Я вивчаю закономірності та анти-візерунки. У мене чітке уявлення про шаблони, але я не отримую анти-шаблонів. Визначення з Інтернету та Вікіпедії мене дуже бентежать.

Чи може хтось простими словами пояснити мені, що таке анти-візерунок? Яка мета? Що вони роблять? Це погана річ чи добра?




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

Відповіді:


245

Антидіаграми - це певні закономірності в розробці програмного забезпечення, які вважаються поганою практикою програмування.

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

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

Наприклад:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

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

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

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


9
будь-які інші приклади анти-візерунків поруч з GodObject?
Томаш Муларчик

@Tomasz Програмування Макаронні вироби служать одним із таких прикладів. Найкраще це узагальнено як погана інкапсуляція між багатьма дрібними предметами. Вважайте це протилежним об'єкту Бога en.wikipedia.org/wiki/Spaghetti_code
AWrightIV

@Tomasz все, що погано, але це робиться деякими людьми, є антипаттерном. Наприклад, try: <do something>; except: passможе бути антипатерн Кардинала в гріху в Python. Дивіться це: realpython.com/blog/python/…
eric

1
Чи можна вважати Сінглтона антитілом, оскільки це ускладнює паралельний глум і запуск тестів (оскільки всі тести використовують і мутують один і той же сингтон, що призводить до невідповідностей)?
lostsoul29

63

Щоразу, коли я чую про анти-шаблони, я згадую інший термін саме. Дизайнерський запах.

"Дизайнерські запахи - це певні структури в дизайні, які вказують на порушення фундаментальних принципів дизайну і негативно впливають на якість дизайну". (Від "Рефакторинг на дизайн дизайну програмного запаху: Управління технічним боргом")

Існує багато дизайнерських запахів, класифікованих на основі порушень принципів дизайну:

Абстракція пахне

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

Імперативна абстракція: Цей запах виникає, коли операція перетворена на клас.

Неповна абстракція: Цей запах виникає, коли абстракція не підтримує комплементарних або взаємопов'язаних методів повністю.

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

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

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

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

Інкапсуляція пахне

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

Leaky Incapsulation: Цей запах виникає, коли абстракція "викриває" або "протікає" деталі реалізації через її публічний інтерфейс.

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

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

Модуляризація пахне

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

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

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

Модуляризація, подібна до концентраторів: Цей запах виникає, коли абстракція має залежність (як вхідну, так і вихідну) при великій кількості інших абстракцій.

Ієрархія пахне

Відсутня ієрархія: Цей запах виникає, коли кодовий сегмент використовує умовну логіку (як правило, у поєднанні з "типами з тегами") для явного управління варіаціями поведінки, де ієрархія могла бути створена і використана для інкапсуляції цих варіантів.

Непотрібна Ієрархія: Цей запах виникає тоді, коли вся ієрархія спадщини є непотрібною, що вказує на те, що успадкування було застосовано без потреби для конкретного дизайнерського контексту.

Нефактована ієрархія: Цей запах виникає при непотрібному дублюванні серед типів в ієрархії.

Широка Ієрархія: Цей запах виникає, коли ієрархія спадкування є "занадто" широкою, що вказує на відсутність проміжних типів.

Спекулятивна ієрархія: Цей запах виникає, коли один або кілька типів в ієрархії надаються спекулятивно (тобто, виходячи із уявних потреб, а не реальних вимог).

Глибока ієрархія: Цей запах виникає, коли ієрархія спадкування є "надмірно" глибокою.

Бунтівна ієрархія: Цей запах виникає, коли підтип відкидає методи, передбачені його супертипами.

Порушена ієрархія: Цей запах виникає, коли супертип і його підтип концептуально не поділяють відношення "IS-A", що призводить до порушеної замінюваності.

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

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


Вищеописане визначення та класифікація описані у "Рефакторингу програмного забезпечення запахів: Управління технічним боргом ". Більше релевантних ресурсів можна знайти тут .


41

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

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


18

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


13

Якщо ви дійсно хочете вивчити AntiPatterns, знайдіть книгу AntiPatterns (ISBN-13: 978-0471197133).

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

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


9

Поширений спосіб зробити безлад. Наприклад, клас бог / кухня (робить усе), наприклад.


6

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


6

Антішаблон є доповненням до шаблоном проектування . Антидіаграма - це шаблонне рішення, яке не слід використовувати в певній ситуації.


6

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


4

Сьогодні дослідники та практичні фахівці з програмного забезпечення часто використовують терміни «антидіаграма» та «запах» взаємозамінно. Однак вони концептуально не однакові. Запис у Вікіпедії проти шаблону зазначає, що антидіаграма відрізняється від поганої практики чи поганої ідеї принаймні двома чинниками. Антидіаграма є

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

Це чітко вказує на те, що антидіаграма обрана з переконанням, що це хороше рішення (як зразок) представленої проблеми; однак це приносить більше зобов’язань, ніж користі. З іншого боку, запах - це просто погана практика, яка негативно позначається на якості програмної системи. Наприклад, Singleton - це анти-візерунок, а клас Бога (або недостатня модуляризація) - дизайнерський запах.


2

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


0

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

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

Ви можете перевірити питання: Що так погано в одиночних? щоб краще зрозуміти різні думки з цього приводу.


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

0

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

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