资讯专栏INFORMATION COLUMN

Laravel深入学习12 - 依赖倒置原则

IamDLY / 3070人阅读

摘要:在改变存储系统的情况下,必须对进行修改,违背了开放封闭原则。传统的依赖痛过倒置就能事代码变得非常灵活,易于改变

声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味的翻译,能保证90%的原汁性,另外因为是理解翻译,肯定会有错误的地方,欢迎指正。

欢迎转载,转载请注明出处,谢谢!

依赖反转原则 介绍

我们来到了SOLID设计原则的最终的目标远景!它就是依赖反转原则,它是指高阶代码不能依赖低阶代码。相应的,高阶代码应该依赖一个抽象层,它是在高阶代码和低阶代码之间的“中间人”角色。另一方面,该原则指代抽象层不依赖具体实现,而是细节依赖抽象。如果这个读起来很晦涩,别担心。我们下面会对这两个方面具体的阐述本原则。

依赖反转原则 本原则是指高阶代码不依赖低阶代码,抽象不依赖具体细节。

实探

如果你已经读过本书之前的章节,就应该对依赖反转有一个很好的理解。我们通过下面例子来解释:

class Authenticator {

    public function __construct(DatabaseConnection $db)
    {
        $this->db = $db;
    }

    public function findUser($id)
    {
        return $this->db->exec("select * from users where id = ?", array($id));
    }

    public function authenticate($credentials)
    {
        // Authenticate the user...
    }

}

可以猜到,Authenticator类是负责查找并验证用户的。我们来检验下类的构造器。可以看到我们有个链接数据库的实例DatabaseConnection。所以我们将验证器和数据库紧密的接合在一起了,这意味着用户对象必须建立在关系型数据库查询之上。此外,我们的高阶代码(Authenticator类)直接依赖了低阶代码(DatabaseConnection类)。 首先,我们解释下“高阶”和“低阶”代码。低阶代码实现像这种磁盘文件访问,数据库接入等。高阶代码在低阶代码之上实现逻辑功能的封装,但不能将他们耦合进来。或者,高阶代码依赖建立在低阶代码之上的抽象层,如接口。不仅如此,低阶代码_也_依赖于抽象层。我们来实现一个可以在Authenticator类中使用的接口:

interface UserProviderInterface {
    public function find($id);
    public function findByUsername($username);
}

然后,将接口的实现注入到Authenticator

class Authenticator {

    public function __construct(UserProviderInterface $users,
    HasherInterface $hash)
    {
        $this->hash = $hash;
        $this->users = $users;
    }

    public function findUser($id)
    {
        return $this->users->find($id);
    }

    public function authenticate($credentials)
    {
        $user = $this->users->findByUsername($credentials["username"]);

        return $this->hash->make($credentials["password"]) == $user->password;
    }

}

这些改变之后,我们的Authenticator现在依赖两个高阶抽象:UserProviderInterfaceHasherInterface。我们就能自由的将任何针对接口的实现注入到Authenticator中了。比如,如果我们用户存储在Reids中,可以实现针对UserProvider实现一个RedisUserProvider类。Authenticator现在不在直接依赖低阶的存储操作了。 此外,自从它实现接口本身后,我们的低阶代码现在也是依赖高阶的UserProviderInterface抽象:

class RedisUserProvider implements UserProviderInterface {

    public function __construct(RedisConnection $redis)
    {
        $this->redis = $redis;
    }

    public function find($id)
    {
        $this->redis->get("users:".$id);
    }

    public function findByUsername($username)
    {
        $id = $this->redis->get("user:id:".$username);

        return $this->find($id);
    }

}

反转思想 很多开发人员在应用中使用_反转_原则。代替这种高阶直接耦合低阶代码的“自上而下”的方式,本原则指高阶、低阶代码“同时”依赖一个高阶抽象层。

在我们将Authenticator的依赖“倒置”前,他是无法在其他数据存储系统中使用的。在改变存储系统的情况下,必须对Authenticator进行修改,违背了开放封闭原则。我们已经知道,几种原则之间是相互贯穿的。 在将Authenticator强制实现在存储层之上的抽象层,我们可以根据UserProviderInterface接口约定切换成任意其他存储系统,而无需对Authenticator本身进行修改。传统的依赖痛过“倒置”就能事代码变得非常灵活,易于改变!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23041.html

相关文章

  • Laravel中的核心概念

    摘要:可以为服务提供者的方法设置类型提示。方法将在所有其他服务提供者均已注册之后调用。所有服务提供者都在配置文件中注册。可以选择推迟服务提供者的注册,直到真正需要注册绑定时,这样可以提供应用程序的性能。 本文最早发布于 Rootrl的Blog 导言 Laravel是一款先进的现代化框架,里面有一些概念非常重要。在上手Laravel之前,我认为先弄懂这些概念是很有必要的。你甚至需要重温下PHP...

    ddongjian0000 评论0 收藏0
  • Laravel深入学习8 - 单一责任原则

    摘要:它是良好应用设计的大原则,包含单一责任原则开放封闭原则里氏替换原则接口分离原则依赖倒置原则让我们通过代码示例来深究下这五个原则。实探单一责任原则代表一个类有且仅有一个改变的原因,换言之,一个类的职责范畴是严谨明确的。 声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味的翻译,能保证90%的原...

    ymyang 评论0 收藏0
  • 深入理解JavaScript系列10:S.O.L.I.D五大原则依赖倒置原则

    摘要:前言本章我们要讲解的是五大原则语言实现的第篇,依赖倒置原则。当应用依赖倒置原则的时候,关系就反过来了。在当静态类型语言的上下文里讨论依赖倒置原则的时候,耦合的概念包括语义和物理两种。依赖倒置原则和依赖注入都是关注依赖,并且都是用于反转。 前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Invers...

    chenjiang3 评论0 收藏0
  • Laravel深入学习2 - 控制反转容器

    摘要:控制反转容器控制反转使依赖注入变得更加便捷。有瑕疵控制反转容器是实现的控制翻转容器的一种替代方案。容器的独立使用即使没有使用框架,我们仍然可以在项目中使用安装组件来使用的控制反转容器。在没有给定任何信息的情况下,容器是无法实例化相关依赖的。 声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味...

    worldligang 评论0 收藏0
  • Laravel深入学习11 - 接口分离原则

    摘要:实际上,本原则要求接口必须是粒度明确的。当你的代码不符合接口分离原则时,那也肯定违背了单一责任原则。接口分离原则本原则是指在实现类中对于接口中的方法并不强制去实现使用不到的方法。 声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味的翻译,能保证90%的原汁性,另外因为是理解翻译,肯定会有错误...

    lwx12525 评论0 收藏0

发表评论

0条评论

IamDLY

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<