35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
该思维导图由 AI 生成,仅供参考
回顾代码和制定重构计划
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了通过逐步重构的方式,将一个ID生成器的代码从“能用”重构为“好用”。作者提出了四次重构计划,包括提高代码的可读性、可测试性、编写完善的单元测试以及添加注释。文章详细讲解了第一轮重构的具体步骤,包括对接口和实现类的命名方式进行了深入分析。接着,介绍了第二轮重构,主要包括将generate()函数定义为普通函数,以及对两个函数的访问权限和注释进行了调整。在第三轮重构中,作者为代码补全了单元测试,重点测试了逻辑复杂的部分。最后,文章讨论了如何定义函数的功能,并根据不同的功能定义编写了相应的单元测试。通过实际案例深入讲解了代码重构的过程和技巧,对于想要提高代码质量的开发者具有很高的参考价值。文章还强调了对代码质量的追求、了解优秀代码设计的演变过程、细节处理对代码质量的重要性等开发思想。
《设计模式之美》,新⼈⾸单¥98
全部留言(125)
- 最新
- 精选
- 马哲富看到有人说这个专栏写得不好,我忍不住要留个言给这个专栏叫叫好,这个专栏写得很好,非常好,只恨自己水平有限,不能完全吸收,顶这个专栏!
编辑回复: 哈哈,没事的,各有自己的判断,不可能让大家都觉得好,我们虚心相待,尽力而为。遇到问题,解决问题。
2020-02-151058 - 辣么大对于在ID generator中方法里写到 void foo(){ Random random = new Random(); } 有个疑问: 1、为什么不声明成静态变量? 2、能用成员变量么?而不是写成局部变量
作者回复: 也可以,不过尽量的缩小变量的作用域,代码可读性也好,毕竟random只会用在某个函数中,而不是用在多个函数中,放到局部函数中,也符合封装的特性,不暴露太多细节。
2020-01-22313 - evolution代码的演变过程,真的是干货满满。不知道争哥有没有架构方面的演变课程?
作者回复: 感谢认可,暂时没有呢
2020-01-22210 - 提姆老師你好,想問一下有關測試的問題RandomIdGeneratorTest,為什麼不是分幾個Test Case去對generate做測試而是要拆出protected方法去做測試呢?
作者回复: 拆出来的目的并非为了单元测试,更重要的是逻辑清晰,可读性好。之所以设置成potected的,是因为private的没法写单元测试。
2020-07-1336 - 牛顿的烈焰激光剑老师,对于获取 hostname(getLastfieldOfHostName()),我的想法是用 static 代码块,只在类加载的时候执行一次。请问这样处理的话会不会有什么坏处?
作者回复: 有可能hostname会改变,你的代码就获取不到最新的hostname
2020-01-2523 - 一颗大白菜34行代码是不是写错了? Assert.assertTrue(('0' < c && c > '9') || ('a' < c && c > 'z') || ('A' < c && c < 'Z'));
作者回复: 好像没有吧
2020-01-2253 - Ken张云忠读小争哥的注释就是种欣赏,小争哥的英文表达是怎么一步步积累的? 我认为动词和介词是英文的精髓,还有英文的语法
作者回复: 我英语也不好,多花点心思优化一下,实在不行,写中文注释也是可以的
2020-01-2233 - 冬渐暖看了下您的代码,请教下 针对同一个service,有必要对各种情况都写一个@test吗?平时我都是一个接口一个test,如果有不同的条件,就直接在这个的入参上面改。 不然某个测试类的代码会很大,也没有必要对一个接口一个类,而是一个综合业务一个test类。
作者回复: 一般来讲,一个单元测试类对应一个类。你说的可能更像是集成测试了。
2020-07-062 - 云宝generateRandomAlphameric()方法的测试用例需要改为: Assert.assertTrue(('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'));
作者回复: 嗯嗯,我改下
2020-11-17 - JUNLONG测试代码中的testGenerateRandomAlphameric()函数的for循环中的前两个范围判断打错了,应为:('0' < c && c < '9') || ('a' < c && c < 'z') 。 RandomIdGeneratorTest()函数中的一个#打成了$
作者回复: 嗯嗯,多谢指出,我改下
2020-06-16