Як я уникаю писати класи менеджерів?


13

Я, здається, читаю, що це погана ідея використовувати XxxManagerкласи стилів у програмуванні ігрових механізмів, але навіть коли я намагаюся уникати їх використання, я завжди стикаюся з тим, що містить усі актори / сутності / світові локації та діє на них, що в кінцевому підсумку є Managerif якщо іншою назвою.

Це насправді погана модель? Якщо так, то які альтернативи?


2
Що з керуючими?
Кріс Макфарланд

blog.codinghorror.com/i-shall-call-it-somethingmanager та інші, хоча я не дуже впевнений, що це дійсно стосується
Росс Тейлор-Тернер

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

3
Власне, наші друзі з програмістів SE вже відповіли на це питання, погляньте на це і це, і це . Кредит йде на пошук Google із "як уникнути класів менеджерів programmers.se".
Tyyppi_77

@ Tyyppi_77 Цитата на вибір зі свого посилання StackOverflow: "Не отримуйте іменування паралічу. Так, імена дуже важливі, але вони недостатньо важливі, щоб витрачати величезні витрати часу. Якщо ви не можете придумати гарне ім'я за 10 хвилин, рухайся далі ». Я згоден. Код має кудись піти. Зателефонуйте, як не завгодно.
Кріс Макфарланд

Відповіді:


11

Заняття «менеджер» можуть бути проблематичними з різних причин. Дві основні причини, як правило, такі:

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

Часто одна з цих причин викликає або має на увазі іншу.

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

Зазвичай досить просто розділити більшість "менеджерів" на дві частини:

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

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

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


6

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

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

  • Коли він керує механікою гри foobars, ви можете назвати її FoobarController.
  • Коли він створює foobars, але потім делегує контроль над чимось іншим, це FoobarFactoryабо FoobarBuilder.
  • Коли він малює фобар на екран, це a FoobarRenderer.
  • Коли він слухає події, породжені фоабрами, це a FoobarEventHandler.
  • Коли він чекає, що щось станеться з фоабами, це FoobarObserver.
  • Коли це просто німий власник даних для колекції фобар без будь-якої логіки, ви просто назвете його Foobars.

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


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