1. 程式人生 > >深入理解 MVC 在實際開發中和thinkPhp、angular、vue框架關係,理解什麼是 MVP MVVM

深入理解 MVC 在實際開發中和thinkPhp、angular、vue框架關係,理解什麼是 MVP MVVM

MVC 簡介

MVC(Model View Controller),是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。主要目的提高了軟體可維護性、可複用性,也因為把 模型-視訊-控制器,進行抽象分離開發,有助於管理複雜的應用程式,因為您可以在一個時間內專門關注一個方面。例如,您可以在不依賴業務邏輯的情況下專注於檢視設計。同時也讓應用程式的測試更加容易。

  • Model(模型)是應用程式中用於處理應用程式資料邏輯的部分。
      通常模型物件負責在資料庫中存取資料,前端表現為和後端之間介面呼叫。
  • View(檢視)是應用程式中處理資料顯示的部分。
      通常檢視是依據模型資料建立的。
  • Controller(控制器)是應用程式中處理使用者互動的部分。
      通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。

MVC 關係圖

我們以web前端為例,來解釋一下 M-V-C 三者之間的關係,當用戶開啟一個網站後

  • 載入靜態檔案 html、css、js
  • View 渲染出第一次檢視,這時候是沒有資料的,View 呼叫 Model 方法
  • Model 呼叫後端介面,獲取到初始化資料並快取在本地,通知 View 進行資料填充
  • 使用者操作介面,發起事件 => Controller 接收到事件
    • 如果是切換頁面的,則進行檢視選擇,View 改變之後,發現需要有資料沒有,則呼叫 model 方法,進行重新獲取資料
    • 如果是資料增、刪、改,則呼叫 Model 方法進行修改,Model 通知檢視做相應調整

到這裡大家還是會感覺到比較抽象,沒有實際的感覺,下面我們用後端一個框架(php 中的 thinkPHP)前端中的 vue 來理解這三者之間的關係

MVC 從後端到前端簡單發展歷程

沒有前端工程師的年代

在很多年前,當時 js 剛起步,由於效能問題,前後端分離還沒開始等因素,但是網站開發僅僅是後端一個人的事,他們不寫介面,而是使用資料塞入html方式進行開發。

最早以 php 為例,是 php + html + css 開發模式,但是也同樣遇到 php 和 html 混編,導致程式碼可以維護性、複用性、開發的專注性、協作性,都非常低,為了改變這種現狀,出現了很多解決方案,而 thinkPHP 提供了 MVC 開發模式的解決方案,大大的改變了那種垃圾程式碼的現狀,讓開發者感受到了爽的感覺。

thinkPHP 中的 MVC

在 thinkPHP 中

  • Model 就是作為,資料庫直接的增、刪、改、查,四個部分的,其它事情都不做,而且也只有 Model 可以直接和資料庫進行打交道
  • Controller 比真實的控制器能力要強,它不僅僅承載使用者操作事件接受者、檢視選擇、資料庫狀態改變,它還把資料庫通知檢視渲染資料的能力交給了它
  • View 根據 Controller 選擇的檢視,Controller 給與的資料進行檢視渲染,並把使用者操作的事件通知給 Controller 進行處理

thinkPHP MVC 關係圖

可以看出和 MVC 概念裡面不同的是,Model 沒有直接通知 View 改變的能力,全部需要經過 Controller 進行處理加工,然後放入到 View 進行渲染(也就是另一種開發模式 MVP)

前端工程師崛起

後來因為網際網路的發展,業務開發的業務複雜度日益增長,使用者對於也沒的體驗要求越來越高(體驗式經濟)純服務端渲染的形態體驗肯定不可能非常好,也由於 js 的快速發展(得益於 Google 的 v8 引擎)使得前端工程師崛起了。

js 的崛起使得,使用者對 web 互動操作的時候,可以立馬可以得到相應,且可以做動畫,而不是傻不拉幾的開始請求新的頁面,在哪等待瀏覽器的載入、

而後為了使得前端開發更便捷,dom操作更方便,也出現了 jq 為代表的很多框架,但是依然沒有從軟體設計模式上去解決 好維護、好協同、更專注的問題,這個階段主要是對於常用的操作進行封裝階段。

這個階段在前端抽象層來說,Model View Controller 三者相當耦合。

而後出現了 angular 改變了這種格局,angular 的 MVC 的抽象

  • View 很清晰,就是 HTML + CSS
  • Controller 裡面進行業務邏輯處理 & 後端資料、狀態的快取
  • Model 比較不清晰,沒有明確說明,其實在 angular 中 Model 就是調介面的 ajax 但由於框架本身沒有明確的定義,所以有很多時候,開發者又耦合到 C 中

