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

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

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. 最小生成树(求村落之间最小修哪几条路能使耗资最小)
  2. 共轭梯度法求解线性方程组
  3. 允许多域名跨域 php,php后端控制可跨域的域名,允许图片跨域上传
  4. jquery csv2table 插件
  5. Matlab--Monte Carlo simulation
  6. BZOJ1101 洛谷3455:[POI2007]ZAP——题解
  7. 大数据_Hbase-shell命令_操作hbase_完成对表的增删改查---Hbase工作笔记0005
  8. 苹果全线支持支付宝,放不下的中国战场
  9. 一位寒门博士的致谢,女友回复...
  10. CLI里面的秘密……(二)强命名、元数据以及文件结构(上半部分)
  11. 大话西游手游服务器维护要多久,2018年11月22日维护公告
  12. 程序员写文档工具推荐,让你爱上写文档!
  13. (5)air202读取串口数据并上传到阿里云显示
  14. 如何用基于保利威视云平台来做网络年会直播活动
  15. matlab求合同矩阵,matlab-线性代数 判断 合同矩阵
  16. windows系统加了一个别的系统!------centos_6 by VMware
  17. 停车场车辆出入管理系统的设计与实现
  18. JavaScript+css实现的喜庆活动邀请函多页面html源码
  19. Bootstrap初识
  20. vue垂死挣扎--遇到的问题

热门文章

  1. ORA-12638: 身份证明检索失败
  2. Spring Boot(09)——使用SpringMVC
  3. Azure 中国篇之计算服务—多个站点的×××配置
  4. 18个不常见的C#关键字,您使用过几个?
  5. 方立勋_30天掌握JavaWeb_XML
  6. 有些事情女孩子越早知道越容易幸福
  7. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)
  8. 关于 ie8不兼容的一些方法
  9. jquery 收藏技巧
  10. C++类构造析构调用顺序训练(复习专用)