Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 该场景采用哪种设计模式以及如何使用OOP进行设计_Java_Oop_Design Patterns - Fatal编程技术网

Java 该场景采用哪种设计模式以及如何使用OOP进行设计

Java 该场景采用哪种设计模式以及如何使用OOP进行设计,java,oop,design-patterns,Java,Oop,Design Patterns,我在设计模块时遇到困难,有人能帮我吗 因为这类模块很难维护,我也认为这可以测试我的设计模式使用技巧 要求 这基本上是一个农业项目(web应用程序)。我需要设计一个模块进行一些计算 有不同的作物,如玉米、番茄、秋葵等。每种作物都有不同的特性 每个特征都有一个测量尺度,它是一个整数,比如200-1000。现在让我们假设我已经种植了作物,并进行了测量,记录下了性状。现在我想做一些测量。有些测量是简单的,有些是复杂的 范例 让我们以种植玉米为例。我记录了15个性状的观察结果。(我们将使用trait1-t

我在设计模块时遇到困难,有人能帮我吗

因为这类模块很难维护,我也认为这可以测试我的设计模式使用技巧

要求

这基本上是一个农业项目(web应用程序)。我需要设计一个模块进行一些计算

有不同的作物,如玉米、番茄、秋葵等。每种作物都有不同的特性

每个特征都有一个测量尺度,它是一个整数,比如200-1000。现在让我们假设我已经种植了作物,并进行了测量,记录下了性状。现在我想做一些测量。有些测量是简单的,有些是复杂的

范例

让我们以种植玉米为例。我记录了15个性状的观察结果。(我们将使用trait1-trait15作为示例,实际名称可以是plt_ht、yld等)

我记录了每个特征的5个观察结果:

trait1 trait2 trait3 trait5 trait6..... trait15
01,02,03,04 01,02,03,04 01,02,03,04
用户登录到系统中,选择作物并输入这些观测数据。我必须计算每个特征输入数据的平均值或总和

问题的复杂性/中心

到目前为止,这很简单,但当我对某些特征有一些不同的公式时,复杂性就来了

示例:trait YLD有一个公式,我必须根据这个公式计算它的值,这也可能取决于其他一些特征。每种不同的作物都有不同的特性

所有这些我都能做到——每当用户选择作物时,我都会检查这些特定的性状并进行计算(如果它不是一个特殊的性状,那么我会根据db条目对其进行平均或求和),但有很多硬编码。 我想就如何更好地处理这个问题提出一些建议

我的代码需要处理简单和复杂的计算。 简单的计算很容易,我已经取了输入的trait值的平均值。 当我不得不做复杂的计算时,问题就来了,因为每种作物都有不同的特性,有自己的公式,所以要计算,我必须先检查作物,然后检查复杂的特性。所以我必须硬编码复杂性状的性状名称。 有没有人能告诉我如何使用Java oops[?!?]来设计它,从而使其具有通用性

我有大约10种不同的作物。有些计算是针对作物的,因此会有很多类似以下if的代码:

hasZeroValue = (HashMap<String, ArrayList<String>>) dataValues[1];
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("TLSSG_70")) {
    traitAvg=calculateTLCV(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues,50);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("TLSSG_100")) {
    traitAvg=calculateTLCV(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues,50);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("YVMV_60")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("YVMV_90")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("YVMV_120")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("ELCV_60")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("ELCV_90")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("TO") && traitName.equalsIgnoreCase("ELCV_120")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("OK") && traitName.equalsIgnoreCase("YVMV_60")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("OK") && traitName.equalsIgnoreCase("YVMV_90")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg,dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("OK") && traitName.equalsIgnoreCase("YVMV_120")) {
    traitAvg=tomatoYVMVCalculation(traitName, traitAvg, dataPoint, dataTraits, hybrid, repl, traitValues, dataPvalues);
} else if(cropId.equalsIgnoreCase("OK") && traitName.equalsIgnoreCase("ELCV_60")) {
hasZeroValue=(HashMap)数据值[1];
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“TLSSG_70”)){
traitAvg=calculateTLCV(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues,50);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“TLSSG_100”)){
traitAvg=calculateTLCV(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues,50);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“YVMV_60”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“YVMV_90”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“YVMV_120”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“ELCV_60”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“ELCV_90”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“TO”)和&traitName.equalsIgnoreCase(“ELCV_120”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“OK”)和&traitName.equalsIgnoreCase(“YVMV_60”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“OK”)和&traitName.equalsIgnoreCase(“YVMV_90”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“OK”)和&traitName.equalsIgnoreCase(“YVMV_120”)){
traitAvg=tomatoyvmvculation(traitName,traitAvg,dataPoint,dataTraits,hybrid,repl,traitValues,dataPvalues);
}否则如果(cropId.equalsIgnoreCase(“OK”)和&traitName.equalsIgnoreCase(“ELCV_60”)){

如果每种作物都要编写一个类,可以把它看作是一个支持109种作物的应用程序,现在每个用户都登录到系统中,我有一个链接,他可以在这里做上述练习,作物最好是一个类。如果每种作物也是每种性状,那么每种作物可能有100种性状。请让我知道。

这个问题的总体解决方案取决于de您还没有告诉我们。我们不知道您是否希望为复杂的计算编写代码,这意味着您可以为每个裁剪创建一个类,或者您是否希望能够添加裁剪或更改计算而无需更改代码

但是,您正在做的一些事情可以立即得到改进。您的
如果a&&b,那么x else如果a&&c,那么y else如果a&&d等模式可以更改为:

if a
{
  if b { x }
  else if c { y }

...
}
更重要的是,假设您可以为作物和/或计算创建类,您可以存储此类对象的集合,并使用它们替换if/then/else序列。例如:创建由上面的“traitName”值索引的对象的hashmap;而不是if/then/else,使用hashmap获取对相应对象的引用.get(),并将计算方法放入该对象中

我想