0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

处理概括关系

字段上移

如果两个子类拥有相同的字段,请通过 Pull Up Field(字段上移) 将该字段移至超类。

1
2
3
4
5
6
7
8
9
class Employee {...} // Java

class Salesman extends Employee {
private String name;
}

class Engineer extends Employee {
private String name;
}
1
2
3
4
5
6
class Employee {
protected String name;
}

class Salesman extends Employee {...}
class Engineer extends Employee {...}

重构原因

子类分别的进行开发,会导致出现相同(或几乎相同)的字段和方法。

好处

  • 消除子类中重复的字段;
  • 可以使你将使用该字段的行为从子类移至超类,从而去除重复的行为。

函数上移

如果有些函数在各个子类中产生完全相同的效果,请通过 Pull Up Method(函数上移) 将该函数移至超类。

1
2
3
4
5
6
7
8
9
class Employee {...}

class Salesman extends Employee {
get name() {...}
}

class Engineer extends Employee {
get name() {...}
}
1
2
3
4
5
6
class Employee {
get name() {...}
}

class Salesman extends Employee {...}
class Engineer extends Employee {...}

重构原因

子类彼此独立地进行开发,会导致相同(或几乎相同)的字段和方法。

好处

  • 摆脱重复的代码。如果需要对方法进行修改,最好在一个地方进行更改,而不是在子类中重复修改;
  • 如果由于某种原因,子类重新定义了超类方法但执行基本相同的工作,也可以使用这种重构技术。

构造函数本地上移

如果在各个子类拥有一些几乎完全一致的构造函数,可以通过 Pull Up Constructor Body(构造函数本体上移) 早超类中新建一个构造函数,并在子类中调用它。

1
2
3
4
5
6
7
8
class Manager extends Employee {
public Manager(String name, String id, int grade) {
this.name = name;
this.id = id;
this.grade = grade;
}
// ...
}
1
2
3
4
5
6
7
class Manager extends Employee {
public Manager(String name, String id, int grade) {
super(name, id);
this.grade = grade;
}
// ...
}

函数下移

如果超类中的某个函数只与部分子类有关,请通过 Push Down Method(函数下移) 将这个函数移到相关的那些子类去。

1
2
3
4
5
6
class Employee {
getQuota {...}
}

class Engineer extends Employee {...}
class Salesman extends Employee {...}
1
2
3
4
5
class Employee {...}
class Engineer extends Employee {...}
class Salesman extends Employee {
getQuota {...}
}

好处

  • 提高类的内聚性,让方法位于您希望看到的位置。

字段下移

如果超类中某个字段只被部分子类用到,那么请通过 Push Down Field(字段下移) 将这个字段移到需要它的那些子类去。

1
2
3
4
5
6
class Employee {        // Java
private String quota;
}

class Engineer extends Employee {...}
class Salesman extends Employee {...}
1
2
3
4
5
6
class Employee {...}
class Engineer extends Employee {...}

class Salesman extends Employee {
protected String quota;
}

好处

  • 提高类的内聚性,让字段位于实际使用的位置;
  • 同时移动到多个子类时,可以相互独立地开发字段。这确实会创建代码重复,因此只有在您真正打算以不同方式使用字段时才按下字段。

提炼子类

1
2


1
2


提炼超类

1
2


1
2


提炼接口

1
2


1
2


折叠继承体系

1
2


1
2


塑造模板函数

1
2


1
2


以委托取代继承

1
2


1
2


以继承取代委托

1
2


1
2


欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法