假设我有一个类 DFS,它将 Graph 作为构造函数参数,将源作为 doDfs 参数。
public class DFS {
final Graph g;
list path;
public DFS(Graph g) {
this.g = g;
}
public void doDfs(int source) {
// dfs computation
populate path.
}
}
现在将来我需要扩展这个类并添加另一个函数'printPathToSource'。
public class DFS {
final Graph g;
list path;
public DFS(Graph g) {
this.g = g;
}
public void doDfs(int source) {
// dfs computation
populate path.
}
public void printPathToSource(int vertex) {
// dfs computation
populate path.
}
}
现在有几个选择,
1. 将源存储为实例变量,但不要将其传递给 cosntructor。
public class DFS {
final Graph g;
list path;
int source; // <------ NOTE the new field.
public DFS(Graph g) {
this.g = g;
}
public void doDfs(int source) {
// dfs computation
populate path.
if (souce == null) {
this.source = source;
}
}
public void printPathToSource(int vertex) {
// dfs computation
populate path using this.source
}
}
坏处:
DFS dfs = new DFS(graph);
// some code
dfs.doDfs(5);
// some code
dfs.doDfs(7);
// some code
dfs.printPath(10); // <-- cannot direct this function if it wants the output of 5 or 7.
2.再次指定源&不要将其存储为实例变量:
dfs.printPath(10, source == 5)
Disadvantage: Redundant parameter passing,
3. 添加另一个构造函数。
public class DFS {
final Graph g;
list path;
int source; // <------ NOTE the new field.
public DFS(Graph g) {
this.g = g;
}
public DFS(Graph g, int source) {
this.g = g;
this.source = source;
}
public void doDfs() {
doDfs(this.source);
}
public void doDfs(source) {
// dfs computation
populate path.
}
public void printPathToSource(int vertex) {
// dfs computation
populate path using this.source
}
}
坏处:
引入一个额外的实例变量。对于新源,将创建一个新对象。这意味着为新源创建一个新对象。字段源的值在每次调用中都非常不同,并且不需要使其成为实例变量。
请建议我一个很好的代码维护方法。
谢谢,