Home架构架构师训练第二周-面向对象设计的原则-作业

架构师训练第二周-面向对象设计的原则-作业

内容纲要

作业一:请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

简述:
a,高层模块不应该依赖于底层模块,两者都应该依赖于抽象;
b,抽象不应该依赖于细节,细节应该依赖于抽象。

该原则是框架设计的核心原则。
高层模块包含一个应用程序中重要的策略选择和业务模型,要是高层模块依赖于低层模块,那么对低层模块的修改就会直接影响到高层模块,就会迫使他们依次做出改动。
实现方法就是两者都应该依赖于抽象:高层模块声明一个它所需要的抽象接口,让低层模块来实现这些抽象接口。

依赖倒置不仅仅是依赖关系的倒置,也是接口所有权的倒置,也就是著名的hollywood原则:Don’t call me, I’ll call you! 就是低层模块实现了再高层模块中声明并被高层模块调用的接口。


作业二:描述一个你熟悉的框架,是如何实现依赖倒置原则的。

laravel核心设计:控制反转,依赖注入:
控制反转:
控制反转就是实现依赖倒置的一种具体方法。控制反转核心是把上层(类)所依赖单元的实例化过程交由第三方实现,而类中不允许存在对所依赖单元的实例化语句。举个例子:

class Comment
{
    ...

    public function afterInsert()
    {
        $notification = new EmailNotification(...);
        $notification->send(...);
    }
}

如上,假如我们在用户提交评论后通知被评论者,这里通知方式是邮件,而且是直接在类中实例化邮件通知类,这样代码耦合度高,如果换个短信通知方式就不得不改这里面代码,具体好的实现我们下面会讲到。

依赖注入
依赖注入是一种设计模式,是一种IoC的具体实现,实现了IoC自然就符合依赖倒置原则。依赖注入的核心思想是把类中所依赖单元的实例化过程放到类外面中去实现,然后把依赖注入进来。常用的依赖注入方式有属性注入和构造函数注入。比如用构造函数注入解耦上面代码:

// 通知接口
interface Notifaction
{
    public function send(...);
}

// 短信通知实现通知接口
class SmsNotification implements Notification
{
    public function send(...)
    {
        ...
    }
}

// 评论类
class Comment
{
    ...

    protected $notification;

    public function __construct(Notification $smsNotification)
    {
        $this->notification = $smsNotification;
    }

    public function afterInsert()
    {
        $this->notification->send(...);
    }
}

// 实例化短信通知类
$smsNotification = new SmsNotification(...);

// 通过构造函数方法注入
$comment = new Comment($smsNotification);

...

$comment->save();

这样,我们先定义Notification接口,里面有个send方法,让后面的通知者不管是邮件类还是短信类都实现这个接口,然后在外面通过构造函数方式注入进来,这样就解决了Comment类对具体通知方法的依赖,只要是实现了Notification接口的,都可以通过构造函数传进来,Comment类完全不用做任何修改。这样无论对于代码维护还是单元测试(可以模拟实现一个Notification类),都非常方便。
依赖注入是IoC的一种具体实现,是一种解耦手段。


作业三: 请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。

file
提示:cache 实现类中有四个方法,其中 put get delete 方法是需要暴露给应用程序的,rebuild 方法是需要暴露给系统进行远程调用的。如果将 rebuild 暴露给应用程序,应用程序可能会错误调用 rebuild 方法,导致 cache 服务失效。按照接口隔离原则:不应该强迫客户程序依赖它们不需要的方法。也就是说,应该使 cache 类实现两个接口,一个接口包含 get put delete 暴露给应用程序,一个接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法。

file

打赏
发表评论

电子邮件地址不会被公开。