我曾经在一个大型的Rails应用程序上工作,在该应用程序中ActiveRecord回调的使用非常猖ramp且令人痛苦。保存记录通常会带来意想不到的副作用,这是对系统进行推理的挑战。
同时,我已经看到钩子作为继承的一部分发挥了很好的作用(例如,使用模板方法的父类允许子类添加专门的行为,而无需了解父内部的内部)。 (例如,在emacs模式被激活时运行钩子,允许用户围绕该模式添加自定义行为)。
我意识到Rails应用程序和Lisp解释器是完全不同的系统,但是我很好奇,当人们决定挂钩是否是解决他们所面临的问题的正确设计选择时,人们是否会参考任何众所周知的标准。
让我大吃一惊的主题是可预测性。钩子的滥用似乎会导致远距离的怪异动作和令人惊讶的行为,而正确使用钩子可能会导致可预测的框架而无需紧密耦合。
由于我还只有几年的编程生涯,因此我在很多方面都认为自己是菜鸟,并且怀疑人们对此主题已经投入了很多思考。什么准则可以指导这一决定?