重构-改善既有代码的设计(五)--重构列表

亚瑟
• 阅读 2058

什么是重构列表

重构方法需要以一种特定的格式记录下来。按照格式记录下来的重构方法的集合叫重构列表

重构的记录格式

每个重构手法可分为5个部分:

名称

构建重构词汇列表,名称当然是很关键的了,要充分的表达出重构的核心关键;

概要

介绍重构手法的功能,以及应用场景;便于我们查找重构手法;包括三个部分:

  • 一句话介绍重构能解决的问题
  • 一段简短陈述,介绍你应该做的事
  • 一副速写图,简单展现重构前后示例,可以是一段代码或UML图

动机

介绍为什么要用以及什么情况下要用这种重构手法;

做法

简明扼要的介绍怎么一步步实现这种手法;

A.做法出自我的笔记,这些笔记是为了我在一段时间不做重构后还记得怎么做。如果清楚知道该使用哪个重构,但不知道具体步骤可以查看做法;但如果是初次使用的话,还 要结合范例。

范例

以一个简单的例子说明如何实现这种手法;

寻找引用点

很多重构需要找到一个字段,一个方法,一个类的所有引用点。使用文本查询工具.比如idea的文本查询和代码预编译。

这些重构手法到底有多成熟

本书中提到的重构手法(第3章)。都是作者试过的。但是不能一本不变。依具体情况具体使用

demo

名称:提炼函数
概要:你有一段代码可以被组织在一起并独立出来。将这段代码放进一个独立函数,并让函数名称解释该函数的用途。

void printOwing() {   
    //print banner  
    System.out.println(“*********”);  
    System.out.println(“Banner”);  
    System.out.println(“*********”);  
    //print details  
    System.out.println ("name: " + _name);   
        System.out.println ("amount " + getOutstanding());   
}   

重构后
void printOwing()  {  
    printBanner();   
    printDetails(getOutstanding());   
} 
Void printBanner()  {  
    //print banner  
    System.out.println(“*********”);  
    System.out.println(“Banner”);  
    System.out.println(“*********”);  
}  
void printDetails (double outstanding)   {   
    System.out.println ("name: " + _name);   
    System.out.println ("amount " + outstanding);   
}

动机

过长的函数或者一段需要注释才能让人理解用途的代码,就应该将这段代码放进一个独立函数中。简短而命名良好的函数的好处:
1)如果每个函数的粒度都很小,那么函数被复用的机会就更大;
2)这会使高层函数读起来就想一系列注释;
3)如果函数都是细粒度,那么函数的覆写也会更容易些。

做法

  • 创造新函数,以用途命名
  • 提炼代码到函数中
  • 检查变量名是否符合规范
  • 在源函数中,将被提炼代码替换为函数引用
  • 测试

范例

 重构前
 void printOwing() {   
        //print banner  
        System.out.println(“*********”);  
        System.out.println(“Banner”);  
        System.out.println(“*********”);  
        //print details  
        System.out.println ("name: " + _name);   
            System.out.println ("amount " + getOutstanding());   
    }   

重构后
void printOwing()  {  
    printBanner();   
    printDetails(getOutstanding());   
} 
Void printBanner()  {  
    //print banner  
    System.out.println(“*********”);  
    System.out.println(“Banner”);  
    System.out.println(“*********”);  
}  
void printDetails (double outstanding)   {   
    System.out.println ("name: " + _name);   
    System.out.println ("amount " + outstanding);   
}
点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
Javascript 常用代码优化和重构的方法
简介主要介绍以下几点:1.提炼函数2.合并重复的条件片段3.把条件分支语句提炼成函数4.合理使用循环5.提前让函数退出代替嵌套条件分支6.传递对象参数代替过长的参数列表7.少用三目运算符8.合理使用链式调用9.分解大型类10.活用位操作符11.纯函数本文会不断更新,不足之处欢迎
Amazon:Invent2020重构服务项目重构将来
Amazon:Invent2020全世界交流会于中国北京时间12月2日线上上举办,AWSCEOAndyGassy在当日的主题风格演说中论述了对领域与客户满意度发展趋势的洞悉,并公布了27项自主创新的云服务器和作用,包含器、测算、储存、数据库查询、数据统计分析、器皿、深度学习运维管理、工业生产深度学习等好几个层面。全世界云计算技术管理者亚马逊云服务项目
京东云开发者 京东云开发者
11个月前
「重构:改善既有代码的设计」实战篇
背景在软件开发的世界里,代码重构是提升项目质量、适应业务变化的关键步骤。最近,我重新翻阅了《重构:改善既有代码的设计第二版》,这本书不仅重新点燃了我对重构的热情,还深化了我的理解:重构不仅仅是代码层面的整理,它更是一种软件开发的哲学,强调持续改进和适应变化
捉虫大师 捉虫大师
3年前
我好像发现了一个Go的Bug?
从一次重构说起这事儿还得从一次重构优化说起。最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在SentinelGo中看到相关源码。用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如:这样实现会在每次请求到来时去new出整个责任链,可以预见对象会频繁的创建、销毁。对Java来说,对象池
Wesley13 Wesley13
3年前
Java单元测试 Http Server Mock框架选型
背景动机某期优化需要针对通用的HttpClient封装组件HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点:apachehttpclient版本升级HttpClientBuilder代码重构RequestBuilder代码重构自定义RetryHandler
Wesley13 Wesley13
3年前
Java团队课程设计
Java团队课程设计socket聊天室(Day3)写了两天的项目,越写到后面越觉得这个结构太烂了,所以迫不得已只能重新搭建框架此前代码的冗余度太高,复用率低,于是今天重构项目重构后:!
Wesley13 Wesley13
3年前
诺禾
最近把Event相关的逻辑做了一个重构,修正EventStore,引入了IEventHandlerFactory,重新设计了Event相关的组件重构后的EventEvent:事情的笼统定义EventHandler:事情处置器笼统定义EventHandlerFactory:事情处置器工厂,用来依据事情类型获取事情处置器(新
Wesley13 Wesley13
3年前
Java中级进阶篇
中级进阶篇1.《重构:改善既有代码的设计》适合对象:中级、高级介绍:清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以及改善。大师的杰作,让你明白软件是一步步改进的,不是一蹴而就的。2.《XML入门经典》适合对象:初级、中级、高级介绍:很多人觉得没必要买XML书籍,
游弋天堂 游弋天堂
2年前
团队如何推进代码重构工作?
开发团队管理、代码重构
让代码优雅起来:记一次代码微重构实践 | 京东云技术团队
重构不仅能够提高代码质量,让代码优雅起来,同时也能让我们学以致用。我们所学的设计思想、原则、模式等理论知识,往往在重构中能够真正实践。
ceph数据重构原理
ceph数据重构原理
亚瑟
亚瑟
Lv1
此夜曲中闻折柳,何人不起故园情。
文章
3
粉丝
0
获赞
0