2014/12/11

【問題】 MVC的網站架構中 Model 的最佳實作

我認知中的MVC,是在看完 Stanford University 的 Developing iOS 7 Apps 這堂課之後才完整建立的。
http://youtu.be/ZqKbN_C4Yvg?t=14m20s
從14分到30分講MVC架構。


假設我有三個畫面,要顯示同一個 Table 的內容
第一個畫面需要 Table join A1 才能拿到足夠多的資訊
第二個畫面需要 Table join A2
第三個畫面需要 join A1 跟 A2

如果我要用一個 Model 層把 view 跟 DB 隔開,那我該提供哪些函數?

方法1:
只寫一個取出所有欄位的函數
Model.GetData   (WithA1 And A2)
缺點是會取到多餘的欄位

方法2:
為了解決方法1的問題,分別寫3個不同的SQL
Model.GetData
Model.GetA1
Model.GetA2
好處是我不會取到多餘的欄位
缺點是DB request 的次數會變多

方法3:
為了解決方法2的問題,分別寫3個不同的SQL
Model.GetDataWithA1
Model.GetDataWithA2
Model.GetDataWithA1AndA2
好處是我不會取到多餘的欄位,每次要取資料的時候只會產生1次DB request
缺點是,每當View 需要不同的欄位數的時候,我就要多作一個函數,會造成函數數量爆炸和管理困難,其實這樣寫的結果就等於是在View層上面寫SQL


問題是,一般情況下遇到這個問題會用什麼方法來解?為什麼選擇這個方法?

我問了幾個人答案都是採用方法1,是不是我想太多了?

3 則留言:

Dean 提到...
作者已經移除這則留言。
Dean 提到...

我會依據不同的目的寫不同的method,所以會選方法3。

但,
以我用的java來說,我會在OR mapping這塊採用如myBatis這類可以模組化sql的框架。
或db做view或stored procedure,讓server程式簡單的query而已。
對應query出來的VO可以用工具產生。

當view數多時,才看得出這種高聚合低耦合method的效益。
由於彼此不影響,所以將來修改一個,不用怕連帶影響到其他的。
現在是三個,將來不會擴增到很多個?要改的人會很怕的,因為牽一髮動全身。要改一個東西要把所有相關用到同一個method的所有邏輯先了解一次。才能評估會不會影響到其他功能。

以上僅是我的看法,若有錯誤請不吝指正

etrex kuo 提到...

舉例是舉3個view啦
實際情況大概10幾個...