我正在开发一个存储以下数据的程序:
- 事实:属性列表(或仅一个)和true / false值(称为“真值”值)的组合。例如:
父母('John','John jr'),真实
其中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...
- 规则:用于从事实中获取信息。他们的工作是通过一个事实(我称之为衍生事实)暗示另一个事实(我称之为暗示事实):
parent('x','y')=&gt;孩子('y','x')
这意味着通过将规则应用于上述事实,我们可以确定John jr
是John
的孩子。
消极:
规则可以是“正面的”(如果导数为真,则impliant为真):
parent('x','y')=&gt;孩子('y','x')
或“negative”(如果导数为true,则impliant为false):
parent('x','y')=&gt;不是孩子('y','x')
可逆性:
它们也可以是“逆转的”(如果衍生物是假的,则暗示是真/假):
不是父母('x','y')=&gt;孩子('y','x')
或(如果也是否定的):
不是父母('x','y')=&gt;不是孩子('y','x')
或“非逆转”(如果衍生产品为假,则不明确):
不是父母('x','y')=&gt; (未知)
我用来存储规则的代码如下:
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.Fact Check:检查事实是否属实。根据事实,这将基于该事实的真值返回真或假。例如,用户可以询问:
父母('John','John jr')?
,程序将在true
时返回:
父母('John jr','John jr')?
将返回false
。
问号表示用户想要询问“事实检查”问题。
1.Impliant Check:对于给定的事实(称为问题 - 事实),这将返回可应用于问题事实的每个规则的事实列表。例如:
父母('John','John jr')=&gt;
这将返回:
孩子('John jr','John')
箭头表示用户想要询问“Impliant check”问题。
问题编码如下:
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
字段中,我根据用户想要提出的问题存储?
或=>
。
我目前正处于需要编写将向给定信息集提问的方法的位置。所以我需要一个给出问题和信息集的方法返回true
,false
或事实列表。据我所知,这在java中是不可能的。
我尝试为每个问题制作一个单独的方法,但这也会导致问题,因为我希望能够写出类似的内容:
informationSet.ask(question);
并让ask()
方法处理这两种类型的问题,所以我不必检查用户在用户界面代码中询问的问题类型,而是检查程序的后端解决它。
这可能是一个很好的方法吗?
答案 0 :(得分:2)
因此,最明显的解决方案是实现自定义响应类。
另一个想法是考虑使用来自Either的Vavr,Mockk是一种解决方案,旨在独立地保存A或B类型的(双关语!)值。
所以,它可能看起来像:
Either<Boolean, List<Fact>> result = foo();
然后,您可以利用FP Optional / Stream API来操作结果:
如果您想访问左侧:
result.left()
.map(...)
.filter(...)
// ...
如果您想访问右侧:
result.right()
.map(...)
.filter(...)
// ...
答案 1 :(得分:0)
除了 Grzegorz 的提议之外,你应该记住Java是强类型的。这并不意味着您无法返回 Either 对象;根据定义,它可以包含不同的类(类型)。
但是在Java逻辑中,我认为以更窄的粒度实现更多指定方法会更好(这在面向对象设计中有很多好处,比如共享代码和可伸缩性)。
所以我建议提出两种方法,一种用于布尔值,另一种用于数组结果。然后在调用函数中进行条件测试。