日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

mvc 职能划分_MVC架构的职责划分原则

發(fā)布時(shí)間:2023/12/4 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mvc 职能划分_MVC架构的职责划分原则 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來(lái)源:https://www.awaimai.com/873.html? ?歪麥博客

最近負(fù)責(zé)一個(gè)項(xiàng)目,用了?Yii Framework 的 MVC 框架,剛開(kāi)始自以為結(jié)構(gòu)很穩(wěn)健。

但是隨著對(duì)業(yè)務(wù)邏輯理解的深入,才開(kāi)始意識(shí)到問(wèn)題的嚴(yán)重。

我錯(cuò)誤地理解了 MVC 中的 Controller,想當(dāng)然地根據(jù)以往的經(jīng)驗(yàn),把所有的業(yè)務(wù)邏輯都放在 Controller 的 action 中去實(shí)現(xiàn)。

于是,每一個(gè) Controller 的代碼都上千行,越來(lái)越臃腫。

最后,我下定決心重構(gòu)代碼,起源是一個(gè)對(duì)外開(kāi)放 API 接口的需求。

按照現(xiàn)在的架構(gòu),代碼基本無(wú)法復(fù)用,我需要把很多功能再重復(fù)寫(xiě)一遍,這實(shí)在是無(wú)法接受。

面向?qū)ο缶幊滩粌H僅是課本上的名詞啊!

真正開(kāi)始實(shí)踐才發(fā)現(xiàn),要有面向?qū)ο笠庾R(shí),有全局觀,是多么難得的一件事情。

1 到底什么是 MVC

模型-視圖-控制器(MVC)是一種設(shè)計(jì)框架(設(shè)計(jì)模式)。

MVC 的目標(biāo)是將業(yè)務(wù)邏輯從用戶界面的考慮中分離。

這樣,開(kāi)發(fā)者就可以更容易地改變每一部分而不會(huì)影響其他。

在 MVC 中,

Model 代表數(shù)據(jù)和業(yè)務(wù)規(guī)則;

View 包含了用戶界面元素,例如文本,表單等;

Controller 則管理模型和視圖中的通信。

MVC 在各種編程語(yǔ)言中均有實(shí)現(xiàn),例如 J2EE 應(yīng)用開(kāi)發(fā)中,

View 可能由 jsp 實(shí)現(xiàn);Controller 是一個(gè) servlet,現(xiàn)在一般用 Struts 實(shí)現(xiàn);Model 則是由一個(gè)實(shí)體 Bean 來(lái)實(shí)現(xiàn)。

2 我遇到了什么問(wèn)題

Yii Framework 是一個(gè)流行的 PHP 框架,它借鑒了 Ruby on Rails 的 ActiveRecord(AR) 概念。

數(shù)據(jù)庫(kù)中的每一個(gè) table 都可以用 AR 類來(lái)方便地進(jìn)行增刪改查操作。

它把 AR 當(dāng)做 Model,并推薦放在一個(gè)名為 models 的目錄下面。

于是,我在自動(dòng)生成表對(duì)應(yīng)的 AR 之后,便望文生義想當(dāng)然地認(rèn)為已經(jīng)擁有了 Model 層。

其實(shí),AR只不過(guò)是 DAO (數(shù)據(jù)訪問(wèn)層),并不是 Model 層。

我們的業(yè)務(wù)幾乎全放在了 Controller 里:對(duì)用戶提交上來(lái)的表單進(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)超過(guò)了 1000 行。

突然有一天,leader 說(shuō),我們這個(gè)系統(tǒng)要開(kāi)放 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ā)給別的類來(lái)處理。

這樣 Controller 只負(fù)責(zé)提供不同的接口,我們才能算是將業(yè)務(wù)邏輯分離出去,而分離出去的業(yè)務(wù)也很容易進(jìn)行重用。

分離出來(lái)的這部分業(yè)務(wù)由誰(shuí)來(lái)處理呢?答案應(yīng)該是 Model。

3 View的職責(zé)

View部分比較明確,就是負(fù)責(zé)顯示。

一切與顯示界面無(wú)關(guān)的東西,都不應(yīng)該出現(xiàn)在view里面。

因此,View?中一般不應(yīng)該出現(xiàn)復(fù)雜的判斷語(yǔ)句,以及復(fù)雜的運(yùn)算過(guò)程。

可以有簡(jiǎn)單的循環(huán)語(yǔ)句、格式化語(yǔ)句。比如,博客首頁(yè)的文字列表就是一種循環(huán)。

對(duì)于PHP的Web應(yīng)用而言,HTML是View中的主要內(nèi)容。

View應(yīng)該從不調(diào)用Model的寫(xiě)方法。

也就是說(shuō),View只從Model中讀取數(shù)據(jù),但不改寫(xiě)Model。

所以我們說(shuō),View和Model是老死不相往來(lái)的。

而且,View中不直接訪問(wèn)$_GET和$_POST,應(yīng)該由Controller傳遞給View。

此外,View一般沒(méi)有任何準(zhǔn)備數(shù)據(jù)處理的內(nèi)容,如查詢數(shù)據(jù)庫(kù)等。

