避免修改构造函数输入参数引起的 breaking change
本文记录我在工作中的一次失误。
如下图所示,我在构造函数里注入了一个新的依赖:
protected checkoutService: CheckoutService
当下列情况同时满足时,客户就会遇到编译错误:
(1) 客户升级到了新的 minor 版本,即我引入该新的依赖的版本。
(2) 客户之前扩展了 CheckoutDeliveryService
(3) 客户在自己的扩展类的构造函数里,调用了 super 即父类的构造函数。
因为客户是从旧版本升级上来的,所以构造函数里没有传递我这个新版本引入的 checkoutService 输入参数,所以会遇到语法错误。
正确的做法如下图所示:
export class CheckoutDeliveryService implements CheckoutDeliveryFacade {constructor(protected checkoutStore: Store<StateWithCheckout>,protected processStateStore: Store<StateWithProcess<void>>,protected activeCartService: ActiveCartService,protected userIdService: UserIdService,@Optional() protected checkoutService?: CheckoutService) {}
使用 @Optional 来修饰这个新引入的构造函数输入参数。
同时,在代码里的逻辑也需要改变,需要同时处理 checkoutService 为空或者不为空的情况。
protected isCheckoutDetailsLoading$: Observable<boolean> = this.checkoutService? this.checkoutService.isLoading(): this.checkoutStore.pipe(select(CheckoutSelectors.getCheckoutLoading));
如果 checkoutService 不为空,则使用 checkoutService.isLoading 返回的 Observable;否则,就为旧版本的情况,使用旧版本的实现,从 checkoutStore 里取出 checkout loading 的读取状态。
修改了服务代码之后,也会影响到对应的单元测试代码。
如今的 isSetDeliveryModeBusy 标志位,决定其值的输入条件之二,从 checkoutService.isLoading, 更改成了 isCheckoutDetailsLoading.
因此,在单元测试代码里,我们需要创建一个全局的 isCheckoutLoading$ Observable 对象:
然后创建一个 mockCheckoutService 类,内部返回这个全局的 isCheckoutLoading$ Observable 对象。
这样,在任何时候我们需要修改 CheckoutService.isLoading 的返回值时,通过调用 isCheckoutLoading$ 的 next 方法即可灵活控制。
需要强调的是,在大型 API 中保持稳定性是一项挑战。 如果您要更改 API 库,请考虑更改的广泛后果,并尝试预测可能出现的任何问题。
更多Jerry的原创文章,尽在:“汪子熙”.
避免修改构造函数输入参数引起的 breaking change相关推荐
- 关于 SAP 电商云 Spartacus UI 修改 div 层级结果是否算是 breaking change 的问题
这里理论上也可以连续点击,每次点击产生一个 HTTP PUT 请求: 修改之后: 修改之前: Changing anything that affects the rendering of the e ...
- 修改 Angular Component 构造函数参数被认为是 breaking change
修改构造函数参数被认为是 breaking change: Making any changes to the class constructor signature. Note that super ...
- 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入
构造方法与重载:定义一个网络用户类,信息有用户 ID.用户密码. email 地址.在建立类的实例时把以上三个信息都作为构造函数的参数输入, 其中用户 ID 和用户密码时必须缺省时 email地址是用 ...
- std输入参数太多matlab,错误使用函数,输入参数太多怎么解决
请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...
- Kotlin入门(10)七十二变的输入参数
上一篇文章介绍了Kotlin对函数的基本用法,包括函数的定义.输入参数的声明.输出参数的声明等等,这些足够对付简单的场合了.当然了,倘若一门新语言仅仅满足于这些雕虫小技,那也实在没什么前途.既然Kot ...
- java如何对foo bar调用方法_关于java:如何测试工厂方法传递给构造函数的参数?...
我遇到了一个我真不知道如何解决的情况.我刚刚创建了一个类Foo,它包含一个静态工厂方法,使用一些参数创建类Bar,因此Foo是一种工厂类.现在我想测试这个方法,但问题是,这些参数在内部被修改,以创建在 ...
- (3)通过输入参数(测量数据)构建三维体模型(02)
1.参数 2.主代码 #include "InitInclude.h" #include <vtkQuadric.h> #include <vtkSampleFu ...
- (5)通过输入参数(测量数据)构建二维体模型(01)
1.参数 vector<double> d = { 2,1,1,3, 1,1,1,5, 3,2,3,5, 7,5 }; 2.代码 #pragma once #include "I ...
- (6)通过输入参数(测量数据)构建三维体模型
1.参数 vector<double> d = { 2,1,1,3, 1,1,1,5, 3,2,3,5, 7,5 }; 2.主代码 #include "InitInclude.h ...
最新文章
- GPU端到端目标检测YOLOV3全过程(下)
- java的关键字与保留字
- NSUserDefaults的一些用法
- 【线段树】二进制(luogu 4428)
- Linux内核设计与实现---进程地址空间
- html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...
- linux启动过程剖析,分析Linux系统的启动过程
- jdk1.8新特性之lambda表达式及在Android Studio中的使用举例
- .net framework 4.5安装失败
- Linux 基本命令不能用的解决方法
- sqlyog证书秘钥(注册码)
- 【开发环境】运行Hitool出现“A Java Runtime Environment (JRE) or Java Development Kit (JDK)”错误处理
- 09.大数据技术之Spark
- iOS 13获取keyWindow
- Sharpen 的调试步骤
- Android仿淘宝京东商品规格参数颜色筛选
- 英飞凌 DAVE™ 4.1.2 SDK 开发app学习笔记——什么是DAVE APP?
- 金立android怎么升级到7.o,金立手机怎么刷机?只需七步轻松刷机
- PLM系统应用案例:重庆通用工业(集团)有限责任公司
- 席位预定中,第二届世界物联网安全峰会5.30-5.31
热门文章
- MySQL源码学习——DBUG调试
- 开发者基础知识游戏,共10关,欢迎挑战
- ORACLE SQL调优之执行计划与隐藏参数_complex_view_merging
- Self Crossing
- 一站式学习Wireshark(转载)
- Android在View拉丝工艺和invalidate()和其他相关方法
- 使用Samba服务器构建私有和公共共享目录
- Microsoft宣布为Power BI提供AI模型构建器,关键驱动程序分析和Azure机器学习集成...
- Python是一门什么样的语言
- sh 脚本执行sql文件传参数