摘要:沒有任何意外,王小二的公司用來開發(fā)公司的主打產品。臃腫的著手開干吧小二打開熟悉的,找到提交訂單模塊的。要不再去請教下哥的煩惱小二找到哥,詳細的描述了他的問題。
流行的MVC架構模式
如今的Web開發(fā),各種框架風起云涌,勢如破竹。
從國民第一的ThinkPhp到稱霸全球的Laravel,這些框架有一個共同特征,都采用了MVC的架構模式。
沒有任何意外,王小二的公司用Thinkphp來開發(fā)公司的主打產品。
Get新需求一天,小二剛到公司,正打算坐下來喝杯茶。
老大走了過來:“小二啊,現(xiàn)在有個新的需求。咱們之前提交訂單的模塊,需要增加發(fā)送郵件的功能,你看看能不能實現(xiàn)?”
小二想了想說:“沒問題,最多3天搞定!”
看王小二胸有成竹的樣子,老大滿意的點了點頭。
臃腫的Controller著手開干吧!小二打開熟悉的IDE,找到提交訂單模塊的Controller。
OMG!不看不知道,一看嚇一跳,這個Controller的代碼竟然接近2000行。
因為用戶提交訂單時,會與其他模塊進行交互,需要的數(shù)據(jù)也比較復雜。
只見此Controller,從Model層各種拿數(shù)據(jù),然后各種邏輯處理,怪不得代碼到了將近2000行。
“哎,這2000行代碼,看著就頭疼,可讓我怎么寫啊”...小二嘆氣道。
“要不再去請教下C哥?”
MVC的煩惱小二找到C哥,詳細的描述了他的問題。
C哥喝了口水,淡定的說:“這個嘛,我之前也遇到過。”
“您也遇到過,怎么解決的?”
“這個問題,哈哈,姑且就叫MVC的煩惱吧!MVC將View與Model進行了分離解耦,這固然很好,但很多人就將業(yè)務邏輯的處理寫在了Controller里,導致Controller越來越臃腫,以致最后都無法維護。”
“對對對,您說的太對了,我就經常這樣寫。”
[圖片:臃腫的代碼]
C哥繼續(xù)說道:其實,Controller不應該處理過多的業(yè)務邏輯。給你舉兩個例子就明白了。
控制器,就像遙控器一樣。
你見過遙控器關心電視怎么播放視頻嗎?沒有,遙控器只是發(fā)送播放視頻的信號,具體的播放視頻的細節(jié),遙控器不會關心。
控制器,就像將軍一樣。
你見過將軍親自為每位士兵配備武器嗎?細節(jié)部分,將軍不必過問,將軍的職責是領兵打仗,這叫各司其職,否則就亂了。
說到這里,小二恍然大悟:“聽C哥一席話,勝讀十年書啊!”
“既然這樣,就給Controller減減肥吧。”C哥說到
“是啊,但是怎么減肥呢?”
“我給你講一種設計模式-外觀模式,你就懂了”。
“好啊好啊,洗耳恭聽”。
C哥又講到:
外觀模式,提供了統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀模式定義了一個高層接口,使得子系統(tǒng)更加易用。
也就是說,干一件很復雜的事的時候,你想團隊中每個人都花一年半載去學習如何做這件事嗎?利用外觀模式,我只需要指定一個人去學會這些復雜的步驟,然后我再告訴這個接口人去干就行了。
Facade外觀模式的應用“如果讓你實現(xiàn)上面那個需求,你可能會找到用戶提交訂單的Controller,然后在Controller里寫下面一大堆代碼。是不是?”
/****文件名:SubmitController.class.php(用戶提交模塊controller)****/ //..............接上...2000行代碼..............// //獲取用戶郵箱 public function get_user_email($uid){ return new User()->get_user_email($uid); } //獲取要發(fā)送給用戶的內容 public function get_email_content($uid){ return new Email()->get_email_content($uid); } //發(fā)送郵件 public function send_email($email,$content){ return new Email()->send_email($email,$content); } //用戶提交訂單觸發(fā)的方法 public function submit(){ $email=$this->get_user_email($uid); $content=$this->get_email_content($uid); $this->send_email($email,$content); }
“對對對,我會這么寫”。
"其實你用的ThinkPhp,有一層叫Logic層,關于業(yè)務邏輯處理的部分,你可以寫在Logic層里。這樣,Controller層就變得很輕量了,好維護了。"
/****文件名:SendEmailFacadeLogic.class.php(發(fā)送郵件Logic)****/ //獲取用戶郵箱 private function get_user_email($uid){ return new User()->get_user_email($uid); } //獲取要發(fā)送給用戶的內容 private function get_email_content($uid){ return new Email()->get_email_content($uid); } //發(fā)送郵件 public function send_email($uid){ $email=$this->get_user_email($uid); $content=$this->get_email_content($uid); return new Email()->send_email($email,$content); }
/****文件名:SubmitController.class.php(用戶提交模塊controller)****/ //..............接上...2000行代碼..............// D("SendEmail","Logic")->send_email($uid);
“你看,加了Logic層,業(yè)務邏輯都放在Logic里面去處理,Controller是不是瘦了很多呢?Logic層為Controller提供了一個高層的接口用來發(fā)送郵件,也就是Facade模式的應用。”
加深理解“小二,明白些了吧?”
“嗯嗯,明白了好多,猶如醍醐灌頂!”
“為了加深你的理解,我給你畫個簡單的實例圖吧”。
“真的嗎?太謝謝C哥了”。
看了C哥畫的圖,小二小徹小悟了。
“C哥,F(xiàn)acade模式真不錯,你看,這樣統(tǒng)一成簡單的接口后:”
1、降低了系統(tǒng)的耦合度。提交訂單的Controller,再也不用與UserController、EmailController等耦合了。現(xiàn)在只需要關心SendEmailFacadeLogic就可以了。
2、并且,用戶使用了Facade模式后,有了統(tǒng)一的入口,就很容易監(jiān)控客戶對系統(tǒng)的使用了。就如Thinkphp的單一入口一樣。
“嗯嗯。小二真聰明,確實是這樣。”
更多精彩,請關注公眾號“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩”的事兒。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22589.html
摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術并且有豐富的程序開發(fā)調試優(yōu)化經驗,所以線程相關的問題在面試中經常會被提到。將對象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對象稱之為反序列化。 JVM 內存溢出實例 - 實戰(zhàn) JVM(二) 介紹 JVM 內存溢出產生情況分析 Java - 注解詳解 詳細介紹 Java 注解的使用,有利于學習編譯時注解 Java 程序員快速上手 Kot...
摘要:概念模式為更大的代碼提供了一個方便的高層次接口,能夠隱藏其底層的真是復雜性。參考設計模式設計模式系列文章設計模式之模塊模式揭示模塊模式設計模式之單例模式設計模式之外觀模式 概念 Facade模式為更大的代碼提供了一個方便的高層次接口,能夠隱藏其底層的真是復雜性。可以把它想成是簡化API來展示給其他開發(fā)人員。 優(yōu)缺點 優(yōu)點 簡化接口 使用者與代碼解耦 易于使用 缺點 存在隱性成本,性...
閱讀 2695·2023-04-25 17:58
閱讀 2978·2021-11-15 11:38
閱讀 2378·2021-11-02 14:48
閱讀 1185·2021-08-25 09:40
閱讀 1823·2019-08-30 15:53
閱讀 1093·2019-08-30 15:52
閱讀 1031·2019-08-30 13:55
閱讀 2437·2019-08-29 15:21