像工匠一样进行重构--《Refactoring WorkBook》

2024-01-17 12:08

本文主要是介绍像工匠一样进行重构--《Refactoring WorkBook》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2005年02月06日 15:57:00

作者: 江南白衣

最新版本及评论请看:http://www.blogjava.net/calvin/archive/2005/10/04/14790.html

像工匠一样进行重构, 让重构成为一门手艺.
Martin Fowler的《Refactoring》其实更适合做一本关于重构的洗脑,宣言式的书,就像Kent Beck的《XP Explain》一样薄薄的就可以了。只可惜他却非常的厚,后面的重构名录都是写给小白看的。所以我更喜欢《Refacoring WorkBook》,以一个工匠的语气(沉默寡言而实要)传授重构的手艺。


1.重构 Between Classes
〈Design pattern〉有半数篇幅教育大家不能只靠继承,要善用组合/委托。重构里面其实也有很多事情靠把继承变成委托来解决。
1 .1继承
1.1.1 并行继承体系,组合爆炸
这在以前是个头痛的问题,现在都已习惯用委托。
另外java还有个不是很让人满意的接口机制解决并行继承。
1.1.2 父子类的关系
比如过于亲密,子类会乱修改父类的方法,访问父类的变量,这时候可以定义final的Template方法。
还有拒绝的馈赠,我暂时还没有在这上面遇到问题,作者也建议如果没事就由他,如果有事,就要费劲的move method ;或者子类不继承父类,而只是组合父类。
1 .2职责
经过很多次重构之后,我发现,其实哪个方法应该放在哪个类其实很主观的,你每天醒来都能想到一个理由让一个方法搬一下家,所以我现在已经放弃追求一种"对"的职责分配了,看着顺眼就行。
1 .3散弹式修改
作一个修改就要改N个类时,也没什么特别好方法,就是找找看,有没有能为这个修改负责的统管全局的类。
但现在的很多散弹式修改是分层做成的。

1 .4库类
OpenSource的类库,总有些时候会想要扩展
1.如果只是一两个方法,直接在客户代码里扩展,
2.否则自己多一个类库的子类
3.最费劲就是引入一个新的层

题外话,重构其实很依赖工具,和对全部代码的拥有度,哗一下就来个全项目的rename。当你设计库类时,你并不一定拥有使用这些库类的 客户代码了,因此一开始就要认真设计,不能依赖重构,改接口会让人K死的。

2.重构 Within Classes
2.1 大是罪
Long Method、Large Class、Long Parameter List, 一般通过度量工具找出来,还可以自己设定一个触发器,当度量值超过某个限度时就报警。
PMD可以实现这个功能,但度量工具我更喜欢Metrics Reload,一个IDEA的插件,给出的度量信息很全面。
但是也切忌为了度量的数值而重构。
Long Method当然是尝试Extract Method。
Large Class就要把类的职能分开几个域,尝试拆出另一个Class或者SubClass。
Long Parameter List 可以通过在方法内的变量用查询获得而不用由参数传入;
或者把某些参数组成一个对象。
1.2 重复也是罪
重复在30年前就被认为是不好的一样东西,表现在1.代码类似,2.代码、接口不同而作用相近。
去除重复的方法也没什么特别,无非就是
Extract Method(同一个类)。有差异时,通过参数化达到共用。
Pull Up Method到父类(同一个父类)。有差异时,通过模板机制达到共用。
Class A调用Class B 或者 Extract Class C (两个完全无相干的类)
1.3 命名
中国程序员的英文本来就差,要多参考Ofbiz、Comperie的命名, 尽快建立团队的项目字典、领域术语字典。
也幸亏,现在在工具辅助下,代码的rename是最容易的重构。

1.4复杂条件表达式

作者认为,即使现在Program最关注的是对象,以及对象间的关系了,但优质的内部代码依然重要,推荐《编程珠玑》和《Elements of Programing style》。

化简复杂条件的基本有三个方法
1.通过!(A&B)==(!A)||(!B)化简
2.通过有意义的变量,函数代替条件表达式,比如
boolean isMidScore = (X<1000)&&(X>3000);
3.通过把一个if拆分开来执行,把guard clause放在前面
比如if(A||B)
do();
-
do();
if(B)
do();
又可以把2、3灵活组合,比如根据2,Extract出一个isRight()函数,根据3
    isRight()
{
if(A)
return true;
if(B)
return true;
return false;
}

1.5 其他
没用的死代码,通过IDE工具探知并移除。小心有些框架代码是不能删除的。
Magic Number,当然是改为常量。如果Magic Number很多,可以用Map、枚举类来存放。
除臭剂式的注释,为方法,变量改一个更适合的名字。如果注释是针对一个代码段的,可以Extract Method。当然,代码只能说明how, 不能说明why,更不能说明why not,这才是注释存在的地方。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=283217


这篇关于像工匠一样进行重构--《Refactoring WorkBook》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/615987

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Python对PDF书签进行添加,修改提取和删除操作

《Python对PDF书签进行添加,修改提取和删除操作》PDF书签是PDF文件中的导航工具,通常包含一个标题和一个跳转位置,本教程将详细介绍如何使用Python对PDF文件中的书签进行操作... 目录简介使用工具python 向 PDF 添加书签添加书签添加嵌套书签Python 修改 PDF 书签Pytho

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代