Чи коли-небудь корисно використовувати назву шаблону дизайну в класах реалізації? [зачинено]


28

Нещодавно я натрапив на помірно великому пітон кодовий з великою кількістю MyClassAbstractFactory, MyClassManager, MyClassProxy, і MyClassAdapterт.д. класів.

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

Крім того , вони , здається, потрапляють в список заборонених слів в програмуванні: variable, process_available_information, data, amount, compute: надмірно широкі імена, які не говорять нам нічого про функції , коли використовуються самі по собі .

Так має бути CommunicationManagerчи вірніше PortListener? А може, я взагалі не розумію проблеми ...?


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

Відредагував питання, щоб вказати, що класи не називались просто "AbstractFactory", але були також і деякі описові слова.
Vorac

1
... чи серйозно вони називали це Fctoryзамість а Factory, чи це просто помилка?
Ізката

@Izkata, lol, моя погана. Однак були Адаптер і Адаптер!
Vorac

Відповіді:


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

  • AnimalAbstractFactoryне є мудрим вибором ні, так як в більшості мов, було б зайвим з abstractключовим словом в підпису.

    Це, як кажуть, є кілька вагомих причин, підкреслених коментарями, щоб насправді включити Abstractдо імені: не тільки є кілька контекстів, де ви не маєте повного підпису, а лише ім'я, але також, зберігаючи AnimalFactoryінтерфейс може бути мудрим вибором (якщо, на жаль, умова мови / рамки не має префіксу інтерфейсів I).

  • AnimalCreationUtilityбув би також поганим вибором: якщо це фабрика , полегшіть роботу людям, які читатимуть код, і назвіть це фабрикою .

  • abstract AnimalFactoryгаразд. Він не має надмірності, і зрозуміло , що це абстрактний завод , який делегує створення тварин для своїх дітей.

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


2
Чому це краще, ніж писати коментар на чільному місці "У цьому модулі ми реалізуємо MVC. Причини: ... Моделі: ... Перегляди: ... Контролери: ... Карта структури: ... API :. .. ".
Vorac

37
@Vorac: мати чітке ім’я завжди краще, ніж покладатися на коментарі.
Арсеній Муренко

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

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

2
Мені б хотілося не погодитися з другим моментом: я вважаю, що AnimalAb абстрактFactory є хорошим вибором, тому що, хоч він і є надмірним у декларації класу, це було б дуже корисно в дочірній декларації класу: LionFactory розширює AnimalAb абстрактFactory, який, я думаю, це приємна інформація.
Ігор

11

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

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


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

10

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


1

Я думаю, це може спрацювати дуже добре. Наприклад:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
як це відповідає на поставлене запитання? На мій прочитання ваші "приклади" показують лише марне дублювання назв класів та коментарів до коду
gnat

Коментарі мають виправдовувати мету кожного класу, якщо ім'я класу для когось не очевидно. Дивлячись на ці моменти, я миттєво знаю, що у мене є команда, яка щось робить, запит, що повертає дані, декоратор, який додає додаткової поведінки існуючому механізму реєстрації винятків та фабрика, яка створює фільтри облікових записів. На мою думку, чим більш описовим є ти з іменами свого класу, тим легше іншим читати ваш код. Якщо ви використовуєте шаблон дизайну, тоді скажіть так - наприкінці дня
основна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.