我正在尝试构建一个GraphBot类,它可以回答关于相关图形的不同问题,例如路径长度,两个顶点之间的最短路径,通过给定顶点的路径数等。
我希望能够在不更改Bot内的任何代码的情况下添加新问题,它只负责接收问题,委托其他一些算法使用与bot关联的图表来解决问题并返回答案。
这样的事情:
public class GraphBot {
private Graph graph;
public GraphBot(Graph graph) {
this.graph = graph;
}
public Answer ask(Question question) {
// delegate somehow to answer the question, providing the graph
// return an Answer object encapsulating the answer
}
}
public interface Answer {
public toPrintableOutput();
}
public interface Question {
// question methods go here... this is what I'm having trouble with
}
我遇到的麻烦是问题与条件或参数有关。例如,“A”和“B”之间的“路径长度”问题具有问题类型(“路径长度”),这是所有问题都将具有的,但也有参数“A”和“B”。相比之下,“通过顶点的路径”这一问题只有参数“C”代表顶点。
我无法想到一种呈现统一界面的方法,以便可以轻松扩展系统以处理具有不同数量和类型参数的众多不同问题。我可以有一个与每个问题相关的QuestionSolver,在这种情况下,如果每个问题具有不同的属性并不重要,因为QuestionSolver可以断言问题是有效类型但是这需要将问题映射到QuestionSolver某处。每当引入新问题时都需要更新。
实施此系统的最可扩展方式是什么,以便新问题不需要对不同类别的负载进行大量更改?我真的希望能够创建一个实现Question的类,并且可以创建一个可以解决该问题的类,然后让GraphBot自动处理该问题。
答案 0 :(得分:1)
您可以做的只是让ask()
方法成为Question
界面的一部分,然后选择Graph
。这样,每个Question
都必须知道如何回答自己,并且您不必设计一个未来可扩展的Question
api。
编辑:为什么这比GraphBot
能够回答Question
更好?
Question
API,它会将所有可能需要的数据考虑在内以解决任何问题,并找出如何将其编译成动态问题的问题算法。每个Question
的自定义代码更容易知道如何处理公开的Graph
数据。GraphBot
依赖于绝对不稳定的Question
。我的方法颠倒了这种依赖性,使其变得更加简单,这又回到了最后一点。Question
课程需要提供的所有内容。当(不是)您遇到需要在Question
界面中进行的更改时,每个实施者都需要更改。如果有多个Question
实施者,这将使你的未来(或其他一些开发者)以一千个太阳的激情激情憎恨你的现在。最后,我想不出一个令人信服的理由不回答问题。是的,从纯粹抽象的“这与现实世界一致”的观点来看,它没有多大意义,但对于一个处理它自己的答案的问题来说,这既实际又不合理。关于OOP要记住的一件事是,与现实世界的相似之处是为了方便而不是一般。不要让自己被他们束缚。
所以现在就是这样:
public class GraphBot {
private Graph graph;
public GraphBot(Graph graph) {
this.graph = graph;
}
public Answer ask(Question question) {
return question.ask(graph);
}
}
public interface Answer {
public toPrintableOutput();
}
public interface Question {
public Answer ask(Graph graph);
}