假设我们有一个 API。
interface Graph {
boolean checkIfPathExists(source, destination);
List<Integer> getPath(source, destination);
}
以下哪一项是最佳/推荐的实施方式。
选项 1:强制检查以验证路径是否存在。如果之前未调用 checkPath,则抛出异常。
Graph g = new GraphImpl(graph);
if (g.checkIfPathExists(s, d)) {
List path = g.getPath(s, d);
}
选项 2:不强制执行功能序列。如果调用 getPath,则让 getPath() 内部调用 checkIfPathExists() 并在 checkIfPathExists() 返回 false 时返回空集合;
Graph g = new GraphImpl(graph);
List path = g.getPath(s, d);
在我看来,Option2 对我来说看起来不错,但我唯一遇到的问题是对'checkIfPathExists()'之类的状态检查方法的冗余/不必要的调用。理想情况下,这不是 getPath() 应该做的。它应该只是返回路径。
哪个是更好的实现 option1 或 option2 ?
如果 option2 是一个更好的选择,那么根本不添加“checkIfPathExists”作为公共接口会是一个更好的设计选择吗?为了使问题更通用的状态检查方法看起来像“hasNext()”,如果没有强制执行似乎是不必要的。即使遍历一个列表,我们也可以获得列表的大小并使用 for 循环直到 i <= size,并且根本不使用 hasNext()。简而言之 - 如果不强制执行状态检查功能,它们有什么用?
任何强制执行状态检查方法的“现实生活”示例?意思是,不先调用它们会导致异常?