代码重构心得
所谓重构,之前的理解大多是:针对重复代码的封装提炼,针对过多if-else结构的整合。
然而,在实际操作中,存在很多重构方法。
- 重复代码提炼
寻找代码中完成某项子功能的重复代码,将之封装成独立函数,必要时进行调用。
class GoodExample {
public void someMethod1(){
//code
someMethod3();
//code
}
public void someMethod2(){
//code
someMethod3();
//code
}
public void someMethod3(){
System.out.println("重复代码");/* 重复代码块 */
}
}
- 冗长方法的分割
将某个冗长方法实现 切割成几个独立的函数,这样既增加了可读性,同时也一定程度上避免了可能的重复代码。
class GoodExample {
public void someMethod(){
function1();
function2();
function3();
}
private void function1(){
//function[1]
}
private void function2(){
//function[2]
}
private void function3(){
//function[3]
}
}
- 针对if-else结构的优化
将else中的语句放在前面,并及时跳出方法,以免对后面的判断造成影响。(但是要注意在某些情况下无法提前跳出)
class BadExample {
public void someMethod(Object A,Object B){
if (A != null) {
if (B != null) {
//code[1]
}else {
//code[3]
}
}else {
//code[2]
}
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Object A,Object B){
if (A == null) {
//code[2]
return;
}
if (B == null) {
//code[3]
return;
}
//code[1]
}
}
或者 我们可以将分支条件合并,以此来达到代码清晰的目的。
class BadExample {
public void someMethod(Object A,Object B){
if (A != null) {
if (B != null) {
//code
}
}
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Object A,Object B){
if (A != null && B != null) {
//code
}
}
}
-
去掉那些可有可无的临时变量
class BadExample {private int i;
public int someMethod(){
int temp = getVariable();
return temp * 100;
}public int getVariable(){
return i;
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
private int i;
public int someMethod(){
return getVariable() * 100;
}
public int getVariable(){
return i;
}
}
6. 消除过长参数列表,将所有参数包装成一个类。
class BadExample {
public void someMethod(int i,int j,int k,int l,int m,int n){
//code
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Data data){
//code
}
}
class Data{
private int i;
private int j;
private int k;
private int l;
private int m;
private int n;
//getter&&setter
}
8. 提取类中定义的常量(magic number/string constant) 这样我们调用的话就只是调用变量名即可
class GoodExample {
protected static final String SUCCESS_MESSAGE = "您的操作已成功!";
public void someMethod1(){
send(SUCCESS_MESSAGE);
}
public void someMethod2(){
send(SUCCESS_MESSAGE);
}
public void someMethod3(){
send(SUCCESS_MESSAGE);
}
private void send(String message){
//code
}
}
10. 拆分冗长的类
这个操作难度很大,特别是对于那些应用广泛的大类来说。在拆分的时候,我们关注点应该主要集中在类的属性上面,拆分出来的两批属性在逻辑上应该是可以分离的。也就是说某个方法如果同时含有这两种属性,就会很麻烦。
11. 观察工程中可能存在的继承体系,这样子类就不用再实现一遍父类的方法了。

浙公网安备 33010602011771号