Eu trabalhei em um aplicativo Rails grande, em que o uso de retornos de chamada ActiveRecord era galopante e angustiante. Salvar um registro geralmente tinha efeitos colaterais inesperados e era um desafio argumentar sobre o sistema.
Ao mesmo tempo, vi ganchos usados com bom efeito como parte da herança (por exemplo, uma classe pai usando um método de modelo para permitir que as subclasses adicionem um comportamento especializado sem precisar conhecer os internos do pai) e em plug-ins (por exemplo, um modo emacs executando um gancho quando ativado, permitindo que os usuários adicionem um comportamento personalizado nesse modo).
Percebo que um aplicativo Rails e um intérprete Lisp são sistemas muito diferentes, mas estou curioso para saber se existem critérios conhecidos que as pessoas procuram ao decidir se os ganchos são a escolha certa de design para o problema que estão enfrentando.
O tema que pula para mim é a previsibilidade. O uso indevido de ganchos parece levar a uma ação assustadora à distância e a um comportamento surpreendente, enquanto o bom uso pode levar a uma estrutura previsível sem acoplamento rígido.
Como ainda tenho apenas alguns anos de minha carreira em programação, considero-me um noob em muitos aspectos, e suspeitamos que as pessoas tenham pensado bastante nesse assunto. Quais são algumas diretrizes que podem orientar essa decisão?