徐昊 · TDD 项目实战 70 讲
徐昊
Thoughtworks 中国区 CTO
18159 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已完结/共 88 讲
实战项目二|RESTful开发框架:依赖注入容器 (24讲)
实战项目三|RESTful Web Services (44讲)
徐昊 · TDD 项目实战 70 讲
15
15
1.0x
00:00/00:00
登录|注册

09|TDD中的驱动(2):重构发挥了什么作用?

你好,我是徐昊。今天我们来继续讨论测试驱动开发中的驱动。
在上节课,我们讲了单元级别功能测试能够驱动其对应单元(功能上下文或变化点)的外在功能需求。但是当对应单元过大时,会带来一系列麻烦(比如测试构造困难、问题定位不准确等),那么就需要将对应单元的功能上下文继续分解成更小的粒度,然后通过测试来驱动实现。
从“驱动”的角度讲,TDD 并不是一种编码技术,它无法驱动你写出你不会实现的代码。TDD 是一种架构技术它能通过测试与重构,驱动单元的划分以及功能的归属,因而是一种更为落地的架构软件的方式。
在 TDD 中,重构是和测试一样重要的驱动力,驱使我们得到更好的架构和更清晰的代码结构,因而熟练掌握几种常用的重构手法,也是十分必要的。

语义化的查找替换(Semantic Find and Replace)

首先要介绍的重构手法是提取方法(Extract Method)和内联方法(Inline Method)。这是最重要的两种重构手法,它们相当于查找(Find)/ 替换(Replace)。所不同的是,这种查找替换是语义化的:在不破坏现在代码结构的前提下,完成查找替换。视频演示如下:
00:00 / 00:00
    1.0x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00
    正如视频中所展示的,这个手法是将需要修改的代码提取到新方法中。在新方法内完成要做的修改,再通过内联方法在所有调用这个新方法的地方完成修改。我们需要将这两种手法看作修改代码的基本方式。
    确认放弃笔记?
    放弃后所记笔记将不保留。
    新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
    批量公开的笔记不会为你同步至部落
    公开
    同步至部落
    取消
    完成
    0/2000
    荧光笔
    直线
    曲线
    笔记
    复制
    AI
    • 深入了解
    • 翻译
      • 英语
      • 中文简体
      • 中文繁体
      • 法语
      • 德语
      • 日语
      • 韩语
      • 俄语
      • 西班牙语
      • 阿拉伯语
    • 解释
    • 总结

    TDD中的驱动(2):重构发挥了什么作用?本文由徐昊老师介绍了在测试驱动开发(TDD)中,重构的重要性和作用。文章首先强调TDD不仅是一种编码技术,更是一种架构技术,能够通过测试与重构来驱动单元的划分以及功能的归属。重构在TDD中扮演着与测试同等重要的角色,能够帮助我们获得更好的架构和更清晰的代码结构。作者介绍了几种基本的重构手法,包括提取方法、内联方法、引入参数和引入字段,并通过视频演示展示了这些手法的具体操作。此外,文章还提到了重构到模式的方法,即通过消除架构上的坏味道并强化开放封闭原则,来实现更好的架构。最后,作者提出了一个思考题,探讨了如果架构预先设计好了,如何使用TDD的问题。整体而言,本文通过简洁明了的语言和具体的案例,向读者展示了TDD中重构的重要性和实际操作方法。

    仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
    《徐昊 · TDD 项目实战 70 讲》
    新⼈⾸单¥98
    立即购买
    登录 后留言

    全部留言(9)

    • 最新
    • 精选
    • 枫中的刀剑
      如果架构预先设计好了, 可以使用test double 技术来替换那些暂时你不需要实现或者不知道如何实现的类。等当前这个功能实现后在依次实现剩下已经划分好的功能,逐步替换就好了。

      作者回复: good

      2022-03-30
      8
    • Numbpad1
      换入参顺序,可以使用Refactor里面的Change Signature... ,只需要在弹窗里面移动顺序,是不需要手动替换的。

      作者回复: 对于某些语言 工具没有提供这个重构。我们讲的是最基本的自动化支持。

      2022-03-30
      2
    • davix
      老師,重構都在單元內吧(不變外在行為)。如果要優化調整單元的接口,響應測試也得調整,沒什麼辦法了吧

      作者回复: 那就是重写

      2022-04-09
      1
    • 姑射仙人
      老师,将OptionClass提取出来的动机是什么,我能理解将问题分解到不同的模块。但是,这是倒果为因的讲法。在实际开发中,这种重构思路是依据经验吗?

      作者回复: 重构就是结果我不喜欢 我要改 没什么为什么

      2022-05-21
    • aoe
      非常惊喜的发现了一本关于软件架构非常重要的著作 Joshua Kerievsky 在 2004 年写过一本书,《Refactoring to Patterns》(中文版《重构与模式》)
      2022-03-31
      2
      5
    • Numbpad1
      ”这些手法如此基础,应该被看作修改代码的基本功,而不是重构:谈不上什么消除坏味道,就是高效修改代码而已。” 确实如此基础,据我观察,我身边很多用这IntelliJ IDEA的程序员,大部分都是不知道,更没办法熟练运用这些技巧的,也包括我。 还好订阅了这个专栏,学到这么多基本功,现在在项目中已经在慢慢练习老师所教授的技巧, 给我带来的一个最直观的感受就是,高效+减少手动修改带来的BUG。
      2022-03-30
      5
    • 邓志国
      如果架构预先已经设计好了,那么TDD我觉得更简单:针对架构里面的接缝处找出适当的单元粒度编写测试并实现就好了。
      2022-03-30
      1
    • 马哥在学习
      这些重构手法太牛了,看得我眼花缭乱
      2023-07-30归属地:广东
    • keep_curiosity
      # TDD 打卡#跟练地址:https://github.com/codingthought/TDD-DI
      2022-05-01
    收起评论
    显示
    设置
    留言
    9
    收藏
    沉浸
    阅读
    分享
    手机端
    快捷键
    回顶部