0

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 の値は呼び出しごとに大きく異なり、インスタンス変数にする必要はありません。

コードのメンテナンスのための良いアプローチを教えてください。

ありがとう、

4

2 に答える 2

0

過負荷printPathToSource()

public void printPathToSource(int vertex) {
    this.printPathToSource(this.source, vertex);
}

public void printPathToSource(int source, int vertex) {
    // PROFIT!
}
于 2013-08-05T07:54:23.597 に答える