代码解耦之道 黄朝晖 PHPCON2019

作为终身致力于写代码的人来说,熟练地写出低耦合的代码是个逃不掉的坎,那么怎样才是低耦合呢?又有哪些好用的方式和技巧?本演讲将分享一些本人在代码解耦方面的一些技巧和心得。

1、何为解耦? 2、何为IoC和DI?如何通过DI解耦代码? 3、何为观察者模式?如何通过观察者模式解耦代码? 4、何为策略模式?如何通过策略模式解耦代码? 5、何为AOP?如何通过AOP解耦代码?

展开查看详情

1.代码解耦之道 黄朝晖

2.PHPCon PPT https://github.com/ThinkDevelopers/PHPConChina PPT PHPCon

3.Hyperf • 启动于 2018 年 8月,于 2019 年 6 月 20 日以 MIT 协议对外公开 • 每周发布一个兼容的迭代版本,每个变更都有 Changelog • Github 获得 842 个 star,共 2,517 commits,256 Pull Requests, 22 Contributors • 60 个组件,560 tests,1,870 assertions

4.性能数据 • ab -k -c 100 -n 10000 • ≈90883 requests / s • time per request • 1.100 ms (C) • 0.011 ms (S) • % of the requests • 80% < 1 ms • 99% < 3 ms

5.初衷 • 尽管现在基于 PHP 语言开发的框架处于一个百花争鸣的时代, 但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架, 亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢 迎大家加入我们参与开源建设 • 各种 Swoole 框架开发无法沉淀和复用,设计上强耦合,而 Hyperf 每个组件从设计之初就考虑如何在其它框架上复用

6.Hyperf • MySQL Client、Redis Client,Eloquent ORM、JSON RPC Server/Client、gRPC Server/Client、WebSocket Server/Client、 Zipkin (OpenTracing) Client、Guzzle HTTP、Elasticsearch Client、Consul Client、ETCD Client、AMQP、Redis Queue、 Apollo / 阿里云 ACM / ETCD 配置中心、基于令牌桶算法的限流器、 通用连接池、熔断器、Swagger、Swoole Tracker (Enterprise)、 Blade / Smarty View Engine • Hyperf 还提供了 依赖注入、注解、AOP 面向切面编程、中间件、 自定义进程、事件管理器、自动模型缓存、Crontab 定时任务

7.Hyperf 的优势 • 高性能、CSP 协程编程、DI、注解、AOP、极其开放 • Laravel 用户无缝转移,无需重新学习的 Eloquent ORM • 协程组件库丰富且完备,不重新发明轮子,更稳定 • 可单体、可微服务、可 API、可视图、可注解,可配置 • 全面实现标准的 PSR 协议,3 (Logger), 7 (HTTP Message), 11 (Container), 14 (Event Dispatcher), 15 (HTTP Handlers), 16 (Simple Cache) • 非常详细的文档,变更记录清晰 • 代码风格统一、Pull Request 及 提交记录规范清晰

8.何为耦合? • 指一个程序中,模块与模块之间信息或参数依赖的程度

9.耦合度的计算方法 di:输入数据参数的个数 gd:用来存储数据的全局变量 ci:输入控制参数的个数 gc:用来控制的全局变量 do:输出数据参数的个数 w:此模块调用的模块个数 co:输出控制参数的个数 r:调用此模块的模块个数 Coupling(C) 数值越大表示耦合越严重, 数值一般会界于0.67(低度耦合)到1.0(高度耦合)之间

10.耦合度的计算方法 di:输入数据参数的个数 ci:输入控制参数的个数 数据和控制流的耦合 对参数解耦 do:输出数据参数的个数 co:输出控制参数的个数 gd:用来存储数据的全局变量 全局耦合 对内容解耦 gc:用来控制的全局变量 w:此模块调用的模块个数 环境耦合 对依赖解耦 r:调用此模块的模块个数

11.为什么要解耦合? • 解耦某种程度上是防御性编程,防御产品经理的脑洞 • 程序员最大的敌人不是需求,而是需求变更 • 解耦合是为了更好的应对需求变更

12.如何解耦? • 单一原则 • 依赖倒置原则 • 接口隔离原则 • 里氏替换原则 • 开闭原则 • 最少原则(迪米特法则)

13.单一原则 • 一个类只负责一项职责

14.依赖倒置 • 高层模块不应该依赖低层模块,二者都应该依赖 其抽象 • 抽象不依赖细节,细节依赖抽象

15.依赖倒置

16.依赖倒置

17.依赖倒置 简单来讲,就是 面向接口编程

18.接口隔离 • 实现不应该依赖它不需要的 接口,一个类对另一个类的 依赖应该建立在最小的接口 上

19.策略模式 • 指对象有某个行为,但 在不同的场景中,该行 为有不同的实现算法

20.IoC 与 DI • IoC,即控制反转,把对象的调用权交给容器,通过容器 来实现对象的装配和管理 • DI,即依赖注入,对象之间依赖关系由容器在运行期决 定,由容器动态的将依赖关系注入到对象之中 • DI 是对 IoC 更完善的描述

21.IoC 与 DI • IoC,即控制反转,把对象的调用权交给容器,通过容器 来实现对象的装配和管理 • 谁控制谁? IoC 容器控制对象 • 控制了什么?控制了对象的外部对象获取 • 为什么要反转?IoC 容器帮助我们获取对象及注入依赖 • 反转了什么?获取依赖对象的过程被反转了

22.IoC 与 DI • DI,即依赖注入,对象之间依赖关系由容器在运行期决 定,由容器动态的将依赖关系注入到对象之中 • 谁依赖谁?对象实例化依赖容器 • 为什么要依赖?对象实例化通过容器自动得到外部依赖 • 谁注入谁?容器注入对象的依赖到对象中 • 注入了什么?注入了对象的外部依赖

23.IoC 与 DI

24.IoC 与 DI - 自动注入

25.观察者模式 • 一种对象行为模式 • 它定义对象间的一种一对多的依赖关系,当一个 对象的状态发生改变时,所有依赖于它的对象都 能得到通知 • PSR-14 Event Dispatcher 事件调度器

26.观察者模式

27.观察者模式 • 一个简单的基 于 PSR-14 实 现的事件调度 器

28.观察者模式

29.观察者模式