angular的出現簡直算是跨時代的產物,從此前端 jq 獨大的局面開始變化。angular 中除了使用了 MVC 開發模式外,還引入很多比較好的概念,比如:依賴注入、雙向資料繫結等,具體這邊不做說明,今天的主題不是說這個。

angular 雖然使用了 MVC ,但是對於很多東西的定義的不夠清晰,比如 Model,比如 Controller 中存在資料的快取 + 業務邏輯的處理,這時候我們中國的開發者就有重新定義了一下 MVC,也就是現在中國很流行的 vue

vue 中 的實際上有兩個 MVC,第一個 MVC,是相對於後端的,第二個MVC是前端內部的資料和檢視直接的MVC關係

首先我們來說第一個,相對於後端的MVC

  • Model 是指調介面的 ajax,框架中沒有明確的定義,但是在樣例中卻表達的很清楚,Model 需要單獨建立資料夾,進行基於 promise 的 ajax 的封裝,Controller 中如果使用則進行呼叫
  • Controller 負責業務邏輯,檢視選擇,資料初始化等(在這個抽象裡面 C 應該稱作 P,MVP 的 P 和 php 中的 C 很像,因為 Model 不直接和 View 進行打交道)
  • View 就是 HTML + CSS 對於資料的渲染,事件鉤子呼叫 C

第二個,純前端內部的 MVC 抽象嗎,後來稱作 MVVM

  • Model 就是 vue 中的 data ,data 變化 由 VM 引擎 自動同步至檢視
  • Controller 就是 vue 中的 methods,負責業務邏輯處理、檢視選擇
  • View 就是 HTML + CSS 對於檢視的渲染,時間鉤子呼叫 methods 函式(當然提供的其它功能這邊就不做介紹啦)

到這裡基本就把東西介紹完啦,感謝大家讀完,我沒有多寫細節上的介紹,也沒有對框架的作者背景,為啥會開發這個框架等方面進行介紹,只是簡單的發展歷程稍微介紹,更多的是讓大家理解 MVC MVP MVVM 和框架之間的關係,並且知道他們的抽象層,分別負責什麼。

需要下方評論或+V:

相關推薦

輕鬆理解-中高階java開發必知必會 之 三兄弟 HashMap HashTable ConcurrentHashMap

這段時間比較閒,可以把之前理解整理出來的文件不斷地挪到這上面來 言歸正傳: 在日常工作中 你會選擇hashMap 還是HashTable 還是ConcurrentHashMap 讓他們先來自我介紹吧: 首先HashMap和HashTable都實現了Map介面,但是HashTable是

理解IonicAngularCordova及外掛之間的關係

本文提及概念不區分Ionic 1/Angular 1和Ionic 2/Angular 2。 首先我們需要明確以下幾個概念: 1.即使我們將移動端web頁面做得和原生應用及其相似,在我們的頁面中也無法像原生應用那樣呼叫原生的能力,當然通過輸入框觸發鍵盤

scrapy框架學習理解不深得到的問題我遇到的 from avimageitems.items import AvimageItem ModuleNotFoundError: No module named 'scrapy name'

    心情複雜呀,這個問題之前找不到解決的思路,原因是沒有人會像我這麼粗心的,沒有認真去看書就寫,不過我是真的沒注意到這個框架名的是什麼,現在才發現setting中的BOT_NAME的作用,不過我是在之前的課程裡瞭解到的  

一份全面的ReactAngularVue.js比較指南

對於開發人員而言,選擇技術棧有時是一件相當棘手的任務。因為您需要綜合考慮諸如:預算、時間、應用大小、終端使用者、專案目標、以及可用資源等多方面因素。 無論您是初學者、開發人員、自由職業者還是專案架構師,只有詳細瞭解了每種框架的優、缺點,才能做出明智的決定。因此,

Angular自動生成項目主要文件分析

css htm font html .com 項目 img mage span 1. 項目主要文件存放的路徑 2.app.module.ts模塊解析 擴展 文件的關系是從屬關系:|--app.m

前端框架選型續 && 分享下使用 BackboneVueAngularReact 的經驗

上週,知乎上有幾篇關於 Angular 和 Vue 對比的文章。本來想著的是,這些文章倒是可以指導下新手,作一些技術選型。可遺憾的是,開始的文章失去了一些偏頗,後面的文章則開始了一些攻擊性行為。慢慢的,整個知乎上便是充滿了一些戾氣,開始了無盡的網路暴力。

