太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

PHP 读书笔记(三)

  • 时间:2016-11-02
  • 发布:简书
  • 来源:简书

PHP 读书笔记(三)

学好技术的前提就是做好笔记,从笔记中不断地吸取可取之处,是我们不断进步。

本篇介绍5大设计原则 SOLID

Single Responsibility Principle

Open/Closed Principle

Liskov Substitution Principle

Interface Segregation Principle

Dependency Inversion Principle

5大原则最初是由Robert C. Martin提出,这些原则主要解决了下面两个问题:

类应该怎么设计?彼此之间如何交互

我们如何组织这些类

介绍第一个原则:单一职责

单一职责原则

单一职责,要想理解这个原则,我们先来看下什么是职责?

Robert C. Martin描述职责是:“a reason for change”。我们写出来的类,如果会因为多于一种原因而去修改,那就不符合单一职责。另一角度看单一职责是从类的对外表现去看,如果类表现出不止一种行为,则也违反了SRP

class User {

public function getName(){}

public function getEmail(){}

public function find( $id ){}

public function save(){}

}

上面的类User违反了SRP,因为有两个职责:

管理user的状态

管理user的存取

因此我们需要将其重构为下面两个类:

class User {

public function getName() {}

public function getEmail() {}

}

class UserRepository {

public function find($id) {}

public function save(User $user) {}

}

此时User负责状态,UserRepository负责存取,可能会引起UserRepository的改变的只有存储user地方的改变。

知道什么是单一职责后,我们再深入下去,面对已经存在,或者新建一个类的时候,我们怎么能够分析出它的职责?

Breaking up Classes(拆分类)

class InvoicingService {

public function generateAndSendInvoices() {}

protected function generateInvoice($customer) {}

protected function createInvoiceFile($invoice){}

protected function sendInvoice($invoice) {}

}

看方法名 generateAndSendInvoices ,直观上来至少有2个职责,生产并且发送单据,分析后, InvoicingService 至少有下面4个职责:

负责哪个单据需要创建

在数据库中产生单据记录

产生单据的物理表示(PDFExcelCSV)

通过某些手段发送单据给用户

分析出职责后,我们下一步就是将 InvoicingService 类拆分为小的,符合SRP的类

class OrderRepository {

public function getOrdersByMonth($month);

}

class InvoicingService {

public function generateAndSendInvoices() {}

}

class InvoiceFactory {

public function createInvoice(Order $order) {}

}

class InvoiceGenerator {

public function createInvoiceFormat(

Invoice $invoice,

$format ) {}

}

class InvoiceDeliveryService {

public function sendInvoice(

Invoice $invoice,

$method ) {}

}

根据4个职责拆分为4个类,然后由 InvoicingService 连接起来。我们看到类 InvoiceGenerator InvoiceDeliveryService 其实可以再进一步拆分,因为单据会有不同的表现形式,寄送方式也有多种方式,此时类 InvoiceGenerator InvoiceDeliveryService 不仅负责生产和寄送,还负责多种策略的选择。

那介绍了这么多SRP,最重要的问题是:

为什么SRP那么重要?

关键点还是SRP有助于我们实现解耦,去耦是贯穿全文的主题。

总结起来:类越小,越容易测试,越容易重构,也更不容易出现缺陷。

开闭原则

对扩展开发,对修改封闭

这样做的好处是我们不会破会原来的功能,我们只是在上面叠加,而不是修改。

一个开闭原则的非常好的例子就是上一篇介绍的策略模式,我们永远只需要新增策略,而不用去修改现有的策略。

里氏替换原则

先看代码的:

interface HelloInterface {

public function getHello();

}

class EnglishHello implements HelloInterface {

public function getHello()

{

return "Hello";

}

}

class SpanishHello implements HelloInterface {

public function getHello()

{

return "Hola";

}

}

class FrenchHello implements HelloInterface {

public function getHello()

{

return "Bonjour";

}

}

class Greeter {

public function sayHello( HelloInterface $hello )

{

echo $hello->getHello() . "!\n";

}

}

$greeter = new Greeter();

$greeter->sayHello( new EnglishHello() );

$greeter->sayHello( new SpanishHello() );

$greeter->sayHello( new FrenchHello() );

我们看上面的类:在Greeter()中我们使用了HelloInterface,我们可以使用该接口的不同实现,输出的内容会改变,但是不会改变sayHello这个行为本身。

总结起来就是:如果一个类使用了一个接口的一个实现类,那么该接口的任何其他实现类也可以被这里直接使用,不用做出任何修改。

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:继印度、韩国之后 蚂蚁金服再投泰国支付公司Ascend Money
下一篇:PHP 读书笔记(四)

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省