避免访问条件编程的静态表数据的冗余

时间:2011-09-18 18:45:51

标签: java database enums constants

我有以下情况。我的应用程序与包含一些静态表的数据库进行交互。如果我必须在代码级别中使用主要用于条件代码的静态信息,那么最好的方法是什么。

例如:我有一个学生数据库,其中包含一个静态表student_type(表示勤奋,智能,懒惰等类型)。在代码中,我需要根据student_type采取行动。

所以,我的代码看起来像这样

studentTypeId = student.getTypeId(); // student constructed from database
switch (studentTypeId)
{
    case HARDWORKING_ID :
       // do something
    case LAZY_ID :
       // do something
    break;
}

好吧,在我的代码中,我会使用常量或枚举来存储类型ID。但是,在代码中不是这种复制的东西,因为我已经在数据库中有类型ID。如果数据库中的类型ID发生了变化,我将不得不在我的枚举中更改相同内容,从而增加维护。有没有更好的方法来实现这一目标?

感谢。

3 个答案:

答案 0 :(得分:2)

要问的问题是:在数据库中添加行是否意味着您的java发生了变化?如果是,请选择enum方法,不要担心重复。如果你不得不改变代码,例如,为你的交换机添加新的案例,那么我通常会发现保持简单是一个好主意。

studentTypeId = student.getTypeId(); // student constructed from database
switch (studentTypeId)
{
    case HARDWORKING_ID :
       // do something
    case LAZY_ID :
       // do something
    case SMART_ID :     // added smart student, very rare corner case :-)
       // do something
    break;
}

通常在您存储这样的静态数据的情况下,您有其他数据限制,当您更改数据库中的数据时,您必须更改使用该数据的代码。

如果你真的想减少重复,那么你可以选择Dave Newton建议的完全可插拔架构。这可以实现为id - >每个id的类名称关系。然后,您将实例化该类,并且与该每个id相关联的所有逻辑都将包含在该类中。这并不总是容易或可能的。对于你的例子,它很可能,但除非做得好,否则这可能很复杂。

此外,它并不能解决您的所有问题。您仍然需要开发java,测试它,并重新部署新类。实际上,您节省的工作量可能很小。

接受少量复制通常更容易,只需使用简单的解决方案。

答案 1 :(得分:1)

如果student_type表中仅包含 某些ID,可能还有一些描述性文本,但在此小例子中不再包含

   ID    description
    1    'Hard worker'
    2    'Lazy snob'

那么你唯一的机会就是在你的代码中使用ID,或者使用enum或某些常量接口为它们提供正确的名称。对于需要更改行为的`student_type'的每一项更改都需要更改代码。没有出路,因为行为正式化和定义的唯一地方是在您的代码中。

IF 但该表格正式化内容,如此

   ID    description    min_    max_   min_  max_  fire_   give_
                      points  points  grade grade  ASAP    kudos
    1    'Hard worker'   100     200      B     A     F        T
    2    'Lazy snob'       0      50      Z     Q     T        F
    3    'Medium'         50     100      P     C     F        F

然后,您的应用的行为不是由ID驱动,而是由相关数据驱动 - 数据形成一个简单的规则系统。在这种情况下,您的代码中不需要任何常量,因为您将实现如下规则系统:

    StudentType studentType = student.getStudentType();
    if( studentType.isGiveKudos() )
        doGiveKudos(student);
    if( studentType.isFireAsap() )
        doFire(student);
    // next student...

如果必须具备灵活性,这是要走的路。

刮刮头现在我不知道这是否偏离了这个问题。

答案 2 :(得分:0)

有很多方法可以实现。对于快速/脏东西,我经常将实现的类名存储在DB中,并在运行时进行实例化。有时候我会在数据库中保留一个Groovy实现。有时我会使用工厂存储在DB中的Spring bean。一切都取决于。