如何重构

赵嬷嬷
• 阅读 1104

1.重构定义:

重构是对软件内部结构的调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

2.重构节奏:

小步前进,频繁测试。

3.重构意义:

1.改进软件设计

2.使软件更容易被理解

3.帮助找到bug

4.提高编程速度

恶劣的设计会让你的速度慢下来,你会把时间花在调试上面,无法添加新功能,修改时间越来越长,因为你必须花更多时间来理解系统,寻找重复代码。

5.获得更高层次的认识

4.何时重构

1.重复代码

2.过长函数

有注释的地方一般需要重构

3.过大的类

4.过多的switch或者if else

switch或者if else过多会导致有任何修改都需要修改switch,而且枚举如果在多个地方使用就会涉及多个地方修改

5.重构的技巧

1.Extract Method:提炼函数

1.1.重构场景:

方法过长,代码中注释过多

1.2.做法

创建一个新函数,根据它的意图来命名(以【做什么】而不是【怎么做】来命名)。

2.Inline Temp:内联临时变量

2.1.重构场景

一个内联变量被简单的表达式赋值一次

2.2.做法

取消赋值动作,直接替换为对它赋值的表达式本身

2.3.举例

 double basePrice = getBasePrice();
 return basePrice;

应该改为

return getBasePrice();

3.Replace Temp with Query 以查询取代临时变量

3.1.重构场景

以临时变量保存某一表达式结果,临时变量的问题在于,它们是临时性的,而且只能在所属的函数内访问,所以它会驱使你写出更长的函数,只有这样你才能访问到那些临时变量。如果把临时变量替换为一个查询,那么同一个类中的所有函数都可以访问这个临时变量。

3.2.做法

将临时变量使替换为新函数引用

3.3.举例

重构前

public class Base {
    private int quantity;
    private int itemPrice;
  
    public double getTotalPrice() {
        double basePrice = quantity * itemPrice;
        if(basePrice < 1000) {
            return basePrice * 0.95;
        } else {
            return basePrice * 0.98;
        }
    }
}

第一次:重构后

取消临时变量->变成函数引用

public class Base {
    private int quantity;
    private int itemPrice;
  
    public double getTotalPrice() {
        if(basePrice() < 1000) {
            return basePrice() * 0.95;
        } else {
            return basePrice() * 0.98;
        }
    }

    public double basePrice() {
        return quantity * itemPrice;
    }
}

再次重构:

获取结果方法从打折和总额耦合->把打折逻辑独立出去

public class Base {
    private int quantity;
    private int itemPrice;
    
    public double getTotalPrice() {
        return basePrice() * discountFactor();
    }

    public double basePrice() {
        return quantity * itemPrice;
    }

    public double discountFactor() {
        if(basePrice() > 1000) {
            return 0.95;
        } else {
            return 0.98;
        }
    }
}

4.Introduce Explaining Variable:引入解释变量

对于复杂查询通过引入解释变量来降低复杂性。

怎么区分使用 Extract Method 还是 Introduce Explaining Variable呢?

在一个方法里面临时变量很多,使用Extract Method变得很困难的时候使用它。

点赞
收藏
评论区
推荐文章
雷厉风行 雷厉风行
2年前
Mac上最优秀的Ruby开发工具:JetBrains RubyMine 2023 永久激活码
JetBrainsRubyMine2023forMac是一款专业的Ruby开发工具,旨在使开发人员的工作更加高效和愉悦。这款软件提供了一系列强大的功能,包括智能代码补全、代码重构、调试和多种工具等。
红橙Darren 红橙Darren
4年前
Android模板设计模式之 - 构建整个应用的BaseActivity
1\.模式介绍模式的定义定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。所有分享大纲:视频讲解地址:模式的使用场景1.多个子类有公有的方法,并且逻辑基本相同时。2.重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。3.重构时,模板方法模式
京东云开发者 京东云开发者
11个月前
「重构:改善既有代码的设计」实战篇
背景在软件开发的世界里,代码重构是提升项目质量、适应业务变化的关键步骤。最近,我重新翻阅了《重构:改善既有代码的设计第二版》,这本书不仅重新点燃了我对重构的热情,还深化了我的理解:重构不仅仅是代码层面的整理,它更是一种软件开发的哲学,强调持续改进和适应变化
捉虫大师 捉虫大师
3年前
我好像发现了一个Go的Bug?
从一次重构说起这事儿还得从一次重构优化说起。最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在SentinelGo中看到相关源码。用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如:这样实现会在每次请求到来时去new出整个责任链,可以预见对象会频繁的创建、销毁。对Java来说,对象池
Wesley13 Wesley13
3年前
Java单元测试 Http Server Mock框架选型
背景动机某期优化需要针对通用的HttpClient封装组件HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点:apachehttpclient版本升级HttpClientBuilder代码重构RequestBuilder代码重构自定义RetryHandler
Easter79 Easter79
3年前
Tool:XMind
ylbtechTool:XMind XMind是一款非常实用的商业思维导图软件,应用全球最先进的EclipseRCP软件架构,全力打造易用、高效的可视化思维软件,强调软件的可扩展、跨平台、稳定性和性能,致力于使用先进的软件技术帮助用户真正意义上提高生产率。1.返回顶部2.返回顶部3.返回
Wesley13 Wesley13
3年前
Java中级进阶篇
中级进阶篇1.《重构:改善既有代码的设计》适合对象:中级、高级介绍:清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以及改善。大师的杰作,让你明白软件是一步步改进的,不是一蹴而就的。2.《XML入门经典》适合对象:初级、中级、高级介绍:很多人觉得没必要买XML书籍,
Stella981 Stella981
3年前
Linux漏洞扫描工具【lynis】
Lynis是一款Unix系统的安全审计以及加固工具,能够进行深层次的安全扫描,其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息,脆弱软件包以及潜在的错误配置.特征:1.漏洞扫描2.系统加固3.入侵检测4.中心管理5.自定义行为规划6.报告7.安全面板8.持续监测9.技术
让代码优雅起来:记一次代码微重构实践 | 京东云技术团队
重构不仅能够提高代码质量,让代码优雅起来,同时也能让我们学以致用。我们所学的设计思想、原则、模式等理论知识,往往在重构中能够真正实践。
公孙晃 公孙晃
2年前
PHP集成开发工具:PhpStorm 2022 for Mac v2022.3.3
phpstorm2022是一款非常好用的php开发软件,软件支持所有PHP语言功能,提供最优秀的代码补全、重构、实时错误预防等等功能,能够为程序员提供更为效率的php开发。
融云IM即时通讯 融云IM即时通讯
7个月前
融云IM干货丨如何优化插件以减少内存占用?
为了优化插件以减少内存占用,以下是一些具体的策略和方法:1.代码瓶颈优化:重写热点函数,采用更高效的算法和数据结构,减少不必要的计算和内存分配。2.资源瓶颈处理:实现分批处理和惰性加载机制,减少对内存和CPU的即时需求。3.插件加载优化:重构插件架构,使用