Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 一个能够为各种问题对象返回答案对象的Bot类的设计_Oop_Architecture - Fatal编程技术网

Oop 一个能够为各种问题对象返回答案对象的Bot类的设计

Oop 一个能够为各种问题对象返回答案对象的Bot类的设计,oop,architecture,Oop,Architecture,我正在尝试构建一个GraphBot类,该类可以回答有关关联图的不同问题,例如路径长度、两个顶点之间的最短路径、通过给定顶点的路径数等 我希望能够添加新的问题,而无需更改Bot内的任何代码,它只负责接收问题,委托其他算法使用与Bot关联的图形解决问题并返回答案 比如说: public class GraphBot { private Graph graph; public GraphBot(Graph graph) { this.graph = graph;

我正在尝试构建一个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
}
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);
}
我遇到的问题是,问题有相关的条件或参数。例如,“A”和“B”之间的问题“路径长度”有问题类型(“路径长度”),这是所有问题都会有的,但也有参数“A”和“B”。相比之下,“通过顶点的路径”问题将只有表示顶点的参数“C”

我想不出一种方法来呈现一个统一的界面,这样系统就可以很容易地扩展到处理大量不同数量和类型的参数的不同问题。我可以有一个与每个问题相关联的问题求解器,在这种情况下,每个问题是否具有不同的属性并不重要,因为问题求解器可以断言问题是有效类型的,但这需要问题到问题求解器的映射,需要在出现新问题时进行更新介绍


实现该系统的最具扩展性的方式是什么,这样新问题就不需要在不同类的负载中进行大量更改?我真的希望能够创建一个实现问题的类,也许可以创建一个能够解决该问题的类,然后让GraphBot自动处理该问题。

您可以做的就是让
ask()
方法成为
问题
接口的一部分,并使用
图形。这样,每个
问题
都必须知道如何回答自己,而不必设计一个将来可扩展的
问题
api

编辑:为什么这是一个比让
GraphBot
能够回答
问题更好的设计

  • 简单性:正如您所发现的,很难设计一个
    Question
    API来考虑任何问题所需的所有可能的数据,并找出如何将其编译成一个动态提问算法。为每个
    问题
    定制代码要简单得多,这样就可以知道如何处理公开的
    图形
    数据
  • 依赖性:您最初的方法使相对稳定的
    GraphBot
    依赖于绝对不稳定的
    问题
    。我的方法逆转了这种依赖性,使它变得更简单,这又回到了最后一点
  • 维护:我保证你不能预测
    问题
    类需要提供的所有内容。当(不是如果)您在
    问题
    界面中遇到需要进行的更改时,每个实现者都需要进行更改。这将使你的未来你(或其他开发人员)憎恨你的现在,如果有超过几个
    问题
    实施者的话,你会有上千个太阳的激情
最后,我想不出一个令人信服的理由不自己回答问题。是的,有争议的是,从纯粹抽象的“这与现实世界是否一致”的角度来看,它没有多大意义,但对于一个问题来说,处理它自己的答案既实用又合理。关于OOP,需要记住的一点是,与现实世界的相似之处是为了方便,而不是作为一种规则。不要让自己被他们束缚

所以现在是这样的:

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
}
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);
}

这是一个很好的设计吗?一个问题知道如何回答自己有意义吗?一个问题知道如何回答自己有完美的意义。如果它不知道,谁会知道?这看起来很整洁,意味着只需要实施问题来扩展系统,但在他们回答问题之前,仍然感觉必须向某个人/某物提出问题,而不是问问题本身以获得答案。我知道这很挑剔,但我只是想了解一下面向对象的设计。