Коли гачки правильний вибір дизайну?


10

Я працював над великим додатком Rails, де використання зворотних викликів ActiveRecord бурхливо і неприємно. Збереження запису часто мало несподівані побічні ефекти, і міркувати про це було проблемою.

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

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

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

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

Відповіді:


5

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

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

Ви повинні використовувати анонімне мовлення, коли:

  • Виклик гака необов’язковий
  • Абонента не байдуже, хто отримує гачок.
  • Порядок виконання приймачів не має значення.
  • Ви хочете транслювати стан об'єкта всім абонентам на гачок.

Ви повинні використовувати набрану абстракцію, коли:

  • Дзвінок на гачок обов'язковий.
  • Викликаючий об'єкт повинен ідентифікувати приймач гака.
  • Порядок виконання приймачів відповідає вашому об’єкту.

Прикладом гачка мовлення є KeyPressEvent. Клас, який запускає подію, не має значення, хто його отримує, і передає стан клавіатури кожному, хто підписався на подію. Порядок виконання приймачів не впливає на стан об'єкта класу, що запускає подію.

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


7

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

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

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

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


1

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

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

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

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