2

节目简介

我正在开发一个存储如下数据的程序:

- 事实:属性列表(或仅一个)和真/假值(称为“真”值)的组合。例如:

父母('约翰','小约翰'),真

其中John作为父母的属性John jr为真。我用于存储事实的代码:

public class Fact implements Serializable{
    private boolean truth;
    private ArrayList<Property> properties;

    public Fact(){
        truth = false;
        properties = new ArrayList<Property>();
    }

    //more constructors, getters, setters and other functions  which are not important for this question...

- 规则:用于从事实中获取信息。它们的工作原理是让一个事实(我称之为派生事实)暗示另一个事实(我称之为隐含事实):

父母('x','y')=> 孩子('y','x')

这意味着通过将规则应用于上述事实,我们可以确定它John jr是 的孩子John

规则的属性:

消极性:

规则可以是“肯定的”(如果导数为真,则蕴含为真):

父母('x','y')=> 孩子('y','x')

或“否定”(如果导数为真,则蕴涵为假):

父母('x','y')=>不是孩子('y','x')

可逆性:

它们也可以是“可逆的”(如果导数是假的,则蕴含的是真/假):

不是父母('x','y')=> 孩子('y','x')

或(如果也是负数):

不是父母('x','y')=> 不是孩子('y','x')

或“不可逆”(如果导数为假,则隐含项未知):

不是父母('x','y')=>(未知)

我用来存储规则的代码如下所示:

public class Rule implements Serializable{
    private Property derivative;
    private Property impliant;
    private boolean negative;
    private boolean reversive;

    public Rule(Property derivative, Property impliant) throws InvalidPropertyException{
        if(!this.validRuleProperty(derivative) || !this.validRuleProperty(impliant))
            throw new InvalidPropertyException("One or more properties are invalid");
        this.derivative = derivative;
        this.impliant = impliant;
        negative = false;
        reversive = false;
    }

    //again more constructors, getters, setters and other functions  which are not important for this question...

信息集

事实和规则存储在InformationSets其中,将这些事实和规则捆绑在一起,以便用户可以“质疑”里面的信息。这可以通过两种不同的方式完成:

1.事实检查:检查事实是否属实。给定一个事实,这将根据该事实的真值返回真或假。例如,用户可以问:

父母('约翰','小约翰')?

并且程序将在以下情况下返回true

父母('小约翰','小约翰')?

将返回false

问号表示用户想要提出“事实核查”问题。

1.隐含检查:对于给定的事实(称为问题事实),这将返回可以应用于问题事实的每个规则的事实列表。例如:

父母('约翰','小约翰')=>

这将返回:

孩子('小约翰','约翰')

箭头表示用户想要提出“隐含检查”问题。

问题编码如下:

public class Question {
    Fact questionFact;
    String operator;

    public Question(Fact questionFact, String operator) throws InvalidOperatorException{
        if(!validOperator(operator))
            throw new InvalidOperatorException("The operator is invalid");
        this.questionFact = questionFact;
        this.operator = operator;
    }

Operator我存储的字段内?=>根据用户想问的问题。

问题

我目前正处于需要编写向给定信息集提问的方法的地步。所以我需要一个方法,给出一个问题,一个信息集返回一个truefalse或者一个事实列表。据我所知,这在java中是不可能的。

我试图为每个有点工作的问题制作一个单独的方法,但这也会导致一个问题,因为我希望能够编写如下内容:

informationSet.ask(question);

并让该ask()方法处理这两种类型的问题,因此我不必检查用户在用户界面代码中提出的问题类型,而是让程序的后端解决它。

有什么好方法可以做到这一点?

4

2 回答 2

2

因此,最明显的解决方案是实现您的自定义响应类。


另一个想法是考虑使用来自Vavr的Either ,它是一种专门用于保存(双关语!)类型 A 或 B 的值的解决方案。

所以,它可能看起来像:

Either<Boolean, List<Fact>> result = foo();

然后,您可以利用类似 FP Optional/Stream API 来处理结果:

如果要访问左侧:

result.left()
  .map(...)
  .filter(...)
  // ...

如果要访问右侧:

result.right()
  .map(...)
  .filter(...)
  // ...
于 2018-03-16T10:39:43.367 回答
0

除了Grzegorz的提议,你应该记住 Java 是强类型的。这并不意味着您不能返回Either对象。根据定义,它可以包含不同的类(类型)。

但是在 Java 逻辑中,我认为最好以更窄的粒度实现更多指定的方法(这在面向对象的设计中有很多好处,比如共享代码和可伸缩性)。

所以我建议提出两种方法,一种用于布尔值,另一种用于数组结果。然后在调用者函数中进行条件测试。

于 2018-03-16T10:57:02.233 回答