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

 

閱讀時長:7分鐘

技術預備:熟悉Laravel的使用

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

這個設計模式應該作爲我們開發和架構的原則,在開發某個業務邏輯時,應將不同的功能點進行劃分,降低耦合度。

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

舉例來說,我們打遊戲放技能時通常都是要鍵盤和鼠標一起操作的,但是本質上鍵盤只負責選擇技能,而鼠標只負責選擇對象,這就是兩個不同的關注點。

舉例來說,我們打遊戲放技能時通常都是要鍵盤和鼠標一起操作的,但是本質上鍵盤只負責選擇技能,而鼠標只負責選擇對象,這就是兩個不同的關注點。

在軟件中,可以舉一個最通俗的例子,MVC分層。

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

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

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

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

在這裏,我們可以用Laravel的Eloquent舉例

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

二、爲什麼需要關注點分離?

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

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

例如一個需求:

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

如果我們用“直男型”的代碼,大概邏輯就是:

if(投票成功){
  $mail = new Mail();
  $mail->sendTo = "[email protected]";
  $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類中去執行。

三、關注點如何分離?

這裏舉幾個常用的例子:

1. 縱向分離

即便是最初級的程序員也都接觸過,可能是你並沒有意識到而已。也就是所謂的MVC架構,可以看做是一個請求進來後,需要經過的路徑。

2. 橫向分離

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

3. 切面分離

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

四、結語

在實際的工作中你會發現,軟件開發就是這樣,沒有什麼是不變的,唯一不變的,就是變化。

至此,關注點分離這塊內容暫告一段落。

 

資料參考

https://segmentfault.com/a/1190000009541069

https://www.cnblogs.com/asis/p/architecture-Soc.html

https://www.cnblogs.com/wenhongyu/archive/2017/12/06/7992028.html

更多好文

請掃描下面二維碼

歡迎關注~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章