我一直以為MVC的圖解是下圖:
視圖和模型是不直接交互的,是通過控制器來協(xié)調(diào)的。
可是我最近看的文章里MVC是下面的圖:
視圖可以和模型直接交互的?難道我以前一直搞錯(cuò)了,而且做項(xiàng)目的時(shí)候也禁止視圖與模型有直接交互的?。?/p>
補(bǔ)充:
mvc,怎么說呢? 說起來還是比較抽象的。 一般為了層次結(jié)構(gòu)更加清晰,會(huì)明確各層的作用。
controller主要請(qǐng)求轉(zhuǎn)發(fā),model層主要處理業(yè)務(wù)邏輯,有時(shí)候也是看業(yè)務(wù)的復(fù)雜程度,如果業(yè)務(wù)相當(dāng)簡單,model顯然有點(diǎn)多余了,model也有人會(huì)去直接在view中進(jìn)行use 直接進(jìn)行渲染處理,本身mvc也是基于軟件的變化,而總結(jié)出來的一種經(jīng)驗(yàn),其目的也是為了團(tuán)隊(duì)更好的協(xié)同開發(fā),適應(yīng)復(fù)雜的業(yè)務(wù)等。具體還是要看公司的業(yè)務(wù)的復(fù)雜程度,model層與view的直接交互個(gè)人是覺的這種做法欠妥當(dāng),第一不利于前后端分離,二來代碼可讀性降低,現(xiàn)在更好的做法都是后端提供api接口 前端處理接口。 所以。沒有絕對(duì)的mvc 只有適合業(yè)務(wù)變化的mvc。
看了以上的回答,都很精彩啊。我以下就說一下我個(gè)人的一些理解和想法。
C層,我們從程序功能上來看,主要是用于接收用戶端的數(shù)據(jù)請(qǐng)求,然后返回用戶端請(qǐng)求的,通過C層里的方法把屬于同一個(gè)業(yè)務(wù)的東西獨(dú)立出來處理。
M層,這層其實(shí)主要是數(shù)據(jù)邏輯的處理,最主要的功能其實(shí)主要是負(fù)責(zé)數(shù)據(jù)庫的操作,在數(shù)據(jù)庫層面呢,把我們通常的各種數(shù)據(jù)結(jié)構(gòu)拆分成一個(gè)表或多個(gè)表以二維表的形式來存放。然后這個(gè)M層通常是負(fù)責(zé)增刪改查這些基礎(chǔ)操作。不過通常來說,我們這里也會(huì)做一些邏輯運(yùn)算。
V層,相對(duì)于后端來說,就是視圖層了,也就是最終要顯示的樣子,但這個(gè)V層里通常來說是一些類似于模板性質(zhì)的東西,然后靠C層調(diào)用M層得到結(jié)果,然后扔給一個(gè)渲染器,渲染器調(diào)用這個(gè)V層的模板把M返回的結(jié)果數(shù)據(jù)填充進(jìn)去就得到一個(gè)具體的結(jié)果。
所以通常來說,V層基本上沒有對(duì)數(shù)據(jù)的具體處理邏輯,至多就是些for遍歷列表,然后進(jìn)行一次數(shù)據(jù)顯示即可,最多會(huì)加些if條件判斷。但是實(shí)際在使用的過程中,不可能每個(gè)人都遵循這種思路來,可能就直接在View層去調(diào)用model層寫查詢,也可能會(huì)有其他的各種邏輯調(diào)用,所以造成View層的意義實(shí)際上并不大。
通常來說,MVC的程序,不管做任何操作都要經(jīng)歷過這么一個(gè)流程,但是實(shí)際上,現(xiàn)代的web有很多異步的交互,而在異步交互的過程來說,其實(shí)就只有C層和M層,因?yàn)椴簧婕暗胶蠖说臄?shù)據(jù)渲染。而現(xiàn)在的各種webAPP或者說是單頁面的開發(fā)方式,restful接口化設(shè)計(jì)等,后端可能只有一個(gè)C層和model層。在這種情況下來說,通常C層是業(yè)務(wù)邏輯的獨(dú)立了,而M層是具體業(yè)務(wù)邏輯中涉及到的細(xì)節(jié)部分的程序。
另外來說,隨著開發(fā)思想的演變,基礎(chǔ)設(shè)計(jì)可能通常看起來是一個(gè)C層和M層,但實(shí)際上,可能還有數(shù)據(jù)驗(yàn)證層,專門做數(shù)據(jù)驗(yàn)證,異常處理層,專門定義各種異常拋出方式,等等,甚至可能還有跨服務(wù)器通信層。這種情況,M層的話可能就真的只是一個(gè)數(shù)據(jù)增刪改查的功能了,而對(duì)應(yīng)的C層也只是在外層做一次業(yè)務(wù)邏輯語義化的封裝,而本身具體的實(shí)現(xiàn)可能根據(jù)不同的業(yè)務(wù),編寫方式應(yīng)該是按照設(shè)計(jì)模式來理解了。
其實(shí)糾結(jié)這些我個(gè)人覺得可能意義并不大,重點(diǎn)就是在規(guī)劃程序的時(shí)候能有一定的統(tǒng)一標(biāo)準(zhǔn),同時(shí)不喪失程序的課維護(hù)性、可擴(kuò)展性,當(dāng)然,最重要的我覺得就是要加注釋。。。。
題主理解的不錯(cuò),一般想到MVC就是這種模式:
上面的這種MVC設(shè)計(jì)模式,應(yīng)該是最初的MVC設(shè)計(jì)模式了。后來隨著編程、設(shè)計(jì)模式的多元化,慢慢的在此基礎(chǔ)上(M模型C控制器V視圖)又增加了許多衍生版。
我理解的,MVC
就是一個(gè)名詞,或者一個(gè)代號(hào),一種設(shè)計(jì)模式。但是三者之間具體要怎么關(guān)聯(lián),產(chǎn)生怎么樣的聯(lián)系,不是規(guī)定死的,還是看實(shí)際業(yè)務(wù)架構(gòu)的。
首先,MVC 誕生于1979年,可以說,那個(gè)時(shí)期的電腦和現(xiàn)在的電腦完全不同。那個(gè)時(shí)候沒有圖形界面,電腦程序非?!敖┯病?,需要操作員輸入一個(gè)個(gè)指令(通常是鍵盤,也有讀卡器),按照規(guī)定算法進(jìn)行計(jì)算,并且返回結(jié)果。所以那個(gè)時(shí)期的 controller,負(fù)責(zé)接收用戶指令、讀寫數(shù)據(jù)、調(diào)用 view 顯示,即題主你的理解,其實(shí)是正確的。
現(xiàn)在幾乎你能夠在網(wǎng)上找到的所有對(duì)于 MVC、MVP 之間區(qū)別的講解,幾乎都是作者以“我的理解”,硬解釋出來的,都是錯(cuò)的。其作者們無一例外全都忽視了計(jì)算機(jī)和圖形界面的發(fā)展,帶入當(dāng)前的智能設(shè)備、虛擬組件(如按鈕)來解釋 MVC,認(rèn)為 View 能夠接受用戶操作,將指令傳給 controller,然后怎么怎么著。所以看起來都有各種邏輯不通的地方。
我所知道的正確講解,只有這一篇:談?wù)刄I架構(gòu)設(shè)計(jì)的演化。其實(shí)很簡單,MVP 就是 MVC 的升級(jí)版,因?yàn)榄h(huán)境變了,輸入設(shè)備變了,所以模式也變了。
令我失望的是,連 Addy Osami,在《JS設(shè)計(jì)模式》一書里,也說錯(cuò)了。
所以,樓主的理解基本正確。不過最好加上歷史因素,這樣更全面。
另外,現(xiàn)在經(jīng)??吹降?Guard、service,則是根據(jù)業(yè)務(wù)需求,進(jìn)一步抽象出來的角色和層,不影響 MVC/MVP 體系。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。