成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構(gòu)淺談之MVC

開發(fā) 開發(fā)工具
很多人表示對架構(gòu)沒有任何概念,想了解下架構(gòu),但是看了網(wǎng)上的一些文章又覺得云里霧里,其實架構(gòu)遠(yuǎn)沒有那么難,今天從這篇文章開始我來給大家談?wù)劶軜?gòu),爭取讓大家都看得懂。

 

[[179178]]

 

很多人表示對架構(gòu)沒有任何概念,想了解下架構(gòu),但是看了網(wǎng)上的一些文章又覺得云里霧里,其實架構(gòu)遠(yuǎn)沒有那么難,今天從這篇文章開始我來給大家談?wù)劶軜?gòu),爭取讓大家都看得懂。

1.什么是架構(gòu)?

對于架構(gòu),業(yè)界從來沒有一個統(tǒng)一的定義,架構(gòu)一詞最初來自建筑業(yè),假如我們要蓋一棟大樓,那在完成這么一項重大工程之前肯定需要建造師的建筑圖紙,而這建筑圖紙可以說是建筑業(yè)架構(gòu)的最核心體現(xiàn),它描述了這棟大樓的外觀、內(nèi)部構(gòu)造、戶型設(shè)計、材料做法以及設(shè)備、施工等,有了建筑圖紙,才能整體的規(guī)劃整個工程,從大局出發(fā),有序的推進(jìn)項目的發(fā)展,最大程度的提高生產(chǎn)力。

所以歸根結(jié)底,架構(gòu)的目的就是為了提高生產(chǎn)力。而軟件領(lǐng)域的架構(gòu)主要體現(xiàn)在模塊之間的「高內(nèi)聚,低耦合」,這六個字聽起來有點難以理解,其實通俗來講就是單一職責(zé)的功能封裝成模塊,在模塊內(nèi)部高度聚合,模塊與模塊之間不會互相依賴,即低耦合。比如我們常用的網(wǎng)絡(luò)庫、圖片加載庫,這都是屬于兩個模塊,在每個模塊內(nèi)部功能單一,代碼高度內(nèi)聚,但是網(wǎng)絡(luò)庫與圖片加載庫又不互相依賴,都可以獨(dú)立工作,互不干擾,這就是所謂的低耦合。

而我們追求「高內(nèi)聚,低耦合」的目的很簡單,我們想讓開發(fā)人員只專注于一點,提高開發(fā)效率的同時,也對代碼的健壯性與擴(kuò)展性有很大好處。試想,如果你做的功能需要同時跟四個部門進(jìn)行合作,依賴于他們的模塊,那么你的開發(fā)效率肯定奇低,而且依賴過高,其他部門的代碼稍一改動很可能就會對你產(chǎn)生影響,而且問題還不容易定位,這將是一個定時炸彈。

所以,架構(gòu)的重要性不言而喻,但是架構(gòu)有一條原則:千萬不要過度設(shè)計!

如果你蓋的是棟大樓,你肯定需要建造師的建筑圖紙,但是如果你蓋的是一間茅草屋,你覺得你還需要請個建造師來先給你設(shè)計一張建筑圖紙再開工么?可能花在設(shè)計建筑圖紙的時間都夠你蓋完了。所以架構(gòu)一定得看不同場景的需求,如果你的工程總共就十來個文件,那么你在開發(fā)的過程中運(yùn)用各種設(shè)計模式、考慮各種分層,只會讓原本簡單的東西復(fù)雜化,還會增加工作量,這違背了架構(gòu)的初衷。

最原始、最簡單的東西反而是最高效的,只不過我們的項目慢慢變得龐大,那些最原始的框架與結(jié)構(gòu)滿足不了我們的需求了,這個時候我們必須從整體出發(fā)重新考慮整個項目的架構(gòu),通過架構(gòu)來幫助我們提高生產(chǎn)力,減少重復(fù)繁雜的工作量,提升工作效率。