JavaScript實現簡單的雙向資料繫結(EmberAngularVue

什麼是雙向資料繫結呢? 簡單的說 就是UI檢視與資料繫結在了一塊 也就是資料和檢視是同步改變的 雙向資料繫結最常見的應用場景就是表單 (應用場景還是很有限的) 現在我們要實現這樣一個簡單的資料繫結 輸入欄中輸入字元 和它繫結的節點內容

VueJSAngularReact原理

MVVM框架模式   Vue.JS、AngularJS、ReactJS,它們都是MVVM資料驅動框架系列的一種。   MVVM由微軟提出,它借鑑了桌面應用程式的MVC思想,在前端頁面中,把Model用純JavaScript物件表示,View負責顯示,兩者做到了最大限度的分離

Hbuilder支援jqueryzeptoangularextdojo 等js框架的提示嗎

http://ask.dcloud.net.cn/article/54 HBuilder有通行的js掃描分析提示,大部分js庫都可以方便的提示。 但js是一門超級靈活的語言,通行分析有時分析的不夠完美,如果對框架做單獨優化配置,可以有更好的提示。 DCloud官方對

8分鐘為你詳解ReactAngularVue三大前端技術

【引言】 當前世界中,技術發展非常迅速並且變化迅速,開發者需要更多的開發工具來解決不同的問題。本文就對於當下主流的前端開發技術React、Vue、Angular這三個框架做個相對詳盡的探究,目的是為了解開這些前端技術的面紗,看看各自的廬山真面目。 【React】 React(也被稱為React.js或Reac

Virtuoso 中 display.drftechfile.tftech.db 之間的關係以及 Packet 在它們之間的作用

[https://www.cnblogs.com/yeungchie/](https://www.cnblogs.com/yeungchie/ "https://www.cnblogs.com/yeungchie/") ### 一般工藝庫下的“技術檔案”有 tech.db 和 techfile.tf ,

深入理解DIPIoCDI以及IoC容器

auto lib 有感 containe jpg 可擴展性 松耦合 and 成了 摘要 面向對象設計(OOD)有助於我們開發出高性能、易擴展以及易復用的程序。其中,OOD有一個重要的思想那就是依賴倒置原則(DIP),並由此引申出IoC、DI以及Ioc容器等概念。通過本文我們

python 深入理解 賦值引用拷貝作用域

似的 list 參數傳遞 question net 做的 標準 理解 官方 python 深入理解 賦值、引用、拷貝、作用域 在 python 中賦值語句總是建立對象的引用值,而不是復制對象。因此,python 變量更像是指針,而不是數據存儲區域, 這點

深入理解【缺頁中斷】及FIFOLRUOPT這三種置換算法

利用 剔除 存在 table repl 重新 PE 刪除 上下文 缺頁中斷(英語:Page fault,又名硬錯誤、硬中斷、分頁錯誤、尋頁缺失、缺頁中斷、頁故障等)指的是當軟件試圖訪問已映射在虛擬地址空間中,但是目前並未被加載在物理內存中的一個分頁時,

深入理解Lua的閉包一:概念應用和實現原理

觀點 數組 line Language 場景 test 詞法 nil 實參 本文首先通過具體的例子講解了Lua中閉包的概念,然後總結了閉包的應用場合,最後探討了Lua中閉包的實現原理。 閉包的概念 在Lua中,閉包(closure)是由一個函數和該函數會訪問到的

理解開發HD 錢包涉及的 BIP32BIP44BIP39

小結 ica 深度 -s 安全 lips sweet 賬號 需要 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水,來看看這邊文章吧。 數字錢包概念 錢包用來存錢的,在區塊鏈中,我們的數字資產都會對應到一個賬戶地址上, 只有擁有賬戶的鑰匙(私鑰)才可以對

深入理解NGINX 模組開發與架構解析》之摘抄學習

1.基於Nginx框架開發程式有5個優勢:     (1).Nginx將網路、磁碟及定時器等非同步事件的驅動都做了非常好的封裝,基於它開發將可以忽略這些事件處理的細節;     (2).Nginx封裝了許多平臺無關的介面、容器,適用於跨平臺開發。

Flutter完整開發實戰詳解(五 深入探索)

作為系列文章的第五篇,本篇主要探索下 Flutter 中的一些有趣原理,幫助我們更好的去理解和開發。 前文: 一、Dart語言和Flutter基礎 二、 快速開發實戰篇 三、 打包與填坑篇 四、Redux、主題、國際化) 一、WidgetsFlutterBin

效能負載壓力測試——從效能測試角度理解系統開發

引言 最近,由於舊機器下線,我對過去部署的一些服務做了遷移,順帶對新部署的服務做了一個簡單的效能測試。在實施過程中,我發現自己對很多效能指標的理解很不清晰,對於併發數、壓力、吞吐量、延遲等概念,通常是以望文生義的方式使用。對於系統應該關注什麼樣的效能指標,認識也不完整。為此,我閱讀了wiki百科以及一些部落