Чи можуть заняття менеджером бути ознакою поганої архітектури?


49

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

  • Мені здалося, що набагато складніше мені зрозуміти системи, які сильно покладаються на "менеджерів". Це тому, що, крім власне компонентів програми, ви також повинні розуміти, як і навіщо використовується менеджер.

  • Менеджери багато часу, здається, використовували для полегшення проблеми з дизайном, як, наприклад, коли програміст не міг знайти спосіб зробити програму Just Work TM і довелося покладатися на класи менеджерів, щоб все працювало правильно.

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

Чи справді класи менеджерів є ознакою поганої архітектури?


5
Я думаю, Of course, mangers can be good. An obvious example is an EventManagerце все пояснює. Неправильне використання поняття - це погана архітектура, але є законні випадки використання. Те ж саме стосується більшості всього.

27
Здається, це швидше є ознакою необдуманого називання.
пдр

9
EventManager- жахливе ім’я для класу. Це нібито робить що - то з подіями, але що ?
Крістофер Хаммарстрем

5
Однією з проблем тут є обмеження мови steve-yegge.blogspot.com/2006/03/… Класи менеджерів часто пояснюються дієсловами-іменниками, вільні функції - це те, що дуже хочеться
jk.

1
Менеджери часто мають багато повноважень (обов'язків), і з ними можна завдати біль - як і в будь-якому офісному середовищі;) EventManager нічого не означає. EventDispatcher описує, що робить.
CodeART

Відповіді:


31

Класи менеджерів можуть бути ознакою поганої архітектури з кількох причин:

  • Безглузді ідентифікатори

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

  • Дробові обов'язки

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

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

  • Неструктурована абстракція

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

Звичайно, менеджери можуть бути використані для більше, ніж просто зла, з тих же причин. Що EventManagerтаке насправді - Dispatcherвикликає події з джерел і пересилає їх до зацікавлених цілей. У цьому випадку має сенс відокремити відповідальність за отримання та відправлення подій, оскільки людина Event- це лише повідомлення без поняття походження та призначення.

Пишу Dispatcherв Eventвипадках по суті тієї ж самої причини ми пишемо GarbageCollectorабо Factory:

Менеджер знає, що його корисна навантаження не повинна знати.

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


3
Я напевно створив класи FooManager раніше. Я також створив фабрики та проксі. Але іноді здається, що вам дійсно потрібно тип GlorifiedCollection <Foo> і FooManager, здається, ідеально підходить до рахунку. Як би ви назвали клас, який буквально керує внутрішньою колекцією об'єктів Foo та забезпечує дуже чистий та стислий інтерфейс для отримання екземплярів Foo? Я думаю, що "менеджер" - це клас, який інкапсулював фабрику (тобто всі екземпляри Foo внутрішньо вбудовані), а також колекцію цих об'єктів. Ви б це назвали чимось іншим? Або роблять різний дизайн?
DXM

Ага так, EventDispatcherя вже деякий час намагаюся знайти хороше ім’я. : P
Павло

@DXM Тільки для колекції Foos, вона буквально може бути "FooList". Для глобального місця, де Foos зареєстрований, щоб їх можна було отримати пізніше, "FooRegistry" приходить на думку. Поєднання колекції та фабрики - це не те, що я особисто люблю робити, але я вважаю, що це, як правило, можна назвати "FooRepository".
Р. Шмітц

28

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

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

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


10

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

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


8

Коротка відповідь: це залежить .

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

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


Вибачте, я не вважаю цю відповідь дуже корисною. Ви добре зазначаєте, що незрозумілі обов'язки і занадто багато проблем погане. Але це стосується будь-якого класу , а не лише класу "Менеджер". Інші відповіді виглядають набагато конкретнішими щодо того, наскільки клас менеджера може бути корисним чи згубним.
user949300

3

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

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

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


2

Чи можуть заняття менеджером бути ознакою поганої архітектури?

Ви відповіли на своє запитання: вони не повинні бути ознакою поганого дизайну.

За винятком прикладу у вашому запитанні з EventManager, є ще один приклад: у схемі дизайну MVC презентатор може розглядатися як менеджер для класів моделі / перегляду.

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


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

2

Коли в класі є "Менеджер" в імені, остерігайтеся проблеми класу God (один із занадто великими обов'язками). Якщо важко описати, за який клас відповідає його ім’я, то це знак попередження дизайну.

Погані класи менеджерів убік, найгірше ім’я, яке я коли-небудь бачив, було "DataContainerAdapter"

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


2

Класи менеджерів - як і майже будь-який клас, що закінчується на "-er" - є злими і не мають нічого спільного з OOP. Тож для мене це ознака поганої архітектури.

Чому? Ім'я "-er" означає, що дизайнер коду здійснив певні дії та перетворив його на клас. В результаті у нас є штучне утворення, яке відображає не якусь відчутну концепцію, а певну дію. Це звучить дуже процедурно.

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

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

Такі об'єкти не потрібно контролювати. Вони знають, що робити і як робити. Тож класи менеджерів двічі порушують принципи ООП. Окрім класу "-er", він контролює й інші об'єкти. Але це залежить від менеджера. Це він контролює - він поганий керівник. Якщо він координує - він хороший менеджер. Ось чому лист "С" у MVC повинен бути написаний як "Координатор".


Ви робите цікавий момент, але мені все одно цікаво, як би ви класифікували "менеджера з питань організації"? З мого особистого досвіду, менеджер <entity> призначений для операцій CRUD з певним <entity>. Чи призводить це до анемічної моделі домену? Я не думаю, що так, просто не "активний запис". Крім того, чи не можемо ми використати сукупну логіку координації CRUD об'єднання "менеджер суб'єктів господарювання"? Я не бачу кращого місця для цього. Тож це може сприйматись як фасад CRUD так само ...
ClemC

Все, що я можу сказати про концепцію ORM - це medium.com/@wrong.about/you-dont-need-an-orm-7ef83bd1b37d
Zapadlo

Мені не доводилося посилатися на ОРМ, однак ... Я поважаю настільки, наскільки я можу принципів ОО, але мені здається, що вони досить теоретичні і не завжди можуть бути повністю застосовані на практиці ... Наприклад, якщо нам потрібна розв'язка, повторне використання, DRY, продуктивність, наприклад: розміщення логіки / правил домену, що застосовуються до різних об'єктів у спільних службах, отже, робить доменну модель менш поведінковою ... Ось такий саме ефект структури сховища / картографа (який ORM ви посилайтесь на реалізацію) VS активна схема запису, яка, я вважаю, ви віддаєте перевагу ...
ClemC

1

Правильна відповідь на це питання:

  1. Це залежить.

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

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