為什么避免控制器肥胖屹徘?
(1) 控制器存在的意義是獲取數據和顯示數據,避免混入與模型相關的操作。
(2) 控制器中通常是方法調用而非實現懂昂,復雜或過長的代碼會導致邏輯混亂千所。
(3) 控制器中的代碼不用測試狂魔,因為都是調用其他的方法,所以應保持簡單淫痰。
控制器該做的事:
-用戶驗證授權有關的邏輯
-管理從請求中帶來的參數
-選擇正確的模型調用方法
-渲染視圖或重定向
為什么避免模型層肥胖最楷?
注意單一職責原則,保證特定模型只處理它分內的事情待错,
如發(fā)送通知籽孙,更新其他模型的先關數據都不是他分內的事。
關于這些事情及相關邏輯可以提取并放在新的類(PORO)中火俄。
為什么避免過度使用回調犯建?
過度使用回調會使得代碼的可讀性降低,并且不利于測試和維護瓜客,有時還會有意想不到的錯誤适瓦。通常我們使用回調處理簡單的邏輯,比如保存前更新自身的數據谱仪,保存后更改關聯模型中的計數列玻熙。如遇到復雜的邏輯,如保存后創(chuàng)建一條關聯記錄芽卿,發(fā)一條通知信息等揭芍,這些會導致邏輯十分混亂。對于以上這種情況卸例,創(chuàng)建新的類(PORO)称杨,并這些邏輯放入特定的方法中。好處:邏輯清晰筷转,易于測試和維護姑原。核心:單一職責原則,去除不必要的依賴呜舒。
為什么使用Service锭汛?
service object implements the user interactions with the app.
service contains business logic that coordinates other artefacts.
為了保證控制層和模型層代碼的簡潔干凈,我們需要創(chuàng)建一些純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