浅谈交易链路中的一些设计原则&模式
阿里妹导读
作者对设计原则、模式等学习后,通过本文谈谈自己的感受。
序
设计原则
单一职责原则
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。
履约系统 往下会按能力程度角度沉淀,在一个能力里面需要考虑多种场景,比如:在打款扩展点的时候,可能来自确认收货,可能来自退并打,也可能来自定金罚没;
逆向退款系统 的扩展,尽量会按照业务活动独立,比如退款的超时定制,买家申请退款、卖家同意退款、买家退货等不同业务活动有各自的扩展点。
单一职责原则理解
开闭原则
开闭原则,在面向对象编程领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
在域扩展里面,针对一个特殊业务提供能力(这个业务的逻辑比较完整和独立),可以不走到扩展点。会出现,长在平台的jar包中,但是演变规则基本是业务定,开发又需要平台介入的特殊合作情况;
在独立部署的系统中,代码库进行fork出去,进行独立演进。这时,整个层次都会被定义为“业务”;
商业能力被认为是平台能力,也会集成进平台sar包中,但是像税费、进口商业能力,基本是国际业务维护,很难说是平台逻辑。
开闭原则理解
里氏替换原则
里氏代换原则 (Liskov Substitution Principle LSP) 面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
在进行扩展点定制的时候,我们并不关心是业务包还是场景产品包返回的结果,只关心定制的结果。
在进行数据库切换的时候,我们并不关心走向哪个数据服务,只关心返回的结果;
在外部支付系统调用的时候,我们并不关心走的是支付宝还是微信,只关心支付的结果;
在进行订单查询的时候,我们并不关心走的是订单库,还是外部服务(如评价),只关心查询的结果;
.......
服务保障可能不一样:比如待付款、待发货等查询的是订单库,待评价查询的评价接口,接口的保障等级和能力可能不一致。需要做额外的稳定性保障。
实现能力可能不一致:过了3个月之后,订单会进入历史库,虽然查询层面可以做适配,做到消费者无感,但是消费者后续操作会受到制约,因为变更的时候,两边能力是不一样的。有些按钮会在进入历史库后降级。
协议可能不一致:比如支付系统的替换,支付宝因为有担保交易,所以售中退钱比较快速方便,但是微信登渠道,受到后面资金托管和策略影响,退款可能没有那么及时。两边的错误码等也是不一样的。
.......
迪米特法则
迪米特法则可以简单说成:talk only to your immediate friends。对于OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
可以精简模型,减少链路上数据传递和多次convert;
可以控制只读,避免后续进行非预期的篡改;
可以节约性能,可以设计懒加载等模式,需要时再真正获取;
......
接口隔离原则
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。
按读写能力隔离:读数据的接口一套,写操作的另外一套。
按操作角色隔离:买家操作的接口一套,卖家操作一套,小二操作的一套。
按页面类型隔离:PC的一套、H5的一套、客户端的一套。
按组件协议隔离:奥创的一套、Astore的一套、DTO的一套。
........
对客户端来说,依赖也可以变小(虽然每个系统往往只有一个大client),可以排除一些不必要的依赖;
对服务端来说,也可以更好地独立发展,避免耦合,对于复用的也可以抽象share和common。
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
打包模块:假设在A依赖B的过程中,引入了抽象C。这样的抽象层,因为和A,B没有关系,应该是单独的jar包和代码库。但是常常因为新建库的麻烦,会托管到A 或 B 的某个子模块中,打包的时候需要单独打一下,比较别扭。
复杂对象挑战:面向抽象的接口,意味着更多的convert,在普通系统中,可能这是相对轻松的,但是在交易复杂对象设计的背景下,这又将是一个痛苦的过程。更加可怜的是,交易系统的领域对象与数据库模型是一个逻辑映射,叠加这些层次后,很难找到数据是怎么带出来的。
设计模式
模板(Template)
责任链(Chain of Responsibility)
策略(Strategy)
观察者(Observer)
状态(State)
中介者(Mediator)
组合(Composite)
单件(Singleton)
解释器(Interpreter)
代理(Proxy)
总结
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。
推荐:
《设计模式六大原则理解》
阿里云开发者社区,千万开发者的选择
阿里云开发者社区,百万精品技术内容、千节免费系统课程、丰富的体验场景、活跃的社群活动、行业专家分享交流,欢迎点击【阅读原文】加入我们。
微信扫码关注该文公众号作者