php 單一職責原則,Laravel深入學習8 - 單一責任原則

聲明:本文并非博主原創,而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原汁性,另外因為是理解翻譯,肯定會有錯誤的地方,歡迎指正。

歡迎轉載,轉載請注明出處,謝謝!

單一責任原則

介紹

“SOLID”設計原則,是Robert “Uncle Bob” Martin提出的理論。它是良好應用設計的5大原則,包含:

單一責任原則

開放封閉原則

里氏替換原則

接口分離原則

依賴倒置原則

讓我們通過代碼示例來深究下這五個原則。這5個原則相互****,一榮俱榮,一毀俱毀。

實探

單一責任原則代表一個類有且僅有一個改變的原因,換言之,一個類的職責范疇是嚴謹明確的。我們之前說過對來說無知是福。類只需要干好自己的工作,對于其依賴變化的影響是無需感知的。

看下面這個類:

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();

}

}

該類的職責是什么?通過名字可以明確他就是來處理訂單的。但是,從getRecentOrderCount方法中又能看到該方法需要對數據庫中的歷史訂單進行檢測以判斷是否重復訂單。額外的驗證意味著在數據存儲改變的情況下,我們的訂單處理程序必須要進行驗證規則的修改。

我們可以把這個職責提取到單獨的類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中注入類庫,來減少它檢測賬戶歷史訂單的職責:

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);

}

}

現在我們將訂單數據收集責任抽象出來,當獲取記錄訂單的方法改變時,就無需再對OrderProcessor類進行修改了。現在的類庫職責明確單一,代碼簡潔,表現力強,同時可維護性也大大的提升。

牢記,單一責任原則不是指代碼越少越好,他是指寫類是類的職責要非常明確,要有一套可用的方法,這些方法在類中要組成類的整體職責。根據既定的職責撰寫出的這些巧而簡潔的類,我們的代碼就能是一個解耦的,可測的,可友好改變的架構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530513.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab aic sic,sic是什么意思_sic的翻譯_音標_讀音_用法_例句_愛詞霸在線詞典

全部In the mud -- En ange e il mondo ! [ sic ] ( 6 )污泥里 —— Efangoeilmondo! ( 六 )漢英文學 - 圍城Fixed - seal & rotational - seal are made of various msterials, SIC, Carbon, Ceramic and can withstand various chemicals.固定環 及 轉動環由各種不同材質…

centos6.3 nginx php,CentOS 6.3下nginx、php-fpm、drupal快速部署

一切本著從簡原則來做,能yum/rpm的,堅決不手工編譯 :)本次部署環境基于CentOS 6.3 x86_64系統。0. 準備工作#更新yum[rootimysql ~]# yum -y update[rootimysql ~]# yum install libaio-devel.x86_64#drupal 8.0需要用到curl模塊[rootimysql ~]# yum ins…

鏈路追蹤php,easyswoole鏈路追蹤

TrackerEasyswoole提供了一個基礎的追蹤組件,方便用戶實現基礎的服務器狀態監控,與調用鏈記錄。組件要求php: >7.1.0ext-swoole: ^4.4.0easyswoole/component: ^2.0安裝方法composer require easyswoole/tracker倉庫地址調用鏈Easyswoole的調用鏈跟蹤…

razor java,如何在Razor中聲明局部變量?

