我想用2个2个值的数组进行计算,我有5个适用于5种不同条件的公式。
例如,数组:
Array 1: [15, 17]
Array 2: [15, 16]
那么有5个条件:
AB AC - condition 1
AB AB - condition 2
AB AA - condition 3
AA AC - condition 4
AA AA - condition 5
它们始终至少具有1个相同的值。如果它们只有1个相同的值,例如上面的示例,则[15,17]和[15,16]中都存在15(或A),但是17(可以是B或C)和16(可以是B或C) C)有所不同,这是第一个条件。如果它们相同,并且每个数组具有2个不同的值,例如[15,16]和[15,16],则这将是第二个条件。
执行此操作的明智方法是什么?我正在考虑使用...
if (condition 1){
formula 1
}else if(condition 2){
formula 2
}else if(condition 3){
formula 3
}else if(condition 4){
formula 4
}else if(condition 5){
formula 5
}
但是,这看起来确实很可怕,我不确定如何正确编写条件。
答案 0 :(得分:1)
首先,正如我在评论中所说,为所有情况编写良好的单元测试。这些应该确保您最终编码的任何解决方案都是正确的。我和许多人更愿意在实际代码之前 编写单元测试(如果这听起来很奇怪并且您想了解更多,请搜索TDD)。
第二,我的样式将使用嵌套的if / else语句(伪代码):
if (arr1[0] != arr2[0]) {
throw some exception;
}
if (arr1[0] == arr1[1]) { // we now know arr1[0] == arr2[0] == arr1[1]
if (arr2[0] == arr2[1]) { // all equal
assert arr1[1] == arr2[1];
// condition 5
} else {
// condition 4
}
} else { // arr1[0] != arr1[1]
if (arr2[0] == arr2[1]) { // arr1[0] == arr2[0] == arr2[1]
// condition 3
} else {
if (arr1[1] == arr2[1]) {
// condition 2
} else {
// condition 1
}
}
}
答案 1 :(得分:0)
可悲的是,我看不到任何摆脱这些测试的方法。您可以将它们隐藏在工厂之间和/或使用Map<Predicate, BiConsumer>
(其中BiConsumer
是公式)。但是以一种或另一种方式,您将拥有这五个条件。
拥有简洁代码的重点是正确命名您的条件或谓词。