摘要:它是良好應(yīng)用設(shè)計(jì)的大原則,包含單一責(zé)任原則開放封閉原則里氏替換原則接口分離原則依賴倒置原則讓我們通過代碼示例來深究下這五個原則。實(shí)探單一責(zé)任原則代表一個類有且僅有一個改變的原因,換言之,一個類的職責(zé)范疇是嚴(yán)謹(jǐn)明確的。
聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證90%的原汁性,另外因?yàn)槭抢斫夥g,肯定會有錯誤的地方,歡迎指正。
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處,謝謝!
單一責(zé)任原則 介紹“SOLID”設(shè)計(jì)原則,是Robert “Uncle Bob” Martin提出的理論。它是良好應(yīng)用設(shè)計(jì)的5大原則,包含:
單一責(zé)任原則
開放封閉原則
里氏替換原則
接口分離原則
依賴倒置原則
讓我們通過代碼示例來深究下這五個原則。這5個原則相互****,一榮俱榮,一毀俱毀。
實(shí)探單一責(zé)任原則代表一個類有且僅有一個改變的原因,換言之,一個類的職責(zé)范疇是嚴(yán)謹(jǐn)明確的。我們之前說過對來說無知是福。類只需要干好自己的工作,對于其依賴變化的影響是無需感知的。
看下面這個類:
class OrderProcessor { public function __construct(BillerInterface $biller) { $this->biller = $biller; } public function process(Order $order) { $recent = $this->getRecentOrderCount($order); if ($recent > 0) { throw new Exception("Duplicate order likely."); } $this->biller->bill($order->account->id, $order->amount); DB::table("orders")->insert(array( "account" => $order->account->id, "amount" => $order->amount; "created_at" => Carbon::now(); )); } protected function getRecentOrderCount(Order $order) { $timestamp = Carbon::now()->subMinutes(5); return DB::table("orders") ->where("account", $order->account->id) ->where("created_at", ">=", $timestamps) ->count(); } }
該類的職責(zé)是什么?通過名字可以明確他就是來處理訂單的。但是,從getRecentOrderCount方法中又能看到該方法需要對數(shù)據(jù)庫中的歷史訂單進(jìn)行檢測以判斷是否重復(fù)訂單。額外的驗(yàn)證意味著在數(shù)據(jù)存儲改變的情況下,我們的訂單處理程序必須要進(jìn)行驗(yàn)證規(guī)則的修改。
我們可以把這個職責(zé)提取到多帶帶的類OrderRepository中:
class OrderRepository { public function getRecentOrderCount(Account $account) { $timestamp = Carbon::now()->subMinutes(5); return DB::table("orders") ->where("account", $account->id) ->where("created_at", ">=", $timestamp) ->count(); } public function logOrder(Order $order) { DB::table("orders")->insert(array( "account" => $order->account->id, "amount" => $order->amount; "created_at" => Carbon::now(); )); } }
然后在OrderProcessor中注入類庫,來減少它檢測賬戶歷史訂單的職責(zé):
class OrderProcessor { public function __construct(BillerInterface $biller, OrderRepository $orders) { $this->biller = $biller; $this->orders = $orders; } public function process(Order $order) { $recent = $this->orders->getRecentOrderCount($order->account); if ($recent > 0) { throw new Exception("Duplicate order likely."); } $this->biller->bill($order->account->id, $order->amount); $this->orders->logOrder($order); } }
現(xiàn)在我們將訂單數(shù)據(jù)收集責(zé)任抽象出來,當(dāng)獲取記錄訂單的方法改變時,就無需再對OrderProcessor類進(jìn)行修改了?,F(xiàn)在的類庫職責(zé)明確單一,代碼簡潔,表現(xiàn)力強(qiáng),同時可維護(hù)性也大大的提升。
牢記,單一責(zé)任原則不是指代碼越少越好,他是指寫類是類的職責(zé)要非常明確,要有一套可用的方法,這些方法在類中要組成類的整體職責(zé)。根據(jù)既定的職責(zé)撰寫出的這些巧而簡潔的類,我們的代碼就能是一個解耦的,可測的,可友好改變的架構(gòu)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23006.html
摘要:實(shí)際上,本原則要求接口必須是粒度明確的。當(dāng)你的代碼不符合接口分離原則時,那也肯定違背了單一責(zé)任原則。接口分離原則本原則是指在實(shí)現(xiàn)類中對于接口中的方法并不強(qiáng)制去實(shí)現(xiàn)使用不到的方法。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證90%的原汁性,另外因?yàn)槭抢斫夥g,肯定會有錯誤...
摘要:可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊??梢赃x擇推遲服務(wù)提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應(yīng)用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導(dǎo)言 Laravel是一款先進(jìn)的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認(rèn)為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:然而,我們需要注意的是僅是軟件設(shè)計(jì)模式依賴注入的一種便利的實(shí)現(xiàn)形式。容器本身不是依賴注入的必要條件,在框架他只是讓其變得更加簡便。首先,讓我們探索下為什么依賴注入是有益的。繼續(xù)深入讓我們通過另一個示例來加深對依賴注入的理解。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味的翻譯,能保證9...
摘要:編寫組件時要考慮的基本準(zhǔn)則是單一職責(zé)原則。這些更改通常要求組件在隔離狀態(tài)下易于修改這也是的目標(biāo)。解決多重責(zé)任問題需要將分割為兩個組件和。組件之間的通信是通過實(shí)現(xiàn)。更改的唯一原因是修改表單字段。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內(nèi)容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和可維護(hù)的React組...
摘要:本文翻譯改編自的十八個最佳實(shí)踐這篇文章并不是什么由改編的原則模式等。只是為了讓你注意你在現(xiàn)實(shí)生活的項(xiàng)目中最常忽略的內(nèi)容。單一職責(zé)原則正在幫助你避免重復(fù)。當(dāng)然,這也包括了模板的范圍等。此外,也擁有很棒的內(nèi)置工具,比如軟刪除事件范圍等。 showImg(https://segmentfault.com/img/remote/1460000015166532); 本文翻譯改編自 Larave...
閱讀 2801·2023-04-25 22:51
閱讀 2026·2021-10-11 10:58
閱讀 3308·2019-08-30 10:49
閱讀 1870·2019-08-29 17:09
閱讀 3136·2019-08-29 10:55
閱讀 839·2019-08-26 10:34
閱讀 3466·2019-08-23 17:54
閱讀 980·2019-08-23 16:06