閱讀時長: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
更多好文
請掃描下面二維碼
歡迎關注~