我正在asp.net mvc 3中開發一個Web應用程序。我對它很新。 在使用剃刀的視圖中,我想聲明一些局部變量并在整個頁面中使用它。 如何才能做到這一點?能夠執行以下操作似乎相當微不足道:bool isUserConnected string.IsNullOrEmpty(Model.Creat…

amp 符號 php,php中引用符號(amp;)的使用詳解_PHP教程

與C語言中的指針是有差別的.C語言中的指針里面存儲的是變量的內容在內存中存放的地址變量的引用.PHP 的引用允許你用兩個變量來指向同一個內容復制代碼 代碼如下:$a"ABC";$b &$a;echo $a;//這里輸出:ABCecho $b;//這里輸出:ABC…

oracle ora 00283,【案例】Oracle報錯ORA-16433非歸檔丟失redo無法啟動的恢復過程

天萃荷凈Oracle研究中心案例分析:運維DBA反映Oracle數據庫處理非歸檔模式,redo文件損壞常規修復無法正常open數據庫。本站文章除注明轉載外,均為本站原創: 轉載自love wife & love life —Roger 的Oracle技術博客本文鏈接地址…

win7卸載oracle12c,Windows7上完全卸載Oracle 12c操作步驟

Windows7上完全卸載Oracle 12c操作步驟1.關閉Oracle所有的服務,按【winR】運行【services.msc】找到所有Oracle開頭的服務(OracleVssWriterORCLOracleServiceORCLOracleOraDB12Home1TNSListenerOracleOraDB12Home1MTSRecoveryServiceOracleJobSchedulerORCL),點擊停止。2.使用O…

圖像灰度映射實驗MATLAB,圖像灰度變換實驗報告

實驗2a 圖像的灰度變換一、實驗目的:學會用Matlab軟件對圖像進行運算和灰度變換。二、實驗內容:用、-、*、/、imabsdiff、imadd、imcomplment、imdivide、imlincomb、immultiply、imsubtract和imadjust等函數生成各類灰度變換圖像。三、實驗相關知識1、代…

oracle深度巡檢指標,oracle DBA 巡檢項目

11.Oracle審計-AUD$占用空間較大處理方案truncate 或者 delete sys.aud$ 表在delete 之前,可以先把aud$表exp備份一下,注意,不要直接exp,先創建一張臨時表,然后將臨時表exp。sql>create table audit_record tablesp…

eclipse oracle驅動位置,【求助】eclipse導入了Oracle的驅動包連不上Oracle

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓代碼:package com.sp;import java.sql.*;//演示JDBC連接public class OraDemo2 {public static void main(String[] args) throws ReflectiveOperationException, SQLException {// TODO Auto-generated method stub//1…

oracle系統實驗,實驗1 啟動Oracle系統

啟動Oracle系統一、開啟Oracle服務1、控制面板---管理工具----服務---或Oracle中的配置和移植工具—Oracle Administration Assistant for Windows 用右鍵單擊“數據庫中的SID名”,選擇啟動服務啟動以下服務:OracleService 對應數據庫實例OracleTNSListe…

linux怎樣擴容目錄,Linux系統下對目錄擴容的方法介紹

1、現象:日志服務器當初考慮不周,分區劃分不太合理:2、目標:將/home磁盤空間縮減 并將新的磁盤分區擴充到/根目錄卸載/home分區并壓縮分區卸載/home時 提示目標忙,fuser -m /home查看誰用/home時提示沒有fuser命令[ro…

linux部署多個tomcat服務,Linux 一臺服務器部署多個tomcat

linux系統下安裝兩個或多個tomcat編輯環境變量:vi /etc/profile加入以下代碼(tomcat路徑要配置自己實際的tomcat安裝目錄)##########first tomcat###########CATALINA_BASE/usr/local/tomcatCATALINA_HOME/usr/local/tomcatTOMCAT_HOME/usr/local/tomcatexport CATA…

在linux中編寫shell腳本文件,如何編寫簡單的Shell腳本(Script)文件之Linux的基本操作...

如何編寫簡單的Shell腳本(Script)文件之Linux的基本操作新建一個文本文件包含所需要的腳本。舉例,我會使用pico編輯器寫一個腳本用來運行程序tar,帶上必要的可選項可以用來解壓從因特網下載下來的*.tar的文件(我好像總是記不住tar的所有參賽)。滑動軸承 …

Linux鉤子攔截刪除文件,在Linux中保存鉤子文件

您可以嘗試FILE_PRELOAD utility,它們會生成帶鉤子的C代碼,編譯和LD_PRELOAD它。在簡短的看了一下之后,你可以感覺到如何輕松地掛接linux。起點是this tutorial。例如,如果你想改變文件/ tmp的“公開征集” /一些帶有的/ tmp/repl…

Linux內核怎么優化,linux 內核該怎么優化

Linux系統下,TCP連接斷開后,會以TIME_WAIT狀態保留一定的時間,然后才會釋放端口。當并發請求過多的時候,就會產生大量的TIME_WAIT狀態的連接,無法及時斷開的話,會占用大量的端口資源和服務器資源。這個時候…

編譯linux內核適用的編譯器,編譯Linux內核時,CC,LD和CC [M]輸出的代碼是什么?...

所以一般情況下,你只需要 git grep cmd.* CODE找到CODE。獲取scripts/Makefile.build定義的所有代碼 make | grep -E ^ | sort -uk1,1CC和CC [M]名單: quiet_cmd_cc_o_c CC $(quiet_modtag) [email protected]cmd_cc_o_c $(CC) $(c_flags) -c -o [em…

紅旗linux修改個人密碼,LINUX紅旗5.0的用戶名和密碼!

怎樣卸載、安裝紅旗linux本二,安裝紅旗Linux桌面版 4。0將光驅設為第一啟動盤,放入第一張安裝光盤后重新啟動電腦,如果你的光驅支持自啟動, 如無意外將出現如下圖1如果不進行操作,在10秒后自動進入下一畫面,顯示如下圖2所示一啟動就能使用鼠標了,比效方便;軟件協議,只能選同意,…

linux多線程九宮格,項目實戰:Qt九宮格圖片資源瀏覽器(支持window、linux、兼容各國產系統,支持子文件夾,多選,全選,圖片預覽,行數與列數設置等)...

需求做嵌入式設備,需求九宮格圖片資源瀏覽器:1.設置根目錄;2.可拖動;3.可設置列數與行數;4.點擊文件夾可以進入文件夾;5.點擊圖片可以瀏覽圖片;6.支持觸摸屏上下拽拖瀏覽;7.支持長安…

linux mdev -s沒有運行,mdev詳解

一、概述mdev是busybox提供的一個工具,用在嵌入式系統中,相當于簡化版的udev,作用是在系統啟動和熱插拔或動態加載驅動程序時,自動創建設備節點。文件系統中的/dev目錄下的設備節點都是由mdev創建的。在加載驅動過程中&#xff0c…