Я работал над большим приложением Rails, где использование обратных вызовов ActiveRecord было безудержным и мучительным. Сохранение записи часто имело неожиданные побочные эффекты, и это было непросто.
В то же время я видел хуки, используемые для достижения хорошего эффекта как часть наследования (например, родительский класс, использующий шаблонный метод, позволяющий подклассам добавлять специализированное поведение без необходимости знать о внутренних элементах родителя), и в плагинах (например, режим emacs запускает ловушку, когда он активирован, позволяя пользователям добавлять пользовательское поведение в этот режим).
Я понимаю, что приложение Rails и интерпретатор Lisp - это совершенно разные системы, но мне любопытно, есть ли какие-то общеизвестные критерии, на которые люди обращают внимание при принятии решения о том, являются ли хуки правильным выбором для решения проблемы, с которой они сталкиваются.
Тема, которая бросается в глаза, - это предсказуемость. Злоупотребление хуками, кажется, приводит к жутким действиям на расстоянии и удивительному поведению, тогда как правильное использование может привести к структуре, которая предсказуема без жесткой связи.
Поскольку я еще только несколько лет в своей карьере программиста, я считаю себя нубом во многих отношениях, и подозреваю, что люди достаточно много думают об этой теме. Каковы некоторые руководящие принципы, которые могут управлять этим решением?