对于重构有几个疑问,希望能过来人能解答一下!

2020-05-05 21:56:47 +08:00
 mitu9527

我最近在读《重构:改善既有代码的设计》这本书,马上就看完了。对于重构的思想我是非常认同的,但是对于这些重构手法的落实却有一个疑问。

作者介绍了 60 多种重构手法,每种重构手法都配有非常具体的、标准的、安全的重构步骤。那些重构手法的动机我基本上都能理解,也知道最终代码大概会重构成什么样子,但是那些重构手法的具体步骤我是真的没记住几个。虽然作者自己也说,他平时开发中也不会完全参照这些步骤,只有重构出了问题时,才会按照这些步骤进行。但我还是有几个疑问,想问问大家:

1.大家能记住那些重构手法的具体步骤么,还是说重构多了就会自然而然的记住了?
2.大家进行重构时,会参照这些具体步骤么,还是按自己的想法来?如果会的话,相似到什么程度呢?
4111 次点击
所在节点    程序员
35 条回复
lhx2008
2020-05-05 22:02:56 +08:00
没有看过这本,我理解的话,首先是要保证旧代码的的测试用例完善,然后是按高内聚,低耦合的思想重新划分功能类,拆掉或者组装一些现有代码。识别新增的扩展点,运用一些常见的设计模式来提高代码的扩展性(开闭原则)。
xuanbg
2020-05-05 22:41:22 +08:00
看过这本书,很赞同作者的理念和方法。但具体的真的是一点都没记住。反正我重构就一招,原先的不动,新项目慢慢替换老项目。也许能替换完,老项目下线,也许不能替换完。但那又怎样,反正我看不见的屎就不存在。。。
mitu9527
2020-05-05 22:49:20 +08:00
@xuanbg 看样子不止我一个人这样,安心了!我感觉没有多少人能做到照着作者介绍的步骤去重构的。
yesterdaysun
2020-05-05 22:53:52 +08:00
我的理解就是重构是需要反复刻意练习的, 就是有的时候对着一段代码刻意的练习怎么重构的更好, 练多了, 平时自然而然就能用上, 忘了是哪本书提到的概念了, 代码的坏味道 code smell, 当你能意识到一些坏味道的时候, 如果之前有练过相应的重构方法, 自然就能用上.

具体的话还是用 IDE 现成的重构工具, 比如 IDEA 的全套工具, 基本上改名, 提取方法之类的最常用, 其他的多少也会用到, 但是全用到也不太现实.

但是上面有人提到的测试也很重要, 能保证重构的时候即使步子大一点, 也能确保功能没有被破坏掉.

可以找一些讲 TDD 的资料看看, 那里重构应该用的挺多的, 但是可以先不管 TDD, 那个确实还是有点难的
mitu9527
2020-05-05 23:02:12 +08:00
@yesterdaysun 我们两个想法大体类似,看样子我还没跑偏。昨天刚看完 Kent Beck 写的 TDD 的书,如果把写代码比作练九阳真经,那么我们平时都是郭靖,正着练; TDD 就要求我们变成欧阳锋,要倒着练。TDD 该了解的我都了解了,不过实践起来确实有难度,完成这种思维转变需要还一些时间。
52coder
2020-05-05 23:49:53 +08:00
这本书断断续续看了一年多,有的方法看的时候会产生共鸣,有的可能没有实际操作过,虽然明白作者目的,但感触不深。
vitoliu
2020-05-06 00:13:20 +08:00
小改动直接替换,大改动 facade+开关
hangszhang
2020-05-06 08:32:56 +08:00
这本书太屌了,但是我看我就忘记了...
watzds
2020-05-06 09:00:48 +08:00
不能说全记住,还是能用到不少
mitu9527
2020-05-06 09:05:49 +08:00
@hangszhang 嗯,看完之后感觉自己提升不少 @watzds 手法比较容易记住,或者说即使记不住名字其实也在用这些手法,我主要是感觉我自己在执行某项重构手法的时候是肯定不会参考作者的那些具体步骤的,这些具体步骤是真记不住。
ligiggy
2020-05-06 09:26:31 +08:00
做笔记,当工具书。这是作者开头就强调了的,没仔细看哦,哈哈哈。
mitu9527
2020-05-06 09:33:32 +08:00
@ligiggy 确实,我也是打算当做工具书来用了。
ligiggy
2020-05-06 09:40:22 +08:00
@mitu9527 毕竟是工具书嘛,翻多了,就像单词一样的,印在自己的脑子里,形成了自己的理解。PS:这本书的价值确实很高,我看的 Java 的,后面好像改成了 JS,有机会要多买几本收藏。
mitu9527
2020-05-06 09:54:53 +08:00
@mitu9527 我看的就是第二版,示例都是 js 的。虽然我没看过第一版,但我个人觉得示例用 js 真不如用 java 合适。不过还是可以考虑收藏一本。
mitu9527
2020-05-06 09:55:34 +08:00
@ligiggy 我看的就是第二版,示例都是 js 的。虽然我没看过第一版,但我个人觉得示例用 js 真不如用 java 合适。不过还是可以考虑收藏一本。
wu67
2020-05-06 10:05:54 +08:00
你只要记住一个原则就好了. 代码是写给人来阅读的, 偶尔才给机器跑一跑.
wu67
2020-05-06 10:07:15 +08:00
你可以尝试把一段代码介绍给小黄鸭, 如果你觉得某种写法小黄鸭可能理解不了, 或者会造成歧义, 那就需要重构, 或者需要添加注释说明
ayase252
2020-05-06 10:09:21 +08:00
保证测试用例完善和小步 commit 怎么重构都不会坏。实在搞不定了可以翻书。
mitu9527
2020-05-06 10:16:52 +08:00
@ayase252 嗯,我也是这么想的,就算不按标准的步骤重构,大多数情况下也能以自己习惯的步骤搞定。就像 Kent Beck 说的,重构步骤选多大要看你自己的能力,还有就是出问题时要有能切换道更小的步骤的能力,这时就得参考这些工具书了。
asj
2020-05-06 11:21:26 +08:00
做到构重的一第点,是看当前到的码代是什么。我们往往惯习于看到的是它应是该什么,而它非实际是么什。
就像这句两话,有很的多序顺错误。但我们脑的子照按它该的应样子去组重了。这对于机器是行不通的。
重构的起点就是看到现在现实的代码是什么,从中发现改变为另一种现实的可能性。
而不是按照脑子里代码现在“应该是”的样子,去做些修改以期它变成另一种“应该是”的样子。
重构中所有的小步骤都是为了修改不脱离现实的代码。
“应该是”和现实的代码脱节的一个标志就是 debug,debug 相当于让机器帮程序员读代码。破除修改中由于错觉引入的错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX