為什麼要MVC

2022-02-09 03:28:09 字數 1834 閱讀 8737

最近在公司寫了一大堆複雜的介面,終於體會到了前輩們那種上刀山下火海的感覺了。做完了之後回頭想想,mvc還是有道理的。

什麼是mvc?其實可以簡單的理解為乙個有ui的程式可以劃分為三個部分:資料層、邏輯層和應用層。當然這些名字是我亂起的。資料層顧名思義就是用來讀寫資料的地方,譬如說乙個**本的檔案。邏輯層就是使用者在介面上的操作的抽象,譬如說要通過名字來查詢訊息啦,給乙個關鍵字求得篩選後的**資訊列表啦。應用層指的就是那一堆控制項了。mvc三個字母分別指的是model、view和controller,也就是模型、檢視和控制器了,分別對應於資料層、應用層和邏輯層。

以前在看mvc的時候總是被一些教條主義的東西迷惑,說什麼在mvc裡面,mv解耦,所以m可被替換,v也可被替換。這個時候往往會感到迷惑。為什麼模型,或者說資料層要被替換?為什麼檢視,或者說介面要被替換?其實這在乙個不是複雜到神級級別的程式裡面是不會發生的。但是mvc並不是為了讓你能夠實現模型被替換或者試圖被替換而產生出來的,我覺得這個模式(其實這不是設計模式的其中一項,真的)更加重要的特點是可以讓你的程式寫起單元測試來更加容易。

還是**本,現在有乙個要求,說在輸入人的名字之後,只要系統檢查出你超過0.5秒沒有持續輸入,那麼底下的列表就會自動根據你上面的輸入進行篩選。其實這有點像outlook。這要怎麼寫單元測試?我們知道雖然正規的測試會有一大堆用來自動完成介面操作的工具啊,或者類庫,但是作為單元測試來講我們並不需要去做這種事情。因為單元測試是程式設計師寫的,凡是程式設計師寫的東西當然是需要盡快得到結果的。一般的開發方法是寫一點**,寫一點測試,跑,有bug改沒有bug繼續。我們在開發程式的時候會不斷地、頻繁地跑單元測試,來看看我們的東西是不是有問題,或者在重構的時候我們對於我們的**正確的信心會大一點。

那介面怎麼辦呢?難道我們真的要去引入乙個庫來搞介面的自動測試嗎?當然想要也可以,不過這畢竟太複雜,而且這一類的工具的穩定性其實都不是特別好,被誤導的機率倒是大增。這僅僅是對於程式設計師來講的,當然搞測試的那些人自有他們的辦法。那既然我們不做介面的自動測試那怎麼知道文字框被輸入之後究竟篩選出來的資料對還是不對呢?

答案:mvc。

為什麼view,也就是試圖,也就是介面,可以被替換是一件很重要的事情?想一想,如果控制項可以被換成單元測試的一段**,那豈不是很爽麼?舉個例子,我們要告知使用者說,我們的事情已經做了一半了,這個時候我們可能會去設定進度條的位置。但是「告訴使用者說我們的事情已經做了一半」跟「設定進度條的位置」其實是完全無關的兩件事情。因此我們的controller要負責通知view說事情做了一半了,然後view就可以去設定進度條的位置了。現在我們把view換成單元測試的一段**,這個時候就變成controller通知測試程式說事情已經做到一半了,然後測試程式就會去檢查說現在是不是應該做到了一半,如果應該,顯然這個用例就通過了。

那model呢?model可以簡單的理解為資料來源,其實當然不只是那麼簡單,不過這樣理解會讓我們更容易接受一點。資料來源是什麼,當你寫單元測試的時候,去連線乙個資料庫來獲得資料來源,然後就操作controller,這個時候你如果不親自去讀一下資料庫,你怎麼知道controller給你的東西究竟是對的還是錯的?顯然model我們也可以換掉,測試程式偽造資料成為乙個model,然後插入controller,事情就解決了。資料是我們自己給的,那controller應該提供什麼我們也能知道了。

於是,使用了mvc之後,單元測試想換model就換model,想換view就換view,測試什麼就非常容易了。至於說使用者停止輸入0.5秒之後是不是會真的去進行資料的篩選,這個我們手工測試就好了,而且那些搞測試的人也會幫我們檢查的。

好吧,說到這裡有人可能會問為什麼我沒有給出乙個demo?這東西太虛,實踐實踐自己體會一下就行了,而且mvc變形那麼多,有model-view-presenter,還有最近興起的model-view-viewmodel等等,其實現都跟傳說中的那個類似橋接模式的東西差別甚遠。這個自己去看一看就好了。

為什麼要選擇ISP 為什麼要選擇AHD

在影象傳輸中,我們為什麼選擇nextchip?為什麼要選擇isp?為什麼要選擇ahd?為什麼選擇北京冠宇銘通?這個問題我倒著回答各位 一 北京冠宇銘通科技是nextchip目前為止唯一一家正式官方授權 車載產品廠家之一 二 ahd和其他幾種傳輸方式相比,擁有自己的專利,其他幾家有專利的沒有幾個,如果...

為什麼要分詞

這裡不討論這個問題,我要說的為什麼要分詞?分詞是什麼!有人問 分詞有什麼作用啊?某人答 搜尋引擎要用到中文分詞,所以非常重要 這完全是廢話,說了等於沒說。搜尋引擎又為什麼要分詞呢?其實一般意思上指的分詞是比較狹隘的意思,指中文的詞是怎樣劃分的。因為中文沒有空格,所以要理解一篇文 章,你首先當然要切分...

為什麼要重構

在現實工作中,重構 更多被用來成為彌補缺陷 增加功能 修改設計等工作,而很多人潛意識裡也認為重構就是修改 重寫 而這往往曲解了重構的本意。重構是乙個過程,是建立在不違背外在行為的前提下,對 進行修改,改進程式的內部結構。重構不等於重新設計,軟體工程裡一定要先進行設計,再進行編碼,而如果你在之後對設計...