编码修行与 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其实就是一种特例。

奥卡姆剃刀原则:若无必要,勿增实体(变量、函数、类、模块),即简单设计的第四条原则。

测试驱动开发的总结

  • 运用了设计的知识:包括面向对象设计知识、重构知识、识别代码的坏味道。
  • 测试的恰如其分:不要事先设计,按照需求,按照测试用例来。
  • 测试驱动开发的设计驱动力:根据Given­When­Then,不同的部分驱动测试的不同内容,直到驱动出好的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:查看当前类的测试类
posted @   非诚勿随  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示