分享

「深入討論」認識 MVC﹣Model 的角色

 quasiceo 2017-10-23

「深入討論」認識 MVC﹣Model 的角色

上一章認識 MVC 的文章就講述了關於 MVC 的基本概念,這次我們就仔細的看看 Model 在 MVC 裏面扮演的角色。

The model consists of application data and business rules

維基為 Model 給出的定義就是 Model 要同時處理 Data 以及 Business rules,Data 應該不難理解,就是儲存在資料庫的 Data,什麼是 Business rules 呢?Business rules 就是指業務上的規則,比如說,用戶 A 的銀行戶口裏需要有錢才可以轉帳至用戶 B,這就是銀行業務上的規則了。

在 PHP 的世界裏,西杰見過有不少人將 Business Logic 寫到 Controller 當中,這做法正確嗎?這就要回歸基本步了,記得我們為什麼要把 Model 分成獨立一層嘛?其核心思想就是希望代碼可以重用,簡單來說,就是如果我想為我的網站開發手機版時,我只需要寫一下界面的代碼就可以了,而 Model 這部份應該可以共用的,因為手機版只是在界面上比桌面網站簡潔。

所以,要回答這個問題,就要思考一下,如果我把 Business Logic 寫到 Controller 中,代碼仍然可以重用嗎?西杰認為,這個做法只可以有限度重用代碼(起碼在 PHP 來說是)。如果我這次不是開發手機版,而是 command line 版,那麼 Controller 就不再可以重用了,因為 Controller 要從 command line 拿取參數的方法跟從 HTTP 協議拿取參數的方法不同,如果把 Business Logic 寫到 Controller 中,那可能只是開發手機網頁版可以重用代碼,這決不是好的做法。因此,西杰比較偏向喜歡 fat-model-thin-controller 的做法!

第二個問題,存取資料庫的代碼應該寫在 Model 中嗎?Model 就是程式最核心的邏輯層,邏輯當然就要跟資料打交道。可是在 Model 裏寫得太多 SQL 的話就會令 Model 變成注重 Application Logic,這並不是 Model 該做的。那應該怎樣做呢?西杰慣常做法是使用 Doctrine 來做 Entity 層,把資料庫的存取邏輯交由 ORM 處理,那麼即使要使用另一款資料庫亦只需改動一下 ORM 的設定就可以了,不用處理 Application Logic!

第三,Model 之間可以互相溝通嗎?例如如果我要在每一個動作都檢查一下用戶登入了沒,那我可以在 Model 裏使用 User 的 Model 來檢查嗎?這在定義上沒有標準答案,西杰認為只要不影響重用性就可以,畢竟 MVC 最終目標都是希望令代碼可以重用以及日後方便維護而已。

其實大家不用太執著 MVC 中 Model 要做什麼,不要做什麼,這沒有很清楚的界線,不管白貓黑貓,反正捉到老鼠就是好貓,不管你如何實作 Model,只要背著 MVC 的精神,重用性及可維護性,那就是好的 Model。(哈哈,不過當然西杰還是有以上的一套習慣方便自己緊貼 MVC 精神)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多