Java 在计算软件系统中作为枚举维护一长串计算参数是否可行?

Java 在计算软件系统中作为枚举维护一长串计算参数是否可行?,java,enums,software-design,Java,Enums,Software Design,我目前正在用Java维护一个遗留计算软件系统。有数百种不同名称的计算,每种计算都有自己的参数集,其中大多数是指示一些附加子计算的标志。在内部,许多if条件由这些参数控制 目前数据库中有一个参数表,相应地Java代码库中有一个enum,如下所示: public enum Parameter { GO_TO_FLOW_A, GO_TO_FLOW_B, IN_EU_STYLE, IN_US_STYLE, ROUND //there are yet hun

我目前正在用Java维护一个遗留计算软件系统。有数百种不同名称的计算,每种计算都有自己的参数集,其中大多数是指示一些附加子计算的标志。在内部,许多
if
条件由这些参数控制

目前数据库中有一个参数表,相应地Java代码库中有一个
enum
,如下所示:

public enum Parameter {
    GO_TO_FLOW_A,
    GO_TO_FLOW_B,
    IN_EU_STYLE,
    IN_US_STYLE,
    ROUND
    //there are yet hundreds more enum elements
}
问题是参数表包含数百行,即所有计算都有数百个参数,而此枚举包含数百个元素。更糟糕的是,当向数据库中添加更多新参数时,相应的元素也必须添加到
enum参数中


问题:有没有更好的解决方案来处理Java中的这么多参数?在这个用例中,
enum
可能不是一个好的选择?

因为您的软件设计为一个计算软件,所以不将这个“参数”作为enum是合理的。如果这样做,就会像您所说的那样,在数据库和代码之间添加一个隐式的耦合。问题更复杂,因为您有依赖于此枚举的内部流。如果要重新设计应用程序,可能需要花费一些额外的时间


在我看来,你必须思考:“这些计算行为中,哪些是你的计算中常见的?”,“哪些不是?”。之后,您将能够将常见行为提取到类或众所周知的设计模式中。您可以提取到其他类中的不同行为,其组织方式是,当您从数据库中检索“参数”时,您将能够动态选择执行您需要使用的某种计算的类/对象(例如,if等中的一种处理类型)-这里也许您可以使用策略模式。

由于您的软件设计为计算软件,因此不将此“参数”作为枚举是合理的。如果这样做,就会像您所说的那样,在数据库和代码之间添加一个隐式的耦合。问题更复杂,因为您有依赖于此枚举的内部流。如果要重新设计应用程序,可能需要花费一些额外的时间


在我看来,你必须思考:“这些计算行为中,哪些是你的计算中常见的?”,“哪些不是?”。之后,您将能够将常见行为提取到类或众所周知的设计模式中。您可以提取到其他类中的不同行为,其组织方式是,当您从数据库中检索“参数”时,您将能够动态选择执行您需要使用的某种计算的类/对象(例如,if等中的一种处理类型)-这里您可以使用策略模式。

这可能是主观的,但一般来说,将数据库复制为枚举是没有意义的

也许最好的做法是用常规类替换新参数,并让现有参数保持不变,以便逐步升级

如果可能的话,完全升级以消除枚举会更好,但这取决于可用的资源

问:有没有更好的解决方案来处理Java中的这么多参数?在这个用例中,枚举可能不是一个好的选择

是的,去掉
enum
并使用常规类

类参数{ 字符串名; 字符串值; }

或者类似的。您没有说明如何使用enum,但我认为应该使用以下类似的方法:

 Result calculate(List<Parameter> params) {
      ....
 }
结果计算(列出参数){
....
}

这可能是主观的,但一般来说,将数据库复制为枚举是没有意义的

也许最好的做法是用常规类替换新参数,并让现有参数保持不变,以便逐步升级

如果可能的话,完全升级以消除枚举会更好,但这取决于可用的资源

问:有没有更好的解决方案来处理Java中的这么多参数?在这个用例中,枚举可能不是一个好的选择

是的,去掉
enum
并使用常规类

类参数{ 字符串名; 字符串值; }

或者类似的。您没有说明如何使用enum,但我认为应该使用以下类似的方法:

 Result calculate(List<Parameter> params) {
      ....
 }
结果计算(列出参数){
....
}

非常感谢您的解释。数据库和代码之间的耦合非常有意义:)非常感谢您的解释。数据库和代码之间的耦合意义重大:)