淺談Laravel中的設計模式(一) SoC 關注點分離

閱讀時長:7分鐘html

技術預備:熟悉Laravel的使用程序員

關注點分離(Separation of Concerns, SoC)

這個設計模式應該做爲咱們開發和架構的原則,在開發某個業務邏輯時,應將不一樣的功能點進行劃分,下降耦合度。編程

1、首先關注點是什麼呢?

舉例來講,咱們打遊戲放技能時一般都是要鍵盤和鼠標一塊兒操做的,可是本質上鍵盤只負責選擇技能,而鼠標只負責選擇對象,這就是兩個不一樣的關注點。segmentfault

在軟件中,能夠舉一個最通俗的例子,MVC分層。設計模式

Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。bash

View(視圖)是應用程序中處理數據顯示的部分。微信

Controller(控制器)是應用程序中處理用戶交互的部分。架構

甚至於所謂的面向切面編程AOP,也是一種SoC的實現。spa

在這裏,咱們能夠用Laravel的Eloquent舉例設計

Eloquent裏將關注點分爲了:Attributes、Event、Relationships等Trait模塊,不一樣的Trait模塊只負責對應的功能,這樣就將模型的邏輯成功分離。

2、爲何須要關注點分離?

因爲關注點,也就是邏輯,混雜在一塊兒會使軟件難以維護,回想一下本身初學編程時寫的那些代碼就知道有多可怕了,一個function裏上百行代碼,很是不利於調試和修改。

面對需求的變動,將關注點分離以後就不須要大幅度的修改代碼

例如一個需求:

用戶投票後進行發郵件提醒

若是咱們用「直男型」的代碼,大概邏輯就是:

if(投票成功){
   $mail = new Mail();
   $mail->sendTo = "123@qq.com";
   $mail->title = "你中大獎了";
   $mail->content = "纔怪呢";
   //此處省略100行代碼
   $mail->send();
}
複製代碼

這時需求變動了,用戶投票後進行微信通知,估計程序員會當場崩潰。

並且這樣寫也有個問題,若是郵件服務當時不可用,將會致使投票也會失敗。

若是咱們將發送郵件封裝在Mail類裏面,微信通知封裝在WeChat類裏面,每次調用時只須要靜態調用

if(投票成功){
    $data = [
        xxx
    ];
    Mail::sendMail($data);
}
複製代碼

這樣即便需求變動了,也只是屏蔽一行代碼,加一行代碼,徹底不須要重寫整個邏輯。

if(投票成功){
    $data = [
        xxx
    ];
    //Mail::sendMail($data);
    WeChat::sendMsg($data);
}
複製代碼

業務邏輯的代碼中再也不含有針對特定領域問題代碼的調用,也就是達到了代碼複用的功能,而服務是否可用的檢測也能夠放到對應的Mail或WeChat類中去執行。

3、關注點如何分離?

這裏舉幾個經常使用的例子:

1. 縱向分離

即使是最初級的程序員也都接觸過,多是你並無意識到而已。也就是所謂的MVC架構,能夠看作是一個請求進來後,須要通過的路徑。

2. 橫向分離

也就是模塊之間的分離,如商品模塊、訂單模塊、用戶模塊等。

3. 切面分離

就是所謂的面向切面編程AOP。能夠將一些跨多層邏輯的功能獨立封裝起來,例如Log日誌功能,能夠在C層進行日誌記錄,也能夠在M層進行日誌記錄。

4、結語

在實際的工做中你會發現,軟件開發就是這樣,沒有什麼是不變的,惟一不變的,就是變化。 至此,關注點分離這塊內容暫告一段落。

資料參考

segmentfault.com/a/119000000…

www.cnblogs.com/asis/p/arch…

www.cnblogs.com/wenhongyu/a…

更多好文

請掃描下面二維碼

歡迎關注~

相關文章
相關標籤/搜索