重构设计中,需要对自己原来的软件产品,进行从底到顶的剖析和重构处理,需要设计成高度灵活的架构,因为在设计过程中,遇到很多设计方面和代码组织方面的问题,查阅了很多开源作者的一些组织思路和代码结构。

有很多优秀的设计,读起来如读一篇优美的文章,但更遇到过很多的设计和代码组织,如一团麻,代码对于开发人员来说,就如报纸对于读者,必须能提纲挈领,读起来顺畅,思路清晰,不能为了追求所谓的设计而去过度设计。

我认为好的设计,首先是边界,需要能把要完成的对应的业务需求,完整的剖析开,比如要做通信中间件,就不应该在通信中间件中夹杂日志记录等等的处理,日志记录可以放在与通信中间件相关的边界点去处理。

第二是耦合度低,与其他业务组件的交互应该是一个很粗粒度的,应在接口和约束方面做交互,比如涉及到业务逻辑,调用业务逻辑接口,涉及数据结构,可以利用模板编程,比如利用泛型做数据约束,约束需要精准清楚,这样才不会产生调用的二义性。

第三是抽象要合理,共同的业务抽象到统一的抽象类中,忌讳的是,实现与抽象之间一上一下,这样逻辑会被带着在两个类中,来回切换,逻辑阅读的连贯性遗失,这是很多设计人员喜欢采用的策略,但是却是阅读的弊端,我们可以利用抽象类去约束一些实现,但不应该利用约束实现太多的逻辑,除非不得已,需要实现对应的约束逻辑,否则还是不要在抽象类中越俎代庖去实现派生类中很多不必要的逻辑。

第四是学会封装变化,设计中我认为最重要的是,要合理的封装变化,这是各种设计模式所倡导的,之所以有架构,就是因为软件中有很多相似的东西,我们可以分类,可以抽象,我们需要去观察,在当前的设计中哪部分是在不停的变化,我们就需要将该部分独立封装出来,封装到公共的基类或接口上,这样应对业务变化时,只需要去实现对应的派生类就可以了。

第五是善用设计模式,设计模式是前人对软件架构的总结,但我们需要善用,比如工厂模式,所谓工厂是能把各种原料通过设备和人员组织起来,加工成对应的成品,而软件设计中,工厂模式也是在实现相同的目的,比如在设计一个通信组件时,通信的对象是我们需要的最终产出的产品,我们不关心是采用串口、TCP、UDP或什么通信方式,我们只关心,我们能从通信对象上发送数据和接收数据,至于具体的通信方式设置,通信参数设置,协议封包、拆包方式、会话方式等,全部交由工厂来处理吧,我们只需要提供基本的原料信息给工厂就可以了。

第六是要会仿生或拟物,现代工业很多优秀的工业产品的都是利用仿生学,因为大自然在千百年的进化中,已经给各种不同的物种赋予了各种特殊的能力,工业产品就是在模仿这些特殊的能力。在软件设计中,必须要有这个全局观,很多设计人员在设计时,只是为了实现代码的组织性或设计性,而忽略了具体的应用场景。不同的应用场景下,整个设计所需要兼顾的东西也不一样,比如是高实时性、高并发、高响应还是低容错、高稳定,因为资源有限,很多东西难以左右兼顾,这就要求在设计中有偏重和依赖。比如一个支付场景,我们对数据的可靠性要求很高,在数据处理时就需要对每一个数据封包进行校验解析,而在一个在线视频场景,因为为了保证视频的实时性,我们就可以丢弃一些延迟的数据封包,而更关注的是最新的实时封包。