0

假设我有一个类 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
      }
 }

坏处:

引入一个额外的实例变量。对于新源,将创建一个新对象。这意味着为新源创建一个新对象。字段源的值在每次调用中都非常不同,并且不需要使其成为实例变量。

请建议我一个很好的代码维护方法。

谢谢,

4

2 回答 2

0

看起来您的班级DFS负责存储图表并在此图表上进行一些计算,这与“源”无关(请参阅示例 1 的 doDFS(source) )

但是该类不负责存储最终结果。所以,根据我的经验,我的建议是:尝试解​​耦你的类,考虑每个类的职责。

最终,我将有一个 Class DFSResult,其中包含 DFS 计算的结果(如果 List / Map 不够用)和一个 Class DFSResultWriter,它可以采用 aDFSResult和 asource并填充结果。DFS不应该知道来源,而只知道如何将其结果存储在DFSResult实例中。

稍后,您可能会想要写入不同的来源。因此,最好将 的方法DFSResultWriter放在接口中并为每种源类型创建不同的实现,你有。甚至Source可能成为一个接口,并且你有不同的Source.

所以Source可以有一个实例方法:

source.writeDFSResult(DFSResult dfsResult)

于 2013-08-05T08:00:38.667 回答
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 回答