Graph をコンストラクター引数として、source を doDfs パラメーターとして使用するクラス DFS があるとします。
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. ソースをインスタンス変数として保存しますが、consntructor には渡さないでください。
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
}
}
不利益:
追加のインスタンス変数の導入。新しいソースの場合、新しいオブジェクトが作成されます。これは、新しいソースに対して新しいオブジェクトを作成することを意味します。フィールド source の値は呼び出しごとに大きく異なり、インスタンス変数にする必要はありません。
コードのメンテナンスのための良いアプローチを教えてください。
ありがとう、