取消
显示结果 
搜索替代 
您的意思是: 
cancel
1580
查看次数
0
有帮助
1
评论
julianchen
Spotlight
Spotlight
重构是一个改变软件系统的过程,它旨在不改变代码外部行为的前提下,改善其内部的结构。它用一种规范的方式来清理代码,从而最大限度地减少错误出现的几率。从本质上说,重构是在代码写完之后对其设计的改善。




Martin Fowler在其经典著作《重构:改善既有代码的设计》中给出了上述定义。如果您尚未阅读本书,但对重构知识充满了兴趣的话,我强烈推荐您找来阅读。
我最近有幸参与了一个复杂的代码重构项目,它是由React和Redux来构建的一个销售预算管理与分析的应用系统。该系统大约由300个文件,共计13,000行代码所组成。由于能够定期地接触到代码库,因此我对于在遵从代码标准的基础上如何进行代码改进比较熟悉。以下便是我的最终目标列表:
· 更新文件夹结构,以集中Redux的各种文件(actions、reducers、selectors)。
· 将Foundation框架转换为Semantic UI React。
· 实现CSS模块。
· 升级到webpack3(一种模块打包器)。
· 将Fetch替换为jQuery,以处理各种HTTP请求(使用polyfill)。
· 删除不必要的抽象类和“死代码”。
· 安装并配置Jest测试框架,编写各种单元测试。
经过一番周折之后,我最终完成了上述目标。在此,我将自己从该项目以及过往其他项目中所获取的宝贵经验与技术分享给大家。

第1部分:提出正确的问题!
在决定开始进行代码重构项目之前,让我们先理清一些重要的问题。

首先,扪心自问:我需要重构吗?
所有程序员都希望能写出干净优雅的代码,但是现实世界并非如此。各种截止日期的临近和需求的变更,往往只是大量问题的开始而已。
面对庞大的代码库,您可能早已丧失了重构的动力。那么请您在阅读了下列问题并能够回答“是”之后,再考虑如何开展重构工作吧。
· 是否存在重大的技术缺陷,而造成了系统的巨大问题?
· 添加各种新功能是否困难?
· 对于某部分代码库的细微更改,是否会破坏应用中另一部分的某个不相关的功能?
· 您是否还使用了那些存在着安全与性能问题的过时依赖关系?
· 在JavaScript环境中,ES5的语法是否能够被箭头函数(arrow functions)和解构(destructuring)等新的语言功所增强?
我建议您多与同事,特别是该领域的高级工程师讨论,而不是盲目开始。他们可能会向您详细地说明为什么会以此种方式来编写代码,或者给您提供一些能够影响决断的有价值的见解。某位经验丰富的工程师甚至还会提醒您过去他们曾在代码重构中失败过,因此在某种层度上说这次也不适合再次进行重构。
接下来,问问自己:我能够重构吗?
现在您所面临着下一个障碍是:确定重构是否可行。可行的条件包括如下限制因素:
· 根据我目前的技能组合,我胜任重构吗?
· 根据我的时间安排,我胜任重构吗?
· 我重构时,可以添加新的功能吗?
· 根据我当前的预算,胜任重构吗?
如果您不能对上述所有的问题回答“Yes”,那么重构可能对您来说就是自寻烦恼了。我的经验是:您需要得到软件产品所有者的批准与支持,因为他们会经常与客户直接合作并能管理预算。切忌擅自行事!
最后,自问自答:我愿意重构吗?
代码重构向来是一项巨大的工程。那些严苛的预算和时间表往往会给人们带来难以想象的压力。因此,您可能会时常询问自己如下的问题:
· 为什么代码不是在一开始就以正确的方式被编写呢?
· 如果应用能够正常工作的话,何必要重构们呢
· 如果它没那么糟糕的话,就不能只是添加点新的功能吗?
· 这样做能够增加企业的价值吗?
面对上述问题,代码重构常会被人们误解为一项吃力不讨好的任务。而如果一些现有的功能因为代码重构而产生中断的话,那么重构工作就会变得更加“万劫不复”了。
尽管困难重重、弊端多多,但是在完成了上述“尽职调查”之后,您会发现代码重构还是非常值得我们投入宝贵的时间去开展的。在清理代码库的同时,添加良好的单元测试会有益于新功能的轻松添加,以及回归类错误的(regression bug)大幅降低。

评论
one-time
Level 13
Level 13
感谢版主分享,谢谢!
入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接