本文记录我在工作中的一次失误。

如下图所示,我在构造函数里注入了一个新的依赖:

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相关推荐

  1. 关于 SAP 电商云 Spartacus UI 修改 div 层级结果是否算是 breaking change 的问题

    这里理论上也可以连续点击,每次点击产生一个 HTTP PUT 请求: 修改之后: 修改之前: Changing anything that affects the rendering of the e ...

  2. 修改 Angular Component 构造函数参数被认为是 breaking change

    修改构造函数参数被认为是 breaking change: Making any changes to the class constructor signature. Note that super ...

  3. 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入

    构造方法与重载:定义一个网络用户类,信息有用户 ID.用户密码. email 地址.在建立类的实例时把以上三个信息都作为构造函数的参数输入, 其中用户 ID 和用户密码时必须缺省时 email地址是用 ...

  4. std输入参数太多matlab,错误使用函数,输入参数太多怎么解决

    请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...

  5. Kotlin入门(10)七十二变的输入参数

    上一篇文章介绍了Kotlin对函数的基本用法,包括函数的定义.输入参数的声明.输出参数的声明等等,这些足够对付简单的场合了.当然了,倘若一门新语言仅仅满足于这些雕虫小技,那也实在没什么前途.既然Kot ...

  6. java如何对foo bar调用方法_关于java:如何测试工厂方法传递给构造函数的参数?...

    我遇到了一个我真不知道如何解决的情况.我刚刚创建了一个类Foo,它包含一个静态工厂方法,使用一些参数创建类Bar,因此Foo是一种工厂类.现在我想测试这个方法,但问题是,这些参数在内部被修改,以创建在 ...

  7. (3)通过输入参数(测量数据)构建三维体模型(02)

    1.参数 2.主代码 #include "InitInclude.h" #include <vtkQuadric.h> #include <vtkSampleFu ...

  8. (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 ...

  9. (6)通过输入参数(测量数据)构建三维体模型

    1.参数 vector<double> d = { 2,1,1,3, 1,1,1,5, 3,2,3,5, 7,5 }; 2.主代码 #include "InitInclude.h ...

最新文章

  1. GPU端到端目标检测YOLOV3全过程(下)
  2. java的关键字与保留字
  3. NSUserDefaults的一些用法
  4. 【线段树】二进制(luogu 4428)
  5. Linux内核设计与实现---进程地址空间
  6. html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...
  7. linux启动过程剖析,分析Linux系统的启动过程
  8. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例
  9. .net framework 4.5安装失败
  10. Linux 基本命令不能用的解决方法
  11. sqlyog证书秘钥(注册码)
  12. 【开发环境】运行Hitool出现“A Java Runtime Environment (JRE) or Java Development Kit (JDK)”错误处理
  13. 09.大数据技术之Spark
  14. iOS 13获取keyWindow
  15. Sharpen 的调试步骤
  16. Android仿淘宝京东商品规格参数颜色筛选
  17. 英飞凌 DAVE™ 4.1.2 SDK 开发app学习笔记——什么是DAVE APP?
  18. 金立android怎么升级到7.o,金立手机怎么刷机?只需七步轻松刷机
  19. PLM系统应用案例:重庆通用工业(集团)有限责任公司
  20. 席位预定中,第二届世界物联网安全峰会5.30-5.31

热门文章

  1. MySQL源码学习——DBUG调试
  2. 开发者基础知识游戏,共10关,欢迎挑战
  3. ORACLE SQL调优之执行计划与隐藏参数_complex_view_merging
  4. Self Crossing
  5. 一站式学习Wireshark(转载)
  6. Android在View拉丝工艺和invalidate()和其他相关方法
  7. 使用Samba服务器构建私有和公共共享目录
  8. Microsoft宣布为Power BI提供AI模型构建器,关键驱动程序分析和Azure机器学习集成...
  9. Python是一门什么样的语言
  10. sh 脚本执行sql文件传参数