【软件重构】软件代码坏味道之滥用临时字段
一、什么是临时字段
就是临时字段的值只有在特性环境或者特性情况或者特性范围之内等条件下才有意义,没有了这些条件,这些临时字段就没用了。
二、临时字段能带来什么影响
1)在类中,为了满足需求临时增加的字段属性,并且增加的临时字段只是存在临时关联性,只在某些场景会使用到时,这些临时字段就会令人产生费解,应为它跟其他字段格格不入(因为它是临时加进来的),使用时不清楚是否必填,字段的输入和输出的上下文来源也会令人产生误解,存在很大的误用可能。
2)在函数中,为了满足一个函数的实现需要很多参数辅助时,但又为了避免函数入参传入过多的参数;往往为了方便在改函数的类中使用很多的临时字段变量来实现这个函数功能,而这些临时字段只有在使用该函数时才会用到,却跟该类直接耦合在一起,其他情况完全无用。影响了高内聚和代码阅读的困难性。
3)临时字段是针对某些特定场景而存在的,如果误用了临时字段,可能会导致某些场景的异常。
例如:
public class exClass {
private String filed1A;
private String filed2A;
private String filed1B;
private String filed2B;
public exClass(String filed1A, String filed2A, String filed1B, String filed2B) {
this.filed1A = filed1A;
this.filed2A = filed2A;
this.filed1B = filed1B;
this.filed2B = filed2B;
}
// 存在 临时filedB字段,该字段与filedA完全无关
public void methodA(String type) {
System.out.println("filed1A:" +filed1A);
System.out.println("filed2A:"+filed2A);
if (type.equals("filedB")) {
System.out.println("filed2B:"+filed1B);
System.out.println("filed2B:"+filed2B);
}
}
}
三、如果解决这些临时字段的问题
1)提炼类重构手法解决。当一个类做的不止一件事,存在各种不用功能函数,使用到不同的临时字段、局部变量时。果断提取类进行重构:
建立新的类,将相关的字段、局部变量和函数从旧类中迁移到新的类中,局部变量变成类的字段,若过长函数分割成这个类的多个函数,让一个类只干一件事,符合单一职责。
// classA 只做与classA相关的事情
class classA {
private String filed1;
private String filed2;
public void classA(String filed1,String filed2) {
this.filed1 = filed1;
this.filed2 = filed2;
}
public void methodA() {
System.out.println("filed1:" +filed1);
System.out.println("filed2:"+filed2);
}
}
// classB 只做与classB相关的事情
class classB {
private String filed1;
private String filed2;
public void classB(String filed1,String filed2) {
this.filed1 = filed1;
this.filed2 = filed2;
}
public void method1B() {
System.out.println("filed1:" +filed1);
}
public void method2B() {
System.out.println("filed2:"+filed2);
}
}
2)将临时字段作为参数进行传递。如果在一个函数中使用到了大量的临时字段,可以考虑使用传参的形式,将临时字段替换掉,若临时字段过多,需要将这些临时字段提炼到一个类中,通过对象进行传参。
class filedClass {
private String temp1;
private String temp2;
private String temp3;
public filedClass() {
}
// setting方法
public void setTemp1(String temp1) {
this.temp1 = temp1;
}
public void setTemp2(String temp2) {
this.temp2 = temp2;
}
public void setTemp3(String temp3) {
this.temp3 = temp3;
}
// getting方法
public String getTemp1() {
return temp1;
}
public String getTemp2() {
return temp2;
}
public String getTemp3() {
return temp3;
}
}
class usedClass {
// 方法:filedClass 对象作为函数入参
public void method1(filedClass filed) {
System.out.println(filed.getTemp1());
System.out.println(filed.getTemp2());
System.out.println(filed.getTemp3());
}
}
- 点赞
- 收藏
- 关注作者
评论(0)