您好,登錄后才能下訂單哦!
這篇文章主要介紹“MVC架構(gòu)的含義及職責(zé)劃分是什么”,在日常操作中,相信很多人在MVC架構(gòu)的含義及職責(zé)劃分是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”MVC架構(gòu)的含義及職責(zé)劃分是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
模型-視圖-控制器(MVC)是一種設(shè)計(jì)框架(設(shè)計(jì)模式)。
MVC 的目標(biāo)是將業(yè)務(wù)邏輯從用戶界面的考慮中分離。
這樣,開發(fā)者就可以更容易地改變每一部分而不會(huì)影響其他。
在 MVC 中,
Model 代表數(shù)據(jù)和業(yè)務(wù)規(guī)則;
View 包含了用戶界面元素,例如文本,表單等;
Controller 則管理模型和視圖中的通信。
MVC 在各種編程語言中均有實(shí)現(xiàn),例如 J2EE 應(yīng)用開發(fā)中,
View 可能由 jsp 實(shí)現(xiàn);Controller 是一個(gè) servlet,現(xiàn)在一般用 Struts 實(shí)現(xiàn);Model 則是由一個(gè)實(shí)體 Bean 來實(shí)現(xiàn)。
Yii Framework 是一個(gè)流行的 PHP 框架,它借鑒了 Ruby on Rails 的 ActiveRecord
(AR
) 概念。
數(shù)據(jù)庫(kù)中的每一個(gè) table
都可以用 AR
類來方便地進(jìn)行增刪改查操作。
它把 AR 當(dāng)做 Model,并推薦放在一個(gè)名為 models
的目錄下面。
于是,我在自動(dòng)生成表對(duì)應(yīng)的 AR 之后,便望文生義想當(dāng)然地認(rèn)為已經(jīng)擁有了 Model 層。
其實(shí),AR只不過是 DAO (數(shù)據(jù)訪問層),并不是 Model 層。
我們的業(yè)務(wù)幾乎全放在了 Controller 里:對(duì)用戶提交上來的表單進(jìn)行各種邏輯判斷,進(jìn)行計(jì)算,實(shí)例化 AR 對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)……
因?yàn)橐粋€(gè) Controller 中會(huì)有多個(gè) action
,每個(gè) action
都有這樣的業(yè)務(wù)處理。
最后,我發(fā)現(xiàn)我的 Controller 代碼已經(jīng)超過了 1000 行。
突然有一天,leader 說,我們這個(gè)系統(tǒng)要開放 API 給現(xiàn)有的舊系統(tǒng)調(diào)用,要給第三方接口。
第三方只是要給定一個(gè)參數(shù),本系統(tǒng)給出個(gè)結(jié)果值而已,這其中的業(yè)務(wù)處理它是不關(guān)心的。
壞就壞在這里,Controller 已經(jīng)實(shí)現(xiàn)了那些業(yè)務(wù),但它是接受表單提交的,怎樣能夠也接受 SOAP 的 xml 文檔呢?
Controller 和套套一樣,應(yīng)該越薄越好。
它的職責(zé)應(yīng)該只是接受用戶的輸入,然后立刻轉(zhuǎn)發(fā)給別的類來處理。
這樣 Controller 只負(fù)責(zé)提供不同的接口,我們才能算是將業(yè)務(wù)邏輯分離出去,而分離出去的業(yè)務(wù)也很容易進(jìn)行重用。
分離出來的這部分業(yè)務(wù)由誰來處理呢?答案應(yīng)該是 Model。
View部分比較明確,就是負(fù)責(zé)顯示。
一切與顯示界面無關(guān)的東西,都不應(yīng)該出現(xiàn)在view里面。
因此,View 中一般不應(yīng)該出現(xiàn)復(fù)雜的判斷語句,以及復(fù)雜的運(yùn)算過程。
可以有簡(jiǎn)單的循環(huán)語句、格式化語句。比如,博客首頁(yè)的文字列表就是一種循環(huán)。
對(duì)于PHP的Web應(yīng)用而言,HTML是View中的主要內(nèi)容。
View應(yīng)該從不調(diào)用Model的寫方法。
也就是說,View只從Model中讀取數(shù)據(jù),但不改寫Model。
所以我們說,View和Model是老死不相往來的。
而且,View中不直接訪問$_GET
和$_POST
,應(yīng)該由Controller傳遞給View。
此外,View一般沒有任何準(zhǔn)備數(shù)據(jù)處理的內(nèi)容,如查詢數(shù)據(jù)庫(kù)等。
這些一般是放在Controller里面,并以變量的形式傳給視圖。
也就是說,視圖里面要用到的數(shù)據(jù),就是一個(gè)變量。
對(duì)于Model而言,最主要就是保存和輸出信息。
比如,Post類必然有一個(gè)用于保存博客文章標(biāo)題的title
屬性,必然有一個(gè)刪除的操作,這都是Model的內(nèi)容。
數(shù)據(jù)、行為、方法是Model的主要內(nèi)容。
實(shí)際工作中,Model是MVC中代碼量最大。
Model是邏輯最復(fù)雜的地方,因?yàn)閼?yīng)用的業(yè)務(wù)邏輯也要在這里表示。
注意將Model與Controller區(qū)分開。
Model是處理業(yè)務(wù)方面的邏輯,Controller只是簡(jiǎn)單的協(xié)調(diào)Model和View之間的關(guān)系。
只要是與業(yè)務(wù)有關(guān)的,就該放在Model里面。
數(shù)據(jù)校驗(yàn)、public常量和變量,都應(yīng)該放在model層,
也就是說,有可能被重復(fù)使用的屬性或方法,都應(yīng)該放在model層,一次定義,到處使用。
Model不應(yīng)該訪問request、session以及其他環(huán)境數(shù)據(jù),這些應(yīng)該由Controller注入。
好的設(shè)計(jì),應(yīng)該是胖Model,瘦Controller。
對(duì)于Controller,主要是響應(yīng)用戶請(qǐng)求,決定使用什么視圖,需要準(zhǔn)備什么數(shù)據(jù)用來顯示。
因此,對(duì)于request
的訪問代碼,應(yīng)該放在Controller里面,比如$_GET
、$_POST
等。
Controller應(yīng)該僅限于獲取用戶請(qǐng)求數(shù)據(jù),不應(yīng)該對(duì)數(shù)據(jù)有任何操作或預(yù)處理,這應(yīng)該放在 Model 里面。
對(duì)于數(shù)據(jù)的寫操作,要調(diào)用Model類的方法完成。
對(duì)于用戶請(qǐng)求的響應(yīng),要調(diào)用視圖渲染。
此外,一般不要有HTML代碼等其他表現(xiàn)層的東西,這應(yīng)該是屬于View的內(nèi)容。
到此,關(guān)于“MVC架構(gòu)的含義及職責(zé)劃分是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。