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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2023/12/4 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mvc 职能划分_MVC架构的职责划分原则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:https://www.awaimai.com/873.html? ?歪麥博客

最近負責一個項目,用了?Yii Framework 的 MVC 框架,剛開始自以為結構很穩健。

但是隨著對業務邏輯理解的深入,才開始意識到問題的嚴重。

我錯誤地理解了 MVC 中的 Controller,想當然地根據以往的經驗,把所有的業務邏輯都放在 Controller 的 action 中去實現。

于是,每一個 Controller 的代碼都上千行,越來越臃腫。

最后,我下定決心重構代碼,起源是一個對外開放 API 接口的需求。

按照現在的架構,代碼基本無法復用,我需要把很多功能再重復寫一遍,這實在是無法接受。

面向對象編程不僅僅是課本上的名詞啊!

真正開始實踐才發現,要有面向對象意識,有全局觀,是多么難得的一件事情。

1 到底什么是 MVC

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

MVC 的目標是將業務邏輯從用戶界面的考慮中分離。

這樣,開發者就可以更容易地改變每一部分而不會影響其他。

在 MVC 中,

Model 代表數據和業務規則;

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

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

MVC 在各種編程語言中均有實現,例如 J2EE 應用開發中,

View 可能由 jsp 實現;Controller 是一個 servlet,現在一般用 Struts 實現;Model 則是由一個實體 Bean 來實現。

2 我遇到了什么問題

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

數據庫中的每一個 table 都可以用 AR 類來方便地進行增刪改查操作。

它把 AR 當做 Model,并推薦放在一個名為 models 的目錄下面。

于是,我在自動生成表對應的 AR 之后,便望文生義想當然地認為已經擁有了 Model 層。

其實,AR只不過是 DAO (數據訪問層),并不是 Model 層。

我們的業務幾乎全放在了 Controller 里:對用戶提交上來的表單進行各種邏輯判斷,進行計算,實例化 AR 對數據進行存儲……

因為一個 Controller 中會有多個 action,每個 action 都有這樣的業務處理。

最后,我發現我的 Controller 代碼已經超過了 1000 行。

突然有一天,leader 說,我們這個系統要開放 API 給現有的舊系統調用,要給第三方接口。

第三方只是要給定一個參數,本系統給出個結果值而已,這其中的業務處理它是不關心的。

壞就壞在這里,Controller 已經實現了那些業務,但它是接受表單提交的,怎樣能夠也接受 SOAP 的 xml 文檔呢?

Controller 和套套一樣,應該越薄越好。

它的職責應該只是接受用戶的輸入,然后立刻轉發給別的類來處理。

這樣 Controller 只負責提供不同的接口,我們才能算是將業務邏輯分離出去,而分離出去的業務也很容易進行重用。

分離出來的這部分業務由誰來處理呢?答案應該是 Model。

3 View的職責

View部分比較明確,就是負責顯示。

一切與顯示界面無關的東西,都不應該出現在view里面。

因此,View?中一般不應該出現復雜的判斷語句,以及復雜的運算過程。

可以有簡單的循環語句、格式化語句。比如,博客首頁的文字列表就是一種循環。

對于PHP的Web應用而言,HTML是View中的主要內容。

View應該從不調用Model的寫方法。

也就是說,View只從Model中讀取數據,但不改寫Model。

所以我們說,View和Model是老死不相往來的。

而且,View中不直接訪問$_GET和$_POST,應該由Controller傳遞給View。

此外,View一般沒有任何準備數據處理的內容,如查詢數據庫等。

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

也就是說,視圖里面要用到的數據,就是一個變量。

4?Model的職責

對于Model而言,最主要就是保存和輸出信息。

比如,Post類必然有一個用于保存博客文章標題的title屬性,必然有一個刪除的操作,這都是Model的內容。

數據、行為、方法是Model的主要內容。

實際工作中,Model是MVC中代碼量最大。

Model是邏輯最復雜的地方,因為應用的業務邏輯也要在這里表示。

注意將Model與Controller區分開。

Model是處理業務方面的邏輯,Controller只是簡單的協調Model和View之間的關系。

只要是與業務有關的,就該放在Model里面。

Model不應該訪問request、session以及其他環境數據,這些應該由Controller注入。

好的設計,應該是胖Model,瘦Controller。

5 Controller的職責

對于Controller,主要是響應用戶請求,決定使用什么視圖,需要準備什么數據用來顯示。

因此,對于request的訪問代碼,應該放在Controller里面,比如$_GET、$_POST等。

Controller應該僅限于獲取用戶請求數據,不應該對數據有任何操作或預處理,這應該放在 Model 里面。

對于數據的寫操作,要調用Model類的方法完成。

對于用戶請求的響應,要調用視圖渲染。

此外,一般不要有HTML代碼等其他表現層的東西,這應該是屬于View的內容。

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.

簡言之,Rich Model is Better。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。