降低代码耦合度的方法 -依赖注入
- 什么是依赖注入
- 为什么要使用依赖注入
- Laravel中的依赖注入
什么是依赖注入
什么是依赖注入,就要先了解什么是依赖。
在面向对象语言中,A类需要引用B类中Y方法的,则称A类和B类就构成了以依赖关系,A依赖于B。在对象中也存在依赖关系,如A类的X对象依赖于B类的对象Y。
在项目的开发流程中,虽然代码这样写看起来没什么,但是到了需求变更,需要去修改维护原有代码时,这就是非常头疼的问题。
例如,我们开始有两个类,一个Person类,一个Phone类。Person类中有一个use方法,Phone类中有call、mail、photograph等方法。
class Phone{
public function call(){};
public function mail(){};
public function photograph();
}
class Person{
public function use(){
$iPhone = new Phone('iphone');
$iphone->call();
$iphone->mail();
$iphone->photograph();
...
}
}
从上面的代码可以看出,想要完成一个‘人’使用‘手机’的一系列功能时,需要Person类中的use方法实例化Phone的对象再去调用Phone中的系列方法。
如果以后需要修改Phone类中的方法,还需要修改Person类中的use方法,修改成本十分大,代码耦合度太高。
为解决这些问题,就要用到面向对象编程中的一种设计原则控制反转(IoC),其中最常用的一种方法就是依赖注入。
为什么要使用依赖注入
1.不用自己去管理众多的对象,方便开发。传统的代码,每个对象负责管理与自己需要依赖的对象,导致如果需要切换依赖对象的实现类时,需要修改多处地方。同时,过度耦合也使得对象难以进行单元测试。
2.依赖注入把对象的创造交给外部去管理,很好的解决了代码紧耦合(tight couple)的问题,是一种让代码实现松耦合(loose couple)的机制。
3.松耦合让代码更具灵活性,能更好地应对需求变动,以及方便单元测试。
*Laravel中的依赖注入
在Laravel中时通过服务容器来实现依赖注入的。
在刚开始接触到服务容器这个概念时,不是很理解容器到底是个什么东西。其实后来才发现容器这个概念自己想的复杂了,变量、参数、回调方法、对象等都可以称之为容器。那么服务容器其实就是字面意思,提供一系列开发所需要服务的容器。
Laravel中的服务容器是Laravel的核心,实际上就是一个IoC容器。官方文档解释是:Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具。依赖注入这个花俏名词实质上是指:类的依赖项通过构造函数,或者某些情况下通过「setter」方法「注入」到类中。
下面这个例子就可以看出Laravel中是如何使用服务容器的。
namespace App\Http\Controllers;
use App\User;
use App\Repositories\UserRepository;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
protected $users;
public function __construct(UserRepository $users)
{
$this->users = $users;
}
public function show($id)
{
$user = $this->users->find($id);
return view('user.profile', ['user' => $user]);
}
}
初次看到这段代码时,我脑海中只有一个词形容它——“简洁”。
这段代码就能很好地展示如何使用Laravel中的服务容器来进行‘简单而优雅’地开发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)