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.mzph.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…