這些一般是放在Controller里面,并以變量的形式傳給視圖。

也就是說(shuō),視圖里面要用到的數(shù)據(jù),就是一個(gè)變量。

4?Model的職責(zé)

對(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ū)分開(kāi)。

Model是處理業(yè)務(wù)方面的邏輯,Controller只是簡(jiǎn)單的協(xié)調(diào)Model和View之間的關(guān)系。

只要是與業(yè)務(wù)有關(guān)的,就該放在Model里面。

Model不應(yīng)該訪問(wèn)request、session以及其他環(huán)境數(shù)據(jù),這些應(yīng)該由Controller注入。

好的設(shè)計(jì),應(yīng)該是胖Model,瘦Controller。

5 Controller的職責(zé)

對(duì)于Controller,主要是響應(yīng)用戶請(qǐng)求,決定使用什么視圖,需要準(zhǔn)備什么數(shù)據(jù)用來(lái)顯示。

因此,對(duì)于request的訪問(wèn)代碼,應(yīng)該放在Controller里面,比如$_GET、$_POST等。

Controller應(yīng)該僅限于獲取用戶請(qǐng)求數(shù)據(jù),不應(yīng)該對(duì)數(shù)據(jù)有任何操作或預(yù)處理,這應(yīng)該放在 Model 里面。

對(duì)于數(shù)據(jù)的寫(xiě)操作,要調(diào)用Model類的方法完成。

對(duì)于用戶請(qǐng)求的響應(yīng),要調(diào)用視圖渲染。

此外,一般不要有HTML代碼等其他表現(xiàn)層的東西,這應(yīng)該是屬于View的內(nèi)容。

6 啟示

Yii Framework 的官方文檔中有這么一段:

In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.

簡(jiǎn)言之,Rich Model is Better。

總結(jié)

以上是生活随笔為你收集整理的mvc 职能划分_MVC架构的职责划分原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩av中文字幕在线播放 | 欧美精品乱码99久久蜜桃 | 91狠狠 | 性少妇videosexfreexxx片 | 亚洲一区二区在线播放 | 国产在线观看中文字幕 | 国产精品theporn88 | 91免费观看视频在线 | 久久久久无码精品 | 免费精品国产 | 日本精品一区二区三区在线观看 | 三上悠亚亚洲一区 | 污视频在线 | 国产又粗又黄又爽又硬的视频 | 久久久久久国产精品免费 | 午夜av福利 | 亚洲成人另类 | 欧美人一级淫片a免费播放 西方av在线 | 免费毛片在线 | 午夜影院在线观看免费 | 中文字幕av网址 | 手机天堂网 | 亚洲福利视频一区二区 | 解开乳罩喂领导吃奶 | 国产aⅴ一区二区三区 | www.五月天com| 国产欧美日韩成人 | 中文激情网| 日韩中文字幕电影 | 欧美a在线| 欧美黄色大片免费看 | 夜夜视频 | 寡妇高潮一级视频免费看 | 九九热在线免费观看 | 男女视频在线免费观看 | 波多野结衣 在线 | 久久精品123 | va婷婷在线免费观看 | 亚洲欧洲在线播放 | 韩国美女av | 免费观看在线播放 | 一卡二卡三卡四卡五卡 | 一本久道视频一本久道 | 美女又爽又黄视频毛茸茸 | 久久久久久国产精品三级玉女聊斋 | 99久久久国产精品无码网爆 | 黄黄视频在线观看 | 欧美 亚洲 激情 一区 | 超碰超碰超碰超碰 | 国产一区麻豆 | 国产av一区二区三区精品 | 一区二区伦理片 | 日本一区二区三区免费电影 | 免费中文字幕日韩 | 欧美色一区二区三区在线观看 | 国产在线观看精品 | 欧美日韩视频在线播放 | 香蕉久久夜色精品升级完成 | 奇米精品一区二区三区在线观看 | 在线观看黄色大片 | 国产极品探花 | 青娱乐在线视频观看 | 波多野结衣一区二区三区在线 | 日韩中文字幕在线观看视频 | 国产欧美一区二区三区鸳鸯浴 | 日韩一区二区在线观看视频 | 友田真希一区二区 | 男人的网站在线观看 | 亚洲中文字幕一区在线 | 可以免费观看的av网站 | 日韩亚洲第一页 | 操亚洲美女 | 美丽姑娘免费观看在线观看 | 国产成人自拍视频在线 | 国产精品自拍99 | 久久久久久久久一区 | 春色激情站 | 国产99视频在线 | 国产毛片a级 | 光棍影院手机版在线观看免费 | 久久久久久久综合色一本 | 久久久精品日韩 | 羞羞的网站在线观看 | 欧美黑人性生活 | 精品成人无码久久久久久 | 好吊日av| 不卡在线 | 久久精品美女 | 久色综 | 在线观看91视频 | 免费看av的网址 | 6080毛片 | 欧美一级鲁丝片 | 337p日本欧洲亚洲大胆精筑 | 亚洲成人福利 | 91黄色免费版 | 日本一二三视频 | 一级黄色片在线观看 | 久久精品久久久久 |