如果我想在图表上做 DFS,
选项 1:我可以使用 dfs() 方法创建一个类 Graph
或者
选项 2:我可以创建 2 个类 Graph 和 DFS,并在 DFS 的构造函数中传递 Graph 对象。
一般来说,何时使用实例方法以及何时选择将实例传递给另一个类的构造函数?有什么经验法则吗?
如果我想在图表上做 DFS,
选项 1:我可以使用 dfs() 方法创建一个类 Graph
或者
选项 2:我可以创建 2 个类 Graph 和 DFS,并在 DFS 的构造函数中传递 Graph 对象。
一般来说,何时使用实例方法以及何时选择将实例传递给另一个类的构造函数?有什么经验法则吗?
我会使用单独的类,将作为图形的关注与导航图形分开。
为图节点创建接口,例如
interface Node<T> {
T getValue();
Set<Node<T>> getChildren();
}
并创建一个导航和搜索图表的界面:
interface GraphSearcher<T> {
Node<T> search(Node<T> root, T value();
}
然后创建一个 DFS 实现:
class DfsGraphSearcher<T> {
Node<T> search(Node<T> root, T value) {
// DFS impl
}
}
进一步将责任与实现分开将允许您在不更改任何客户端代码的情况下交换另一个(例如广度优先)impl,可能使用抽象工厂。
如果您创建 2 个类并将 Graph 对象传递给 DFS 类的方法进行搜索,它会很好看。