技术上的争论,我是错的吗?

0 阅读4分钟

问题

这个周日一直被昨天与同事争论的一个问题所困扰(周六加了班),背景是上周的一个项目,TL让我新建了一个JAR类型的工程,设计一个提供灰度功能的模块,经过清明的奋战赶工,也是如期的赶上了项目进度。

我提供的灰度模块功能是这样的,最外层是业务所属的灰度层,提供每个业务定制的灰度功能,比如各个灰度间的串联,前置数据的查询等。内层为一个通用的单个灰度服务,灰度服务串联了 白名单、阻断、版本判断、AB实验、梵高人群 五个环节,接口类提供了一个判断单个用户灰度的方法,主体流程都写在 abstract 抽象类里面,子类只需要实现一个 getConfig() 方法,提供本灰度需要的配置,例如 白名单配置、版本配置、AB实验配置 等。当单个灰度接入时,只需要实现抽象类,返回灰度配置,定义好本灰度场景值即可。

组内的一位同事,看了我设计的灰度流程后,反应比较激烈。

同事的观点

同事的观点是,我提供的判断单个灰度的流程,过于复杂冗余,不符合单一职责原则,abstract 类逻辑过多,其它同事接入时的学习成本太高。

同事认为,不需要提供内层的单个灰度流程,而是提供自定义的灰度服务和几个工具类即可,即最外层的业务灰度,以及 白名单、阻断、版本判断、AB实验、梵高判断 这 5 种工具,当使用者接入灰度时,新建一个业务灰度类,在业务灰度类内部调用工具串联起整个流程。

同事举了一个例子,如果业务诉求是判断 1 个版本以及 3 个实验时,如果按照我的方式,需要写 3 个单个的灰度实现类,然后新建一个业务灰度类,再去调用这 3 个灰度实现类进行判断。如果按照他的方式,只需要新建一个业务灰度类,然后调用一个版本工具类判断,再调用 3 次实验判断,就可以完成业务方诉求。

我的理由

我的观点是,所提供的通用单个灰度服务,并非不符合单一职责原则,单一职责原则虽然要求提供粒度小、功能单一的类,但是单一职责的目的是 可复用性、可维护性、可扩展性、可读性,虽然我所提供的单个灰度判断流程的可读性稍差,但是做到了很好的可复用、可维护、可扩展,因此与单一职责并没有冲突。而且使用者接入,在绝大多数灰度场景下,都不需要感知整体逻辑,只需要进行简单的抽象类实现,定义好版本、实验等配置即可,接入成本是非常低的。

而且,同事所列举的例子,是属于比较少数的场景,绝大多数场景是提供【单个版本】+【单个实验】判断即可,如果按照我的流程,只需要提供单个灰度实现类,再新建一个业务灰度类,直接进行简单调用,这比在业务类中调用工具进行流程串联成本是更低的。而即使是同事所举的例子,接入成本也不高,虽然新建 3 个实现类,有类膨胀的趋势,但是这 3 个实现,本身就是 3 个单一的灰度,应该进行隔离。

再者,因为通用的单一灰度框架进行了统一的监控打点、灰度降级等能力,因此从可观测可降级角度考虑,也是优于同事的方式的。

结论

这个问题目前并没有结论,同事准备下周一把问题抛给TL,让TL进行决断,如果结论是同事的方式更好的话,他准备另写一套。

不知大家怎么认为,是我的方式更好呢,还是同事的观点更为正确。