课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 读书笔记(三)
  • 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高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-29

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-29

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-29

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-29

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统