编码修行与 Code KATA 培训总结
本次培训从单元测试、重构上有了新的理解和收获,新知识方面理解了什么是测试驱动开发,会在项目中尝试使用TDD。
单元测试
单元测试的要求:
- 一个测试只做一件事情
- 测试的单元是:一个业务场景(或者说是一个分支)
Given-When-Then 模式
- Given 不能太多,说明 API 有问题,不能太复杂
- When 只出现一次,一个单元测试只做一件事
- Then 必须要有
面向对象设计
迪米特(Demeter)法则:不要和陌生人说话
- 隐私法则
- 最小知识法则
我们要将方法(公开方法)当做是对象承担的职责,好的面向对象设计应该尽量采用行为之间的协作,也就是职责的协作。职责分配合理了,设计就合理了。
面向对象的设计要学会拟人化
所有类的方法都有两个层次:
- 抽象层次:方法的定义(签名)
- 实现层次:方法体的内容
报表案例用到的重构手法:
- Extract Method
- Move Method
- Pull Members Up
- Replace Switch by Polymorphism
《设计模式》 GoF based on C++,两个核心原则:
- 面向接口(interface)设计
- 组合/聚合优先复用原则
继承的问题:强耦合,带来了脆弱的基类。
- 继承:is的关系
- 组合/聚合:has的关系
在建立继承体系时,不要因为现实世界的概念是is关系,就默认定义为继承。继承是差异式编程,从差异(父与子之间、兄弟之间)之处找共性特征,也叫做:共性可变性分析。如果根据差异来进行泛化,有可能概念中的is关系,实际上是has关系。例如员工和角色的关系:
1 Employee has Roles 2 Developer extends Role 3 Manager extends Role 4 Tester extends Role
PartDB的案例体现了关注点分离的原则。重构后的代码遵循单一抽象层次原则(SLAP),即方法中的所有操作应处于同一个抽象层次。例如如下概念就不在一个抽象层次上:
苹果、香蕉、土豆、蔬菜、水果、大白菜
关注点分离:
- 向上分离:通用的提取到超类或者父类,留下特殊的
- 向外分离:将关注点分离到别的类或者接口
设计API的时候要注意:不要对调用者做任何假设(最小惊讶法则)。例如,在重构 TrainingService
时,最先分离出来的 TransactionScope
类,它的方法如init()
、 beginTransaction()
、 commitTransaction()
等方法,直接暴露给调用者,就是对调用者的调用顺序做了假设。
Movie Store的职责:
- 计算租金(计算总租金)
- 计算积分(计算总积分)
- 显示收据凭条信息
为默认Movie的类型定义一个 DefaultPriceCode ,实际上运用的是Martin Fowler提出的Special Case Pattern。而Null Object Pattern其实就是一种特例。
奥卡姆剃刀原则:若无必要,勿增实体(变量、函数、类、模块),即简单设计的第四条原则。
测试驱动开发的总结
- 运用了设计的知识:包括面向对象设计知识、重构知识、识别代码的坏味道。
- 测试的恰如其分:不要事先设计,按照需求,按照测试用例来。
- 测试驱动开发的设计驱动力:根据GivenWhenThen,不同的部分驱动测试的不同内容,直到驱动出好的API(这个驱动力是从调用者角度思考的,而非实现者角度)。
- 测试驱动开发的节奏感:红绿黄,中间辅以代码的提交,养成良好的编码习惯
和好的节奏感。 - 加强和BA与QA的交流:在分解任务以及编写测试用例时,一定会出现需求不明确的时候,不要想当然,而是及时与BA和QA沟通。极限编程强调交流与反馈。
IDEA快捷键
- Ctrl+Alt+N:内联
- Ctrl + W:选中
- Ctrl+Shift+W:撤销选中
- Ctrl+Alt+(首字母):提取重构万能键:
- Ctrl+Shift+Alt+ T (refactor This):重构万能键
- Ctrl+Y:删除
- Ctrl+D:复制+粘贴
- Ctrl+Alt+L:排版
- Ctrl+Shift+上下光标键:移动代码
- Ctrl+F6:修改方法签名
- Ctrl+Shift+T:查看当前类的测试类
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术