2.三層架構(gòu)

說到架構(gòu),就不得不談到最經(jīng)典的三層架構(gòu)的概念,三層架構(gòu)最初是微軟提出的,并且推薦各應(yīng)用程序都應(yīng)該遵守這種分層方式,而現(xiàn)今大多數(shù)應(yīng)用程序基本都遵守這三層分層式架構(gòu)。這三層架構(gòu)分別是:表示層、業(yè)務(wù)層、數(shù)據(jù)訪問層。

三層架構(gòu)

我們拿訪問一個網(wǎng)站來舉個例子。你在瀏覽器輸入一個網(wǎng)址,訪問一個網(wǎng)站的時候,這中間經(jīng)過了這么一個過程,用戶在瀏覽器輸入 url,然后瀏覽器向 Server 發(fā)起一個 http 請求,Server 拿到這個 http 請求之后會根據(jù)相關(guān)的條件到數(shù)據(jù)庫查詢相關(guān)數(shù)據(jù),然后把數(shù)據(jù)以特定的格式(網(wǎng)站是 html 格式)返回給瀏覽器,瀏覽器再根據(jù)特定數(shù)據(jù)渲染出相應(yīng)頁面。

這其中就對應(yīng)了三層架構(gòu),首先對用戶來說,瀏覽器就是表示層,它主要是與用戶交互的頁面,根據(jù)用戶的輸入與事件,處理并顯示返回的特定數(shù)據(jù)。我們知道數(shù)據(jù)是一切應(yīng)用程序的基礎(chǔ),如果沒有數(shù)據(jù),那么沒有任何意義,所以 Server 端必須要一個強(qiáng)大的數(shù)據(jù)庫來存儲所有用戶交互產(chǎn)生的數(shù)據(jù),而對這些數(shù)據(jù)的處理,包括增、刪、改、查就屬于數(shù)據(jù)訪問層。那么連接表示層與數(shù)據(jù)訪問層的就是業(yè)務(wù)邏輯層,這包括后端程序中模型設(shè)計、驗證、業(yè)務(wù)規(guī)則、各種計算等。

所以后端的架構(gòu)是很復(fù)雜的,它除了有復(fù)雜的業(yè)務(wù)邏輯之外,還有存儲、性能、并發(fā)、負(fù)載均衡等等,所以架構(gòu)師一職最初也是針對服務(wù)端提供的職位。

3.MVC

隨著移動端的普及,手機(jī)端的應(yīng)用程序功能越來越大,項目也越來越復(fù)雜,所以移動端架構(gòu)也被越來越多的人關(guān)注與重視,但是移動端架構(gòu)遠(yuǎn)沒有服務(wù)端復(fù)雜,一是移動端的數(shù)據(jù)來源于服務(wù)端,不必有專門的數(shù)據(jù)存儲,最多有本地的緩存以及一些必要的小型數(shù)據(jù)庫,對于一些復(fù)雜的業(yè)務(wù)邏輯也更多的放在服務(wù)端,而且客戶端不必考慮成百上千萬用戶的同時訪問,移動端通常更應(yīng)該把精力專注在 UI、交互、體驗上,所以客戶端的架構(gòu)沒有那么重,但是為了讓移動端代碼分層更加清晰,代碼擴(kuò)展性更好,以及更好的高內(nèi)聚、低耦合,目前有一系列的移動端架構(gòu)方案,大家耳熟能詳?shù)谋热? MVC、MVP、MVVM、Clean 等,今天就先來針對 Android 開發(fā),來講講 MVC 的概念。

MVC 是 Model(模型)、View(視圖)、Controller(控制器) 的縮寫,其中 View 層處理界面顯示,Controller 層用來處理用戶的交互與事件,Model 層則用來定義實體對象與處理業(yè)務(wù)邏輯。

這么說難免有點晦澀難懂,我們來拿我們最熟悉的 Android 開發(fā)來舉例。

4.Android MVC

