偏执于基本类型
成因:
创建一个基本类型字段比创建一个全新的结构类型的类要容易得多。对象技术的新手通常不愿意在小任务上运用小对象,从而忽略了面向对象带来的各种好处。
拥抱面向对象能享受到封装、继承和多态带来的好处
重构手法:
- 比如表示电话号码、邮政编码或者money类的基本类型字段,你可以运用Replace Data Value with Object (以对象取代数据值),来拥抱炙手可热的对象世界。
- 如果想要替换的数据值是类型码,这里有三种情况 1、而且类型码不影响行为,则可以运用Replace Type Code with Class(以类取代类型码)替换掉类型码, 2、类型码影响行为,考虑使用Replache Type Code with Subclass(以子类取代类型码) 3、如果类型码会变或者宿主类不能被继承,则使用Replace Type Code with State/Strategy(以State/Strategy 取代类型码),这里State/Strategy的取舍是根据类型码是自动变还是调用者手动去变决定的。
- 如果是总在一起的字段,则可以使用解决数据泥团(Data Clumps)的三个手法——1、类中、函数中,总是一起出现或者干脆有相同的前后缀,使用Extract Class(提炼类),把这些数据组提取到独立的类中。2、如果数据组出现在形参列表中,请使用Preserve Whole Object(保持对象完整性)和Introduce Parameter Object(引入参数对象) 为参数列表减肥。
- 如果你发现你正在数组中挑选数据(数组使用时最麻烦的是辨别哪个位置是那种数据),可以运用Relace Array with Object(以对象取代数组)
拥抱面向对象
目标:
由于使用对象而不是基本类型,代码变得更加灵活。更好的可理解性和代码组织。 对特定数据的操作是在同一个地方,而不是分散的。 不再猜测所有这些奇怪常量的原因以及它们为什么在数组中。
附录:
-
Replace Data Value with Object (以对象取代数据值)
class Person{
//有多少钱
Int money;
}
class Person{
Money money;
}
class Money{
Int value;
}
-
Replace Type Code with Class(以类取代类型码)
-
Replache Type Code with Subclass(以子类取代类型码)
-
Replace Type Code with State/Strategy(以State/Strategy 取代类型码)
-
Extract Class(提炼类)
-
保持对象完整性(Preserve Whole Object)
int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);
boolean withinPlan = plan.withinRange(daysTempRange);
-
引入参数对象(Introduce Parameter Object)
-
Relace Array with Object(以对象取代数组)
String[] row = new String[2];
row[0] = "Liverpool";
row[1] = "15";
Performance row = new Performance();
row.setName("Liverpool");
row.setWins("15");