He trabajado en una gran aplicación de Rails donde el uso de las devoluciones de llamadas de ActiveRecord era rampante y desgarrador. Guardar un registro a menudo tuvo efectos secundarios inesperados y fue un desafío razonar sobre el sistema.
Al mismo tiempo, he visto que los ganchos se usan con buenos resultados como parte de la herencia (por ejemplo, una clase principal que usa un método de plantilla para permitir que las subclases agreguen un comportamiento especializado sin necesidad de conocer las partes internas de los padres) y en complementos (por ejemplo, un modo emacs que ejecuta un gancho cuando está activado, lo que permite a los usuarios agregar un comportamiento personalizado alrededor de ese modo).
Me doy cuenta de que una aplicación de Rails y un intérprete de Lisp son sistemas muy diferentes, pero tengo curiosidad por saber si hay algún criterio conocido que la gente tenga en cuenta al decidir si los ganchos son la opción de diseño correcta para el problema que enfrentan.
El tema que me llama la atención es la previsibilidad. El mal uso de los ganchos parece conducir a una acción espeluznante a distancia y un comportamiento sorprendente, mientras que el buen uso puede conducir a un marco predecible sin un acoplamiento estrecho.
Como todavía estoy solo unos años en mi carrera de programación, me considero un novato en muchos aspectos, y sospecho que la gente ha pensado mucho en este tema. ¿Cuáles son algunas pautas que pueden dirigir esta decisión?