【发布时间】:2014-01-21 14:22:30
【问题描述】:
我有 10-15 种不同类型的结果来计算 AResult、BResult 等。所有结果计算都返回单一类型的值(考虑一个 integer 值)。
为了计算这些,我需要输入参数,这些参数大多是常见的,但有一些需要不同的参数,如下所示:
Input parameters example:
AResult needs int x, int y, int a[], int b[]
BResult needs int x, int y, int a[], boolean c
CResult needs int x, int y, int a[], boolean c, boolean d
DResult needs int x, int y, int p[], boolean e
.....
注意,在某些情况下,一个计算的结果也会用于其他结果计算,但这只是少数情况,而不是全部。
我的做法是通过Approach1如下:
方法一:
我正在定义一个接口,该接口具有单一方法来计算采用InputParameter obj 的结果。在实现类中,我将从InputParameter obj 中提取适用于该特定类型结果的值。这是我的示例代码的 sn-p:
public interface Result {
int calculate(InputParameter obj);
}
public class AResult implements Result {
public int calculate(InputParameter obj){
// code
}
}
public class BResult implements Result {
public int calculate(InputParameter obj)){
// code
}
}
public class InputParameter {
int x;
int y;
int z;
int a[];
int b[];
int p[];
boolean c;
boolean d;
boolean e;
....
// Getters and Setters
}
例如,假设我创建了一个InputParameter 对象并设置其中所有字段的值。我将此对象传递给 aResultObject.calculate(InputParameter obj) 、 dResultObject.calculate(InputParameter obj) 等等。
AResult 需要我从InputParameter obj 提取的int x, int y, int a[], int b[] 进行计算并返回结果。
DResult 需要int x, int y, int p[], boolean e,我从同一个InputParameter obj 中提取它来进行计算并返回结果。
注意,我可能需要做其他组的结果计算,所以可能会创建InputParameter、AResult、BResult 等多个对象。只是想表达InputParameter 不必是单例的。
方法2:
拥有不带任何参数的 calculate() 方法并在各个 Result 类构造函数中设置这些值。
正如@Duncan 指出的Approach1 的一个缺点是,在这里我可能会错过在InputParameter 对象中为给定结果计算设置必填字段。而当我实际尝试在calculation(InputParameter obj) 方法中从InputParameter 对象中提取值时,我发现它没有设置。
public interface Result {
int calculate();
}
public class AResult implements Result {
public AResult(int x, int y, int a[], int b[]) {
//set input params
}
public int calculate() {
//calculate and return AResult
}
}
方法3:
为 Result 创建单个类(或可能只是 2-3 个类),然后使用单独的方法来计算不同的结果。
我也在考虑这种方法,因为在某些情况下,一个计算的结果也会用于其他结果计算(但这只是在少数情况下,而不是全部)。
public class Result {
// various fields...
int calculateResultA(){...}
int calculateResultB(){...}
int calculateResultC(){...}
}
上面提到的Approach1是否适合给定的情况?还是其他替代品更好?
【问题讨论】:
-
我现在想知道我的回答是否混淆了问题。输入数据总是相同的,但不同的“结果生产者”对输入数据做不同的事情吗?如果是这样,也许您的原始设计是相当合理的。
-
正如我在问题中提到的,计算
AResult的输入数据可能与其他结果(比如BResult)几乎没有共同之处,但可能需要比BResult更多的输入参数。这同样适用于我要计算的各种结果。因此,基本上计算不同结果所需的输入并不完全相同。现在清楚了吗,还是我应该举例说明一下? -
“int x;int y;int z;int a[];int b[];boolean c;boolean d;”的值所有计算都保持不变?
-
@Learner:您能描述一下您的用例吗?我仍然认为可能存在一些误解......你们每个人在 cmets 中所说的“数据相同”是什么意思?您是说所有计算都有 POJO 类 InputParameter 的 SINGLE 实例(可以是单例),还是说“相同”只是指业务解释?请多谈谈你的真实用例。
-
@Learner 我仍然不完全了解您在做什么,因此很难就正确的方法提出建议。有没有可能你可以解释你真正在做什么,而不是抽象地谈论?
标签: java oop design-patterns class-design