降低代码耦合度的方法 -依赖注入

2023-05-16

降低代码耦合度的方法 -依赖注入


  • 什么是依赖注入
  • 为什么要使用依赖注入
  • 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{
/*
** use方法需要调用Phone类中的call\mail\photograph方法
*/
    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;//user的服务容器就在这
use App\Http\Controllers\Controller;

class UserController extends Controller
{

    // Controller中的$users用来存储用户实例
    protected $users;

    //构造方法中的参数传入的是通过服务容器获得的users对象
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    //show方法使用ORM获取相应的用户ID并且返回给View层处理
    public function show($id)
    {
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

初次看到这段代码时,我脑海中只有一个词形容它——“简洁”。
这段代码就能很好地展示如何使用Laravel中的服务容器来进行‘简单而优雅’地开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

降低代码耦合度的方法 -依赖注入 的相关文章

  • Angular2文档学习的知识点摘要——依赖注入

    目录 目录依赖注入 xff08 DI xff09 为什么需要依赖注入 xff1f Angular 依赖注入 配置注入器在 NgModule 中注册提供商在组件中注册提供商该用NgModule还是应用组件 xff1f 注入服务显性注入器的创建
  • Spring-依赖注入(IOC)

    SPRING 一 依赖注入 xff08 IOC xff09 1 什么是依赖注入 xff08 1 xff09 我们经常说的控制反转 xff08 Inversion of Control IOC xff09 和依赖注入 xff08 Depend
  • spring的依赖注入

    一 点睛 控制反转和依赖注入在Spring环境下是等同的概念 xff0c 控制反转是通过依赖注入实现的 所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系 xff0c 而不是通过对象本身负责自己的创建和解决自己的依赖 依赖注入的主要目
  • 降低代码耦合度的方法 -依赖注入

    降低代码耦合度的方法 依赖注入 什么是依赖注入为什么要使用依赖注入Laravel中的依赖注入 什么是依赖注入 什么是依赖注入 xff0c 就要先了解什么是依赖 在面向对象语言中 xff0c A类需要引用B类中Y方法的 xff0c 则称A类和
  • Spring_ 依赖注入 详细讲解

    文章目录 一 什么是依赖注入 xff1f 1 类的关系1 1 依赖关系 xff08 Dependency xff09 1 2 聚合 xff08 Aggregation xff09 2 关系强度 二 为什么使用依赖注入 xff1f 1 开闭原
  • Nodejs+AngularJS模块之Angular依赖注入

    Nodejs 43 AngularJS模块之Angular依赖注入 Angular模块需要的模块idea项目结构1 基本的nodejs静态Web服务器代码2 在控制器和模块定义中实现依赖注入代码injector jsinjector htm
  • .Net6.0系列-8 依赖注入(一)

    依赖注入 Dependency Injection DI 是控制反转 Inversion of Control IOC 思想的实现方式 依赖注入简化模块的组装过程 降低模块之间的耦合度 DI的几个概念 服务 Service 和框架请求之后返
  • Field injection is not recommended 依赖注入方式

    参考文章 http vojtechruzicka com field dependency injection considered harmful 首先对于还不熟悉 Autowired的同学当然也包括我先去看看它到底有什么作用 自动装配
  • koin框架预研文档

    背景 koin框架简介 Koin框架 适用于使用Kotlin开发 是一款轻量级的依赖注入框架 无代理 无代码生成 无反射 相对于dagger 而言更加适合Kotlin语 引入目的 目前app比较常用的是dagger框架 dagger框架属于
  • 何为依赖注入(DI)?

    何为依赖注入 DEPENDENCY INJECTION 平常在写代码的时候 经常会在一个类中写出这样的一段代码 以 PHP 代码展示
  • 控制反转及Bean装配的几种方式

    控制反转及Bean装配的几种方式 Spring两大基础核心 一是控制反转 二是依赖注入 控制反转和依赖注入 控制反转 通俗来讲 就是将bean的创建和销毁交由另一个东西全权管理 这个东西叫做Spring容器 一般来说 在Spring应用中
  • 依赖注入学习总结1

    生活中的 控制反转 自己发电和用电网的电 自己发电需要自购发电机 自学发电方法 维护发电设备等等 用电网的电只需要付费就可以直接使用 依赖注入 Dependency Injection DI 是控制反转 Inversion of Contr
  • Spring依赖注入

    内容主要来自 Spring实战 第二章 区别在于自己写了一个测试类 对于初学者更容易理解依赖注入 先定义两个接口 1 CompactDisc java package soundsystem public interface Compact
  • GO 依赖注入

    依赖注入是软件工程中经常使用到的一种技术 它提供了一种控制反转的机制 把控制权利交给了调用方 调用方来决定使用哪些参数 哪些对象来进行具体的业务逻辑 依赖注入的本质其实是为了将组件的创建与其依赖的创建分离 实现原理 通过反射读取对象的依赖
  • Spring源码分析(十一)依赖注入源码解析4:DefaultListableBeanFactory#findAutowireCandidates 根据类型查找所有候选Bean

    根据类型查找所有候选Bean org springframework beans factory support DefaultListableBeanFactory findAutowireCandidates protected Map
  • Koin--适用于Kotlin的超好用依赖注入框架,Dagger替代者,Koin史上最详细解说,一篇就够了,妈妈再也不用担心我不会依赖注入了

    今年呆在家中实在无聊 外面太危险了 还是在家学习比较安全可持续 过年期间 我又复习了几遍依赖注入框架Dagger 诶 什么是依赖注入 说白了就是降低跟类对象之间的耦合 当需要修改类对象的时候 能不修改被依赖的实例 其实我们平常就用到了很多的
  • Sping为什么使用依赖注入而不使用实例化对象的方式?

    首先说明一下概念 依赖注入 Dependency of Injection 和控制反转 Inversion of Control 简称 ioc 是一个概念 具体含义 当某个角色 Java实例class A 调用者 需要另一个角色 另一个Ja
  • Spring控制反转和依赖注入的好处

    要了解控制反转 Inversion of Control 我觉得有必要先了解软件设计的一个重要思想 依赖倒置原则 Dependency Inversion Principle 什么是依赖倒置原则 假设我们设计一辆汽车 先设计轮子 然后根据轮
  • Flutter依赖注入

    依赖注入 依赖注入 Dependency Injection 简称DI 是一种软件设计模式 它的主要目的是将对象之间的依赖关系解耦 使得代码更加可维护 可测试 可扩展 使得代码更易于维护和测试 在Flutter中 DI可以帮助我们管理应用程
  • 30天精通Nodejs--第二十一天:express-依赖注入

    目录 引言 Express中的模块化实践 依赖注入 什么是依赖注入 Express中实现依赖注入 结语 引言 在构建大型且复杂的Node js Express应用程序时 良好的架构设计至关重要 模块化编程可以帮助我们把代码分解为可复用 易维

随机推荐

  • 无人机飞控算法-姿态估计-欧拉角-旋转矩阵-四元数

    无人机飞控算法 姿态估计 此系列记录了我理解的卡尔曼滤波从0到1的过程 xff0c 从姿态估计到位置估计 xff0c 我们从核心点一个个出发 xff0c 并结合实际模块的应用来一一揭开卡尔曼滤波的神秘面纱 提示 xff1a 在系列文章中 x
  • bash下变量PS1的完整理解

    本文并不会讲解如何设置PS1以获得你喜欢的提示符 xff1b 本文会围绕PS1这个变量 xff0c 就其涉及到的一些概念展开讨论 导言 ubuntu 的默认 shell 是 bash xff0c bash 下有个变量 PS1 xff0c 我
  • 我的世界Mod整合包中的Mod下载

    MC中Mod整合包有时通过启动器无法正常安装 xff0c 此时可以其中通过提供的manifest json文件获取其在curseforge网站中的信息 文件中的projectID是Mod的ID fileID是对应版本文件的ID 通过这两个值
  • 使用OpenCV给图片添加Logo

    import cv2 import numpy as np imgcat 61 cv2 imread 34 d img cat jpg 34 imglogo 61 cv2 imread 34 d img logo jpg 34 imglog
  • Minecraft中Python编程

    安装Raspberry Jam Mod Raspberry Jam Mod是arpruss为Minecraft开发的插件 xff0c 在PC版Minecraft中的实现了树莓派版的Python接口 可以从这里下载最新版本 作者提供了自动安装
  • 打开AS提示错误弹框缺少com.android.tools.design.org.jetbrains.android插件

    打开AS提示错误弹框缺少com android tools design org jetbrains android插件 今个准备升级一下AS来着 xff0c 然后出现了这个问题 xff0c 原因是我屏蔽了Kotlin插件 解决方法 xff
  • 推箱子游戏JS实现

    参考以下教学视频编写 教学视频 xff1a Canvas画布实现推箱子游戏 HTML5前端设计JavaScript原生开发 哔哩哔哩 bilibili 箱子地图 Boxdata js 1 xff1a 围墙 2 xff1a 目标点 3 xff
  • 五子棋游戏JS实现

    参考教学视频 xff1a Canvas画布案例 五子棋 1 基础 哔哩哔哩 bilibili 1 棋盘设计 xff0c 落子功能 lt DOCTYPE html gt lt html gt lt head gt lt meta charse
  • JS五子棋(AI)

    JS五子棋 AI xff09 跟随算法 xff1a 白棋始终跟随当前黑棋周围 span class token doctype span class token punctuation lt span span class token do
  • Discuz7.2漏洞

    发布日期 xff1a 2010 01 06 更新日期 xff1a 2010 01 07 受影响系统 xff1a Discuz Discuz 7 1 Discuz Discuz 7 2 描述 xff1a Discuz 是一款华人地区非常流行的
  • vfp常见问题和代码

    1 VFP为何在编译时提示找不到菜单生成程序 xff1a 设置 GENMENU 系统内存变量到适当的路径和文件 例如 假定 FoxPro 安装在 C 盘上的 VFP 中 在命令窗口打入以下命令来恢复系统变量的值 GENMENU 61 34
  • VFP中Form的重要概念

    本文所指的 34 表单窗口属性 34 是指那些不但影响表单本身的特征 xff0c 而且对表单之外 项目之中的其它 34 元件 34 有影响的表单属性 xff0c 它们是 xff1a 属性 意义 可选值 黑体为默认值 DeskTop 指定表单
  • MacOS M1芯片安装PyQt5的方法

    MacOS M1芯片安装 PyQt5 的方法 关于PyQt5 PyQt5 是GUI 小部件工具包 xff0c 是 Qt 的 Python 接口 xff0c 是图形界面开发库 xff0c 用于程序的用户交互界面 按照官网 PyQt5 pypi
  • iOS富文本编辑(在label里显示文字和图片)

    在开始写之前先看一下效果图 在此效果图中有富文本中指定的位置添加图片 xff0c 还有最后位置添加的图片信息 代码如下 调用方法 给label赋值 NSString Str 61 64 34 中国人民解放军万岁 xff0c 中华人民共和国万
  • ubuntu下安装VNC远程桌面的详细步骤

    作者 xff1a 转自 xff1a http www 5loveb com 4 515 html Virtual Network Computing VNC 是进行远程桌面控制的一个软件 客户端的键盘输入和鼠标操作通过网络传输到远程服务器
  • 服务器esxi安装

    一 部署raid0或raid1 xff08 Raid0的配置过程与Raid1大致相同 xff0c 唯一不同是在选择Raid级别这一步选择Raid0即可 xff09 xff08 一 xff09 在RAID卡适配器自检页面按组合键Ctrl 43
  • MFC编辑框数据读写

    简介 xff1a 有几种常用的获取编辑框内容和写入的方法 xff0c 初学者往往容易迷惑 1 第一种 通过GetDlgItem和GetWindosText char szEdit 10 61 0 int nEdit 61 0 GetDlgI
  • Peer cert cannot be verified or peer cert invalid 解决方法

    yum安装软件时报Peer cert cannot be verified or peer cert invalid xff0c 如下图所示 xff1a 解决办法 xff1a 在 etc yum conf文件后追加sslverify 61
  • 在anaconda中为jupyter安装扩展插件

    安装过程 xff1a 1 在开始菜单中打开Anaconda Prompt 2 执行如下安装命令 xff1a conda install c conda forge jupyter contrib nbextensions conda ins
  • 降低代码耦合度的方法 -依赖注入

    降低代码耦合度的方法 依赖注入 什么是依赖注入为什么要使用依赖注入Laravel中的依赖注入 什么是依赖注入 什么是依赖注入 xff0c 就要先了解什么是依赖 在面向对象语言中 xff0c A类需要引用B类中Y方法的 xff0c 则称A类和