gpt4 book ai didi

java - 哪种设计模式以及如何使用 OOP 进行设计这个场景

转载 作者:行者123 更新时间:2023-12-02 06:19:12 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

8年前关闭。




Improve this question




我在设计模块时遇到问题,有人可以帮助我吗?

因为这种模块很难维护,我也觉得这可以考验我的设计模式使用能力。

要求

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

涉及不同的裁剪,如 Jade 米、番茄、秋葵等。这些裁剪中的每一种都有不同的特征。

每个性状都有一个测量尺度,它是整数,如 200-1000。现在假设我已经种植了裁剪并进行了测量,记下了性状。现在我想做一些测量。有些测量很简单,有些测量很复杂。

例子

让我们以农裁剪 Jade 米为例。我记录了 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

用户登录系统并选择他的裁剪并为这些观察输入数据。我必须计算为每个特征输入的数据的平均值或总和。

复杂性/问题的中心

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

示例:特征 YLD 有一个公式,我必须根据该公式计算其值,这也可能取决于其他一些特征。每种不同的裁剪可以有不同的性状。

这一切我都能做到——每当用户选择裁剪时,我都会检查那些特定的特征并进行计算(如果它不是特殊特征,那么我会根据数据库条目对它进行平均或求和),但是有很多困难编码。
我想就更好的处理方式提出建议。

我的代码需要处理简单和复杂的计算。
简单的计算很容易,我取了输入的特征值的平均值。
当我必须进行复杂的计算时,问题就来了,因为每种裁剪都有不同的特征和它们自己的公式,所以要计算我必须检查裁剪,然后检查复杂的特征。所以我必须硬编码复杂特征的特征名称。
谁能告诉我如何使用 Java oops [?!?] 设计它,以便我可以使其通用?

我有大约 10 种不同的裁剪。一些计算是针对裁剪的,所以会有很多类似下面的代码:
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")) {

应该按裁剪编写类,将其视为支持 109 种裁剪的应用程序,现在每个用户都登录系统,我有链接,他可以在上面的练习中执行此操作,裁剪最好是一个类。可能有 100 个特征每裁剪应该也是每特征。请告诉我。

最佳答案

首先将特征和裁剪封装到单独的类中,您可能想要创建一些抽象类,例如 裁剪类 特质类它将包含所有裁剪或性状的基本骨架和共同点,然后您可以扩展这些类并为每个特定裁剪或性状创建一个单独的类,这样特定类将包含特定于该裁剪的信息和过程或trait 并且仍然分别保持 Crop.class 和 Trait.class 的一般功能。

例如,您还可以为需要对特征执行的单个或一组操作创建类似的模式。

这里的想法是以更易于维护的方式将其展开,这将使添加更多裁剪和特征或修改现有的变得轻而易举。

编辑:

如果您有任意数量的裁剪/特征,那么为每个裁剪编写一个单独的类将不是这里的解决方案。裁剪的个性将来自更广义的类的某些属性和状态。

但是,如果某些裁剪/特征有相似/相同的功能/特征(我假设它们会因为您提到大约 100 种裁剪/特征等),您可以将它们分组到一个单独的类中。 ( GrainCrop.class 或类似的东西)

这意味着您仍然希望拥有 裁剪类 特质类抽象的,但不是将每个裁剪分组到一个单独的类中,而是将它们分组为类似裁剪的包,这将允许您轻松访问或将范围限制为例如裁剪的某个子集。

此外,您仍然可以简化某些任务,使它们看起来不那么笨重,甚至可以将它们分散到不同的类中。

从您的示例中,如果我们对其进行分析,我们可以看到最重复的属性是裁剪 ID( cropId.equalsIgnoreCase("OK")cropId.equalsIgnoreCase("TO") )

因此,无需无数次检查裁剪 id 是“TO”还是“OK”,您可以检查一次并有 2 个单独的分支来检查“TO”属性和“OK”属性。

此外,如果某些裁剪可能具有相同的共同操作集,那么您可以将它们分组到 下。 BasicCropOperations.class 然后也许将其余的复杂操作分成类似的行为集,如 EnvironmentalCropOperations.class 或者,例如,如果涉及到热量和湿度等问题。

这个想法仍然是一样的,在合理的范围内将所有东西分成更小的模块。 (例如:为不同的裁剪/性状编写 200 个类是不合理的)

关于java - 哪种设计模式以及如何使用 OOP 进行设计这个场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162090/

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