我有以下情况。我的应用程序与包含一些静态表的数据库进行交互。如果我必须在代码级别中使用主要用于条件代码的静态信息,那么最好的方法是什么。
例如:我有一个学生数据库,其中包含一个静态表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发生了变化,我将不得不在我的枚举中更改相同内容,从而增加维护。有没有更好的方法来实现这一目标?
感谢。
答案 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。一切都取决于。