其實 Android 開發(fā)本身默認(rèn)的就是一套 MVC 實現(xiàn)。

View 層:Android 開發(fā)中的 xml 布局就是我們的 View 層,默認(rèn)情況下也建議 View 都盡量用 xml 實現(xiàn),當(dāng)然對于一些復(fù)雜的就需要我們自定義 View 了,自定義 View 同樣也是屬于 View 層,只不過大多數(shù)時候還是 xml 布局用的最多;

Controller 層:毫無疑問,Android 默認(rèn)也給我們提供了 Controller,就是 Activity & Fragment,仔細(xì)想想,是不是用戶的交互事件,如輸入、點擊、滑動等都是在 Activity、Fragment 中處理的?關(guān)于這點有人認(rèn)為 Activity & Fragment 屬于 View 層,這個我是不認(rèn)可的,View 應(yīng)該專注界面的顯示,Controller 處理用戶的交互,提供給 View 需要的數(shù)據(jù),從而讓 View 正確的顯示出來,而這都是 Activity & Fragment 的工作。

Model 層:Android 中對 View 與 Controller 有了定義,其實沒有對 Model 層做定義,而大部分架構(gòu)都不會對 Model 層做定義,因為 Model 本身是跟業(yè)務(wù)相關(guān),針對不同的業(yè)務(wù)模型,定義需要的數(shù)據(jù)模型與實體類,以及相關(guān)的業(yè)務(wù)邏輯處理,雖然 Android 沒有明確定義 Model 層,但是我們在開發(fā)中都會定義一個專門的 model package 用來統(tǒng)一管理所有的 model 文件,如 User、Order、Chat 等。

這里做個補(bǔ)充,因為對于部分初學(xué)者可能不理解什么是 Model,Model 的具體職責(zé)以及什么是所謂的業(yè)務(wù)邏輯?這里姑且說明下:

