重建模与重构的区别


Refactoring is tactical, remodelling is strategic.
重构是战术性的!  重新建模是战略性的。
重构好像已经变成了提高软件质量的专有名词,这个词语是由Martin Fowler提出,并专门出版了两版的《重构》书籍,被誉为“圣书宝典”。
但是DDD社区提出了:重构只是一种战术手段,重新建模才是战略方向,如果一个系统的业务模型或业务逻辑或核心算法都发生了问题,在错误的战略方向上做得无论多完美,也是徒劳,也是南辕北辙。
重构与重新建模是两个层面,重构的范围局限在技术架构层面,目标是为了提高可组合性,但不是为了可复用性,组合性虽然表面上也呈现复用,其实更多是一种管道pipleline或流stream的作用。可组合性是软件的摩尔定律,会对整个复杂系统例如社会系统产生蝴蝶效应。重构是与业务上下文无关的。
重新建模是与业务上下文相关,这也是可复用性很美好但是很难实现,因为业务上下文是不同的,如何实现复用呢?就是同一个行业比如全国社保,各地社保政策还是不同,所以无法纳入一个可复用的全国社保系统,各个省社保只能重新建模。
重构与重新建模在规模上也是不同的,重构是一种渐进式发展,类似修修补补又三年,然后通过扼杀者模式将旧系统卸除删除,这种方式看上去很好,但是致命问题是忽视复杂系统的整体性,人为介入复杂系统本身也会给系统带来致命打击,系统中虽有bug,但是总体还正常,如果你修复了bug,系统反而不能运行了,你傻眼不?说明系统内部是耦合的,错综复杂的,从哪里开始修,开始补,不是像补衣服那样一目了然。这也是物理还原论或传统分析分解思维的缺陷,今年诺贝尔物理奖和经济学奖颁给复杂系统研究也是说明这点。
重新建模是伤筋动骨的大手术,可能意味着重写,当然你也可以追随潮流认为这是重构,Evans在他的DDD书籍中也认为对股份share pie重新建模是一种重构。其实是不严谨的,或者说他可能自己也没有意识到,这是重新建模,不是重构啦。

参考:
DDD中如何借助行业术语突破性发现领域模型? - Mathias
Share Pie: 隐藏的DDD宝藏 -Nick