DDD-第四课

第四课-高效高质量编码:测试先行和意图导向的编程

image-20200808194825189

本讲大纲:

1.由外而内——发现和形成设计职责;

2.测试先行——表达和实现设计契约;

3.持续演进——契约是设计质量的保证。

从哪里写下第一行代码?

image-20200808195110856

自底向上的编程是很多浪费和麻烦的开始。

一个小游戏背后的故事:

image-20200808195400656

image-20200808195432178

image-20200808195601010

image-20200808195642014

设计是一种信息不完全情况下的决策。

由外而内的编程:

1.一般来说,外层的功能比底层的功能具有更高的确定性;

2.延迟决策到最后时刻,关键信息经常会自然显现;

3.由外而内的编程允许暂时忽略不重要的细节;

4.由外而内的编程——》“意图导向编程”。

意图导向编程(Programming By Intention)

意图导向编程就是“想什么就写什么”,用代码来表述你期望的行为。

想象:编码过程中,假设已经有一个理想的方法支持你的工作,你会怎么编写程序?那就这样编写它。

image-20200808200328949

CollisionDetector的具体实现

image-20200808201222838

底层设计一半来说涉及更多细节;由外而内的方式,让底层可以随时被替换。

由外而内、意图导向编程的收益:

1.职责分配是在编码过程中即时完成的,设计和编码真正成为一件事情;

2.代码的可理解性可以得到保证(声明式编程),消除了大多数注释的必要性;

3.以终为始,逐渐导出设计契约;

4.延迟复杂的细节性决策,聚焦于当前阶段的关键行为;

5.利用了IDE的“自动纠错”能力,提升了编码速度。

由外而内编程的2个要素:

1.保持同一个层次的抽象;

2.合理分配职责。

image-20200808201859982

对象的职责在编码过程中自然产生:

image-20200808202050709

所以第一行代码应该从上往下,从功能开始,是最合理的方式,即先写应用层。

创建属性计划的Service:

image-20200808202336406

应用场景驱动,促进领域对象和领域服务的职责持续生长

image-20200808202541403

由外而内,意图导向的编程要点小结:

1.从应用场景出发开始编码;

2.意图导向,描述期望的程序行为,同时完成职责分配;

3.逐层深入,重复上述步骤;

4.涉及领域层对象时,要结合领域对象的职责考虑,并合理区分哪些属于领域层,哪些不属于领域层。

测试先行

测试先行=意图导向编程+用测试表达设计契约

后置的自动化单元测试很难取得成功,原因:

1.上下文丢失;

2.可测性缺乏;

3.情绪和动机。

推荐实践:自动化测试代码先于产品代码完成

image-20200808203758561

开始编写测试——表达意图

image-20200808203858637

契约和手册:TripPlan服务,接收TripPlanCreationCmd,并且返回TripPlanDTO对象,初始状态为CREATED。

开始编写测试——修复错误,完善契约

image-20200808204143708

编写实现代码,实现契约:

image-20200808204318378

image-20200808204343730

增加持久化关注点:

image-20200808204429541

增加REST接口,并在集成环境中测试

image-20200808204456514

image-20200808204546745

image-20200808204559730

覆盖率是一种指示器,也是测试先行的自然结果:

image-20200808204650194

单元测试不是“白盒”测试:

image-20200808204808227

image-20200808205042035

小结:测试先行的收益

1.聚焦于外部行为;

2.自动化测试形成了代码的功能手册;

3.可测性得到了保证;

4.好的可测试性带来了模块化;

5.测试先行容易推动进展;

6.持续建立信心。

持续演进

软件开发中的契约:

image-20200808205639934

legacy code==code without tests

遗留代码,就是没有自动化测试的代码。

自动化测试=自动检查的设计契约。

总结:高效,高质量编码

image-20200808210003956

由外而内,意图导向;

测试先行,定义契约;

渐进认知,持续重构。

软件开发一定要关注设计能力。

image-20200808210241246