为什么避免控制器肥胖?
(1) 控制器存在的意义是获取数据和显示数据,避免混入与模型相关的操作。
(2) 控制器中通常是方法调用而非实现,复杂或过长的代码会导致逻辑混乱。
(3) 控制器中的代码不用测试,因为都是调用其他的方法,所以应保持简单。
控制器该做的事:
-用户验证授权有关的逻辑
-管理从请求中带来的参数
-选择正确的模型调用方法
-渲染视图或重定向
为什么避免模型层肥胖?
注意单一职责原则,保证特定模型只处理它分内的事情,
如发送通知,更新其他模型的先关数据都不是他分内的事。
关于这些事情及相关逻辑可以提取并放在新的类(PORO)中。
为什么避免过度使用回调?
过度使用回调会使得代码的可读性降低,并且不利于测试和维护,有时还会有意想不到的错误。通常我们使用回调处理简单的逻辑,比如保存前更新自身的数据,保存后更改关联模型中的计数列。如遇到复杂的逻辑,如保存后创建一条关联记录,发一条通知信息等,这些会导致逻辑十分混乱。对于以上这种情况,创建新的类(PORO),并这些逻辑放入特定的方法中。好处:逻辑清晰,易于测试和维护。核心:单一职责原则,去除不必要的依赖。
为什么使用Service?
service object implements the user interactions with the app.
service contains business logic that coordinates other artefacts.
为了保证控制层和模型层代码的简洁干净,我们需要创建一些纯Ruby类,来处理先关用户与模型层交互的逻辑。这部分类的作用通常是将用户的输入作为实例变量,获取相关数据,计算,或是调用其他服务,返回想要的结果。
Plain Old Ruby Object (PORO)
|= app
|- actions => system action, such as sending email
|- decorators => make view beautiful, generate json
|- policies => user authorization related stuff
|- services => request params (input), query among models
|- supports => third party services, such as amazon
|- updaters => updater attrs with specified methods