课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 读书笔记(四)
  • PHP 读书笔记(四)

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

  • PHP 读书笔记(四)

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

    为什么LSP那么重要呢?

    LSP使得我们重构代码变的有理可循。任何依赖于的接口的使用方,都不用关心具体实现是什么,因为所有的具体实现都会使得程序行为是正确的。

    接口隔离原则

    接口隔离和单一职责相关,如果一个类只有一个职责,自然其接口就是隔离的,这么说可能还不是特别明白,我们看代码:

    interface LoggerInterface {

    public function write( $message );

    public function read( $messageCount );

    }

    class FileLogger implements LoggerInterface {

    ....

    }

    class EmailLogger implements LoggerInterface{

    ....

    }

    上面我们定义了一个日志接口,并且有两个实现,一个基于文件,一个基于Email,但是Email的实现中,对于read接口,我们难道要去判断是正常邮件还是日志嘛?我们实现EmailLogger,只是想要将关键日志以邮件发送出来,对于read其实是没有需求的,因此我们做如下的重构:

    interface LogWriterInterface {

    public function write($message);

    }

    interface LogReaderInterface {

    public function read($messageCount);

    }

    interface LogManagerInterface extends LogReaderInterface, LogWriterInterface {

    }

    通过将读和写隔离开来,我们得到了更大的灵活性。

    为什么ISP重要?

    ISP的目标同样是解耦。所有使用接口的使用者都意味着和这个接口耦合,不管你是用还是不用里面的方法,这带来的风险是,如果接口的实现中某个方法有错误,使用者就得承担风险。

    依赖反转原则

    该原则是后面介绍的The Clean Architecture的核心,因此我们来仔细讨论下:

    我们设想下有下面的场景:假设一个class控制了一个简单的游戏。游戏负责接收用户的输入并且将结果展示在屏幕上,具体类如下:

    class GameManager {

    protected $input;

    protected $video;

    public function __construct()

    {

    $this->input = new KeyboardInput();

    $this->video = new ScreenOutput();

    }

    public function run()

    {

    // accept user input from $this->input // draw the game state on $this->video

    }

    }

    GameManager 依赖于KeyboardInputScreenOutput,带来的问题是:如果我们想要改变下输入或者输出,我们只能去修改GameManager类。如果我们应用之前的LSP原则,抽象出输入和输出接口,我们就有下面的实现:

    class GameManager {

    protected $input;

    protected $video;

    public function __construct( InputInterface $input, OutputInterface $output

    )

    {

    $this->input = $input;

    $this->video = $output;

    }

    public function run()

    {

    // accept user input from $this->input // draw the game state on $this->video

    }

    }

    此时我们实现了依赖的反转,怎么回事呢?

    原先GameManager依赖于下面的实现,而在右边:KeyboardInputScreenOutput依赖GameManager声明的接口,实现了依赖的大逆转

    为什么DIP重要?

    DIP给我们的一个重要原则是:尽可能的依赖稳定的东西,因为这样子将来出错的概率会小。

    High level modules should not depend upon low level modules. Both should depend upon abstractions.

    Abstractions should not depend upon details. Details should depend upon abstractions.

    High level modules是相对于low level modules是稳定的,因此不应该依赖于不稳定的low level modules。抽象相对于具体实现也是更稳定的,因此应该是具体实现依赖于抽象。

    SOLID原则使得我们的代码更易扩展、重构和测试,下面会继续解耦的第三个工具:依赖反转。

    最后推荐下介绍SOLID的非常好的书: Laravel - 从百草园到三味书屋 "From Apprentice To Artisan"目录

    这是The Clean Architecture in PHP的第三篇,你的鼓励是我继续写下去的动力,期待我们共同进步。

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

上一篇:PHP 读书笔记(三)

下一篇: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

    在线客服系统