1. Model 即模型,也就是數(shù)據(jù)模型,通常就是所謂的 JavaBean 實體類,比如在界面上我們要顯示一些用戶信息,這個時候我們必須定義一個 User 對象,這個 User 對象也即所謂的 Model,如

  1. public class User { 
  2.     private int age; 
  3.     private String name; 
  4.     private ... 
  5.     public void setAge(int age) { 
  6.     } 
  7.     public int getAge() { 
  8.         return age; 
  9.     } 
  10.     ... 

通常這個就是 Model 的主要功能。

2. Model 就是一個數(shù)據(jù)模型的定義,定義了供我們使用的數(shù)據(jù)實體類而已。因為大部分我們的數(shù)據(jù)來源都是來自后端,客戶端不需要處理太多的業(yè)務(wù)邏輯,所以大部分情況下 Model 也就只包含基本的屬性與 get、set 方法。但是,并不是說明客戶端不包含任何業(yè)務(wù)邏輯,比如我們除了顯示用戶的基本信息外還需要顯示用戶的身體質(zhì)量指數(shù)(也就是 BMI),這個值不是一個 Model 自帶的屬性,而是根據(jù)一些屬性通過一定的算法算出來的,這也就是所謂的業(yè)務(wù)邏輯。

BMI 的算法很簡單,就是體重(kg)÷ (身高^2(m)),有人可能直接在顯示的頁面把這段算法寫出來,比如直接在 Activity 有如下代碼:

  1. textView.setText(String.valueOf(user.weight / (user.height * user.height))); 

這個當(dāng)然是可以,但是很糟糕,因為你需要在每一個顯示的地方都寫這么一段代碼,而它本身是屬于業(yè)務(wù)邏輯的,所以你應(yīng)該把這個算法放在 User 的 model 里處理:

  1. public class User { 
  2.     private int age; 
  3.     private String name; 
  4.     private float weight; 
  5.     private float height; 
  6.     ... 
  7.     ... 
  8.     public float getBMI() { 
  9.         return weight / height * height; 
  10.     } 

然后只需要在需要顯示的地方調(diào)用 user.getBMI() 這個方法就 ok 了,這個算法其實就是所謂的簡單的業(yè)務(wù)邏輯。

當(dāng)然以上只是舉個例子,其實很簡單的概念,但是對于一些初學(xué)者可能不能理解,特此說明下,實際開發(fā)過程中,所有跟 model 相關(guān)的一些計算都可以算作業(yè)務(wù)邏輯,而這也是 Model 的第二個重要作用。

5.MVC 與三層架構(gòu)的關(guān)系

有人可能會問了,你一會三層架構(gòu),一會 MVC 的,他倆之間到底是什么關(guān)系?

三層架構(gòu)是一種軟件領(lǐng)域最普遍的分層式架構(gòu),而 MVC 是在三層架構(gòu)的基礎(chǔ)上設(shè)計的一種框架型架構(gòu),三層架構(gòu)是一種宏觀的概念,而 MVC 就是一種比較具體的三層架構(gòu)的框架實現(xiàn),我們在 MVC 的基礎(chǔ)上把不同類別的代碼文件進(jìn)行分類就可以了,所以他們之間的關(guān)系可以用下圖來表示:

 MVC 與三層架構(gòu)的關(guān)系

上圖可以看到,View 層和 Controller 層都屬于三層架構(gòu)的表示層,而 Model 層屬于業(yè)務(wù)層,有人又問了,那數(shù)據(jù)訪問層怎么沒有相對應(yīng)的呢?這個就是有爭議的地方了。

有人認(rèn)為 Model 層除了定義業(yè)務(wù)需要的實體類與簡單的邏輯算法處理之外,還應(yīng)該包括對數(shù)據(jù)庫的操作、對網(wǎng)絡(luò)等的操作等,這對后端開發(fā)來說沒問題,因為后端的數(shù)據(jù)全部來源于數(shù)據(jù)庫,而且后端可以很方便的跟數(shù)據(jù)服務(wù)器進(jìn)行連接,而 Model 的業(yè)務(wù)邏輯大多都是來自對數(shù)據(jù)的處理,所以這種方式很正常。

但是對于客戶端來說差別就大了,我們知道客戶端的數(shù)據(jù)來源大多來自服務(wù)端的接口請求,但是很可能同時有本地數(shù)據(jù)庫、本地的文件都能提供數(shù)據(jù),比如可能會有離線操作,比如可能為了用戶體驗,用戶斷網(wǎng)的時候會做緩存處理,也就是說客戶端的數(shù)據(jù)來源有多種多樣,而 Model 本身的主要職責(zé)應(yīng)該定義業(yè)務(wù)需要的數(shù)據(jù)模型以及簡單的邏輯處理,如果同時也要處理本地數(shù)據(jù)庫與網(wǎng)絡(luò)數(shù)據(jù)未免變得臃腫起來,而且職責(zé)不清晰。

所以,我是非常不建議在 Model 層做多余的數(shù)據(jù)處理工作的,而對應(yīng)三層架構(gòu)我強(qiáng)烈建議客戶端的開發(fā)中應(yīng)該多一層 data 層,也就是所謂的數(shù)據(jù)處理層,這一層包含了對 database、network、sharedpreference 等數(shù)據(jù)的處理,Model 層回歸最簡單、最本質(zhì)的模型職責(zé),只定義業(yè)務(wù)需要的數(shù)據(jù)模型與簡單的邏輯處理即可。

6.MVC 的優(yōu)缺點

雖然 Android 開發(fā)框架并不是嚴(yán)格意義上的 MVC,但是顯而易見,默認(rèn)的開發(fā)就是 MVC 框架,優(yōu)點也很明顯,學(xué)習(xí)成本很低,理解很容易,對 UI 層與業(yè)務(wù)層做了分離,我們只需要對 Model 層與 data 層做個簡單的分層與封裝,就是一個擴(kuò)展性還不錯、還算清晰的開發(fā)架構(gòu)。

但是缺點也很明顯,隨著功能的不斷迭代與越來越復(fù)雜的交互處理,Controller 層也就是 Activity、Fragment 中的代碼越來越多,變得很臃腫,難以維護(hù),尤其在需求變化的時候,改起來特別痛苦,我甚至見過一個 Activity 有幾千行代碼的情況,試想這得多痛苦,當(dāng)然出現(xiàn)這種情況本身也有程序員自己的問題,但是這暴露了 MVC 這種架構(gòu)的缺點。

MVC 可以說是最經(jīng)典的架構(gòu)模式,它適用于大部分的開發(fā)場景,如果你對架構(gòu)不怎么了解,那么建議老老實實的使用 MVC,在此架構(gòu)基礎(chǔ)上進(jìn)行封裝與優(yōu)化絕對夠了,只是項目到了一定體量了,需求也越來越復(fù)雜,總歸是會碰到難以擴(kuò)展、Controller 層發(fā)展成“死胖子”的情況,這個時候怎么解決呢?且聽下回分解,當(dāng)然下篇什么時候我也不清楚。

【本文為51CTO專欄作者“stormzhang”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者(微信號:googdev)】

責(zé)任編輯:趙寧寧 來源: AndroidDeveloper
相關(guān)推薦

2011-07-07 11:03:07

iOS MVC Objective-

2009-07-22 13:24:24

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2019-07-26 08:39:29

JavaWebMVC

2009-06-05 11:01:23

struts mvcMVC工作原理

2009-04-24 09:43:09

.NETASP.NET框架

2023-04-11 07:50:27

軟件架構(gòu)設(shè)計

2009-12-07 09:23:05

ASP.NET MVC

2021-03-30 08:50:26

零信任架構(gòu)零信任網(wǎng)絡(luò)威脅

2012-02-07 10:40:13

MVCJava

2009-07-20 12:42:04

MvcContrib.ASP.NET MVC

2021-03-22 11:49:19

架構(gòu)運(yùn)維技術(shù)

2010-06-23 15:44:03

ASP.NET MVC

2011-01-28 09:45:29

ASP.NET MVC

2009-12-21 10:05:10

ASP.NET MVC

2009-04-30 09:15:25

三層結(jié)構(gòu)MVC架構(gòu)

2019-04-29 11:00:14

架構(gòu)負(fù)載均衡互聯(lián)網(wǎng)

2019-08-27 15:56:44

MySQL 互聯(lián)網(wǎng)數(shù)據(jù)庫

2016-08-31 09:58:55

JavascriptFlux架構(gòu)

2018-01-12 14:20:37

數(shù)據(jù)庫MySQL高可用架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美在线视频不卡 | 欧美成人一区二免费视频软件 | 欧美二区在线 | 日韩精品一区二区三区中文在线 | 久久久久久www | 亚洲h视频| 一区二区在线免费观看 | 精品国产乱码久久久久久闺蜜 | 在线日韩视频 | 国产美女视频黄a视频免费 国产精品福利视频 | 久久青视频| 北条麻妃av一区二区三区 | 国产伦精品一区二区三毛 | 日韩三级电影一区二区 | 91在线视频网址 | 欧美一区二区三区视频 | 亚洲午夜av久久乱码 | 日本一区二区不卡视频 | 久操亚洲| 超碰97人人人人人蜜桃 | 国产伊人精品 | 午夜免费电影 | 欧美韩一区二区三区 | 国产精品3区 | 精品乱码一区二区三四区 | 久久成人国产精品 | 日韩一二区 | 欧美日韩在线一区二区三区 | 九九九视频在线观看 | 狠狠的操| 日韩毛片| 国产在线资源 | 亚洲aⅴ| 日韩欧美在线观看 | 中文无吗 | 精品视频久久久 | 国产精品一区二区三区在线 | 黄色在线免费网站 | 亚洲一区国产 | 美女视频黄的免费 | 久久久久成人精品亚洲国产 |