什么是迪比特法则
又称最小知识原则,如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用,其目的是降低类之间的耦合度。通俗的讲是:与你的直接朋友交谈,不跟“陌生人”说话。
迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
迪比特法则应当是双向的:
- 如无必要,软件实体不要访问其他软件实体。
- 如无必要,软件实体也不要把自己暴露给其他软件实体。
迪比特法则的好处
- 降低了软件实体之间的耦合性,从而降低了代码修改可能波及的范围,提高了可扩展性和灵活性
- 提高了代码的可读性
- 提高了可维护性
实现方法
列举一些工作中实际碰到的,会随时补充其他规则:
- 如果一个对象只是当前类的某个方法会访问,那么就不要把当前对象作为类的成员变量,因为这样会使这个成员变量对整个类可见
- 子类才会使用的变量不要提升到父类中
案例1
原始实现
public class Transformer {
public Transformer(List<String> columnList, int []data, String dateColumn) {
//具体代码省略
}
public void transform() {
//具体代码省略
}
public process() {
//具体代码省略
}
}
public class ComputeDiff extends Transformer {
public void transform() {
//具体代码省略
}
}
public class OneHot extends Transformer {
public void transform() {
//具体代码省略
}
}
说明:
- Transformer的构造方法中的data参数实际上只有transform方法会使用,其他方法(如process)并不使用
- Transformer的构造方法中的dateColumn参数只有子类ComputeDiff会用,Transformer和子类OneHot并不使用
调整后的代码
public class Transformer {
public Transformer(List<String> columnList) {
//具体代码省略
}
public void transform(int []data) {
//具体代码省略
}
public process() {
//具体代码省略
}
}
public class ComputeDiff extends Transformer {
public ComputeDiff(List<String> columnList, String dateColumn) {
super(columnList);
//具体代码省略
}
public void transform(int []data) {
//具体代码省略
}
}
public class OneHot extends Transformer {
public void transform(int []data) {
//具体代码省略
}
}