gpt4 book ai didi

java - 给定场景的类/接口(interface)设计方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:06 25 4
gpt4 key购买 nike

我有 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 如下:

方法一:

我正在定义一个接口(interface),它有一个单一的方法来计算采用 InputParameter obj 的结果。在实现类中,我将从 InputParameter obj 中提取适用于该特定类型结果的值。这是我的示例代码片段:

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 需要 int x, int y, int a[], int b[],我从 InputParameter obj 中提取它来进行计算并返回结果。

DResult 需要 int x, int y, int p[], boolean e 我从相同的 InputParameter obj 中提取它来进行计算并返回结果。

注意,我可能需要做其他组的结果计算,所以可能会创建InputParameterAResult的多个对象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(){...}
}

上面提到的方法 1 是否适合给定的情况?还是其他选择更好?

最佳答案

我建议使用工厂方法 2。该模式(可能)是命令

工厂方法

package blammy.result;

public interface Result
{
int calculate();
}

package blammy.result.impl;

public class AResult
implements Result;
{
/*
* Protected constructor to hinder naughty construction.
*/
protected AResult(
int x,
int y,
int a[],
int b[])
{
... blah;
}

public int calculate()
{
int returnValue;
returnValue = ... blah.
return returnValue;
}
}
public class BResult
implements Result;
{
/*
* Protected constructor to hinder naughty construction.
*/
protected BResult(
int x,
int y,
boolean c)
{
... blah;
}

public int calculate()
{
int returnValue;
returnValue = ... blah.
return returnValue;
}
}

public static class ResultFactory
{
public static Result createResult(
int x,
int y,
int a[],
int b[])
{
return new AResult(x, y, a, b);
}

public static Result createResult(
int x,
int y,
boolean c)
{
return new BResult(x, y, c);
)
}

编辑1

如果不同的计算需要相同的参数,那么你应该在工厂和类名中使用描述性名称。例如:

public static class ResultFactory

public static Result createBlammy(
int x,
int y,
int a[],
int b[])
{
return new ResultBlammy(x, y, a, b);
}

public static Result createHooty(
int x,
int y,
int a[],
int b[])
{
return new ResultHooty(x, y, a, b);
}

关于java - 给定场景的类/接口(interface)设计方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com