Які "запахи коду" є симптомом того, що потрібна модель слухача подій?


10

Які симптоми в кодовій базі свідчать про необхідність підходу слухача подій?

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

Відповіді:


8

Підхід події / слухача намагається уникнути тісного з'єднання , тому всі запахи коду, які вказують на це, вказували б на призначення.

Виходячи з цього, я б запропонував такі симптоми:

  • великі конструктори , оскільки кожен об'єкт повинен знати кожен інший об'єкт, і він не може функціонувати без нього. Можливо, переодягнені стільки, хто obj.set_dependecy(x)відразу після виклику конструктора.

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

  • "Ієрархію знань" важко визначити . Це двонаправлені залежності , просто інший фокус: якщо є A, який слухає B, A знає B, але B не A, тож є ієрахія: деякі об'єкти нічого не знають, інші знають інші Наприклад, при впровадженні MVC таким чином: http://en.wikipedia.org/wiki/Model_View_Controller , модель знає лише себе, представлення знає модель, а контролер знає погляд і модель.


1
Двонаправлені залежності на сьогоднішній день є найбільш показовим знаком того, що вам потрібно перейти до моделі, керованої подіями. Здуття конструктора може означати це, але частіше за все це означає, що вам потрібно зробити більше у вигляді агрегації, композиції та / або загальної абстракції (тобто рефакторинг, а не зміни дизайну).
Aaronaught

Ти правий. Я намагався замовити це через простоту виявлення, і великі конструктори настільки прості, що їх можуть вловлювати регулярні вирази.
keppla

6

Коли ви не можете чи не повинні знати, що має реагувати на набір повідомлень / сигналів / подій.

Часто, коли ви хочете, щоб "світ" знав про щось, що відбувається в модулі (класі або системі класів), але вам не хочеться турбуватися про те, що називається.

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


3

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

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

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

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

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


2

Подумайте, що б вам довелося робити, якби слухачів подій (т.к. шаблон спостерігача) не існувало.

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

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

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

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