閱讀時長:7分鐘html
技術預備:熟悉Laravel的使用程序員
這個設計模式應該做爲咱們開發和架構的原則,在開發某個業務邏輯時,應將不一樣的功能點進行劃分,下降耦合度。編程
舉例來講,咱們打遊戲放技能時一般都是要鍵盤和鼠標一塊兒操做的,可是本質上鍵盤只負責選擇技能,而鼠標只負責選擇對象,這就是兩個不一樣的關注點。segmentfault
在軟件中,能夠舉一個最通俗的例子,MVC分層。設計模式
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。bash
View(視圖)是應用程序中處理數據顯示的部分。微信
Controller(控制器)是應用程序中處理用戶交互的部分。架構
甚至於所謂的面向切面編程AOP,也是一種SoC的實現。spa
在這裏,咱們能夠用Laravel的Eloquent舉例設計
Eloquent裏將關注點分爲了:Attributes、Event、Relationships等Trait模塊,不一樣的Trait模塊只負責對應的功能,這樣就將模型的邏輯成功分離。
因爲關注點,也就是邏輯,混雜在一塊兒會使軟件難以維護,回想一下本身初學編程時寫的那些代碼就知道有多可怕了,一個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類中去執行。
這裏舉幾個經常使用的例子:
即使是最初級的程序員也都接觸過,多是你並無意識到而已。也就是所謂的MVC架構,能夠看作是一個請求進來後,須要通過的路徑。
也就是模塊之間的分離,如商品模塊、訂單模塊、用戶模塊等。
就是所謂的面向切面編程AOP。能夠將一些跨多層邏輯的功能獨立封裝起來,例如Log日誌功能,能夠在C層進行日誌記錄,也能夠在M層進行日誌記錄。
在實際的工做中你會發現,軟件開發就是這樣,沒有什麼是不變的,惟一不變的,就是變化。 至此,關注點分離這塊內容暫告一段落。
資料參考
更多好文
請掃描下面二維碼
歡迎關注~