【软件重构】【滥用面向对象】详解异曲同工的类
(1)定义:
两个类中有着不同的函数,却在做着同一件事情,那么就存在坏味道,重复类,重复的代码
(2)问题影响:
会出现函数功能类似的存在于两个类中,导致代码重复,维护和阅读困难,不知道是使用哪个类的函数。
注意特殊情况:如果两个功能类似相同的类存在于两个不同库lib里面,也就是编译好的类库,咱们不能改变它,只能选择其中一个使用
(3)如何消除异曲同工的类
1)修改函数签名。
函数是我们将程序拆分成小块的主要方式。函数声明则展现了如何将这些小块组合在一起工作,函数有签名,签名包括函数名称,函数参数,正确的命名函数名称(根据应用场景)和正确封装函数参数(根据场景规则),可以提高函数的使用。
-
修改函数名。如果两个函数只是名称类似,实质功能确实不一样的话,可以使用修改函数名的方式,明确每个函数是干什么的。
重构前:函数名称太简单,不清楚范围
function circum(radius) {
return 2 * Math.PI * radius;
}
重构后:函数名称明确使用范围
function circumference(radius) {
return 2 * Math.PI * radius;
}
-
修改函数参数。如果两个功能类似的函数存在只是因为参数不用而输出不同的信息。那么可以将参数抽象成一个对象,函数使用该对象作为入参,合并成一个函数即可。
例如需要给一个方法添加一个参数,
重构之前:两个函数做的事情一样,只是传入参数类型不一样
function testA(String message) {
System.out.println(message)
}
function testA(int num) {
System.out.println(num)
}
重构后:将两个参数合并成一个父类型,传入子类型即可
function test(Object obj) {
System.out.println(obj)
}
2)搬移函数。
搬移函数最直接的一个动因是,它频繁引用其他上下文中的元素,而对自身上下文中的元素却关心甚少。
同样,如果我在整理代码时,发现需要频繁调用一个别处的函数,也可以考虑搬移这个函数。
如果该类中有函数与引用类关联比较大,那么可以将该函数直接搬移到引用类中,将旧函数直接变成委托函数。
具体做法:
- 检查函数在当前上下文里引用的所有程序元素(包括变量和函数),考虑是否需要将它们一并搬移
- 检查待搬移函数是否具备多态性。
- 将函数复制一份到目标上下文中。调整函数,使它能适应新家。
- 执行静态检查。
- 设法从源上下文中正确引用目标函数。
- 修改源函数,使之成为一个纯委托函数。
3)提炼超类。
如果两个类中,存在有相似的特性,那么可以直接提取一个超类,使用继承或者组合的方式,实现公用,减少重复代码。
一个类应该是一个清晰的抽象,只处理一些明确的责任,等等;
具体做法:
- 决定如何分解类所负的责任。
- 创建一个新的类,用以表现从旧类中分离出来的责任。如果旧类剩下的责任与旧类的名称不符,为旧类改名。
- 构造旧类时创建一个新类的实例,建立“从旧类访问新类”的连接关系。
- 对于你想搬移的每一个字段,运用搬移字段搬移之。每次更改后运行测试
- 使用搬移函数将必要函数搬移到新类。先搬移较低层函数(也就是“被其他函数调用”多于“调用其他函数”者)。每次更改后运行测试。
- 检查两个类的接口,去掉不再需要的函数,必要时为函数重新取一个适合新环境的名字。
- 决定是否公开新的类。如果确实需要,考虑对新类应用将引用对象改为值对象使其成为一个值对象。
- 点赞
- 收藏
- 关注作者
评论(0)