2011-09-18 57 views
1

我遇到以下情况。我的应用程序与包含一些静态表的数据库进行交互。如果我必须将代码级别的静态信息主要用于条件代码,那么最佳方法是什么?为条件编程访问静态表数据时避免冗余

例如:我有一个学生数据库,其中包含一个静态表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发生更改,我将不得不在我的Enum中更改相同的值,从而增加维护。有没有更好的方法来实现这一目标?

谢谢。

回答

2

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

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,测试它,然后重新部署新的类。所以实际上,您要节省的工作量可能会很小。

接受少量重复往往更容易,只需简单的解决方案即可。

0

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

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... 

这是去,如果灵活性是必须的途径。

划痕头现在我不知道这是否偏离了很大的问题。