PHP 板


LINE

看板 PHP  RSS
自學web開發兩年,對MVC一直一知半解,常在想怎樣設計系統會最漂亮。 整理了一下目前的理解,以Model出發跟各位分享。 其中有寫錯的部份也期待各位前輩指教。 http://blog.turn.tw/?p=217 --------------------------------------------------------------------------- Q1: 一個model對應到資料庫一張table對嗎? 不對。雖然大部分framework實作都會將一張table對應到model內一個class,但「一個 model對應一張table」比較像是在描述ORM之類幫助簡化資料庫SQL操作的class, 而model是「處理跟某張table相關任務的class」。 差別何在?一個model可能會處理到多張table的資料,也可能一張table都不碰,純粹處理 一串商業邏輯。舉例來說,可能會有個負責整理行銷資料的model叫Marketing,從多張 table撈資料出來,整理之後丟給controller。而資料庫中可能有,也可能沒有「marketing 」這張table。 Q2: 可是我寫專案幾乎一個model對應到一張table啊? 因為實務上一個服務常會對應到一個model,而提供這model所需的資料常常就只是一張 table。所以許多情況下的確是一張model對應到一張table沒錯。 但也不能說是「一張」table。model內常會去join其他相關的table對吧? 所以說「model對應到一張table」或是「model就是一種ORM」都是不精確而誤導的說法。 雖然寫起來常會有這種錯覺。 Q3: 那你用一個不會誤導又精確的說法描述model給我看? 「model是layer」。不要把MVC中的M跟VC想成平行的分工關係,把VC跟M想成上往下的幾層 layer。VC最靠近使用者、下來是M、再下來是database。 所以VC要取得資料庫的資料都要透過model,而不同任務有不同model。 Q4: 聽不太懂,談點別的好了。從Rails社群流出一句很流行的MVC原則「fat model, skinny controller」,你對此有什麼想法? 這句話對初學者有幫助,對進階者有害。 「fat model, skinny controller」這句話可以提醒初學者盡量把code丟進model 別丟進controller。你再看一次我Q3的回答,一個應用程式的最重要部份 (商業邏輯、安全性、效能)本來就是跟資料庫互動的那層layer,也就是 model,所以把code丟進model別丟進controller可以暗示初學者寫出reusable的code。 但是把太多code寫進model會形成god pattern,也就是某個model跟神一樣負責絕大部分的 任務,導致維護起來有困難(想像你初學PHP把全部code寫在同一份檔案的恐怖情況)。 Q5: 又說code要盡量丟進model,又說model內code太多很不好,不然code到底要丟哪? library以及helper。現在大部分的framework都預設有放library以及helper的地方。不使 用framework的話你也可以自己開這兩個資料夾。 多個model常做的同幾件事可以包起來寫成library,而單純的資料格式轉換 (甚至是產生相關html/css)之類的任務可以寫成helper。 讓model主要專注在商業邏輯(這是最花功夫的地方),其餘的搬到library、helper、 或是有些framework稱之為third_party或package的什麼地方都好。 別丟進controller!更別丟進view。 Q6: 好吧。可是我開發時在controller跟model內真的會不小心就寫掉大部分任務,這樣寫 真的比較快阿。你開發時,上面說的你自己有沒有都做到? 沒有。原因有兩個。一,實務上的確很難在一開始就把架構想清楚,所以一堆任務會丟給 model。二,常常越往下寫才發現某些任務是共通的、某些任務一開始只是「簡單」處理資 料轉換,寫到後來變成「複雜的」處理資料轉換,我認為這時再把它拉出來成為library或 helper即可。重構本來就是不斷在做的事情,時機到了就做。 Q7: 我知道library跟helper的地位何在了。但,library跟helper的差別又何在? 軟體開發時,有時會寫幾個function或method解決某些任務,有時候覺得這樣太鬆散, 會包成class。library常常是class、helper常常是一組function。以我自己來說,常在 controller或view使用helper,在model使用library。 Q8: 關於model,最後有沒有要提醒的? 不要在model裡面用session variable。用下去,那model根本不再reusable(其他 controller用之前還要先設定好相關session)。連unit testing都毀了。解決之道是 dependency injection。session variable某種程度來說根本就是global variable,濫用 global variable是很不好的。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.37.251.200
1F:推 chenstin:推一下 03/17 22:51
2F:推 taikobo: 推分享 03/18 10:09
3F:推 DongFeng:PUSH 03/18 14:15
4F:推 world294:Good..ZF2 用過嗎? 03/18 14:42
PHP只用過CodeIgniter Q_Q 之後想學Laravel :D ※ 編輯: poopoo888888 來自: 1.171.161.139 (03/19 15:26)
5F:→ tails32100:Laravel看起來很神啊.... 03/20 18:48
6F:推 roycsw:推心得~! 03/23 12:01
7F:推 see7di:$_ENV定義全局變數就好了 不要GLOBLE 04/10 00:03
8F:推 see7di:框架是為了提升開發速度 別拘尼于它反受其害 04/10 00:07







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP