使用枚举而不是文字来引用表和列的名称是一个好习惯吗?或者它只是矫枉过正?
E.g。
而不是这样做:
executeQuery("SELECT name, age FROM people WHERE id = '23';");
做这样的事情:
executeQuery("SELECT "+COLUMN.NAME.getName()+", "+COLUMN.AGE.getName()+
"FROM "+ TABLE.PEOPLE.getName()+" WHERE "+COLUMN.ID.getName()+" = '23';");
有这个枚举
public Enum COLUMN{
NAME("name"),
AGE("age"),
ID("id");
//...
}
那么当DB的结构还没有真正定义好但是你的承诺开始使用那个尚未定义的DB来开发代码时呢?
答案 0 :(得分:3)
我个人称之为矫枉过正。这就是所谓的“软编码”,当你把它放得太远时,就像硬编码一样糟糕。可能更糟糕的是,因为它的缺点更加微妙 - 对于那些一遍又一遍地听到硬编码的“邪恶”的人来说,这是非常诱人的。
考虑年龄栏名称发生变化时会发生什么。你有一个枚举,其值不再与列的名称相对应(阅读:代码对你说谎),或者你必须通过并改变对COLUMN.AGE
的每个引用来改为使用COLUMN.NEW_NAME_FOR_AGE
(阅读:你没有保存自己以后不得不编辑代码,这可能是你考虑这个问题的最大原因)。如果结构发生变化,那甚至都不会发生。如果列移动到另一个表或其他内容,则您的枚举根本无法正常处理。
如果您真的对DB没有任何控制权,或者使用存储过程并让DB处理列名的详细信息,那么您应该将列的名称作为类的私有静态成员。 / p>
哦,并与任何要求您针对尚未设计的数据库进行编码的人进行讨论。你至少可以把一些事情搞得一团糟。如果没有,那么一定要去存储的proc路由,让他们担心在事情发生变化时正确地获取列名。
答案 1 :(得分:0)
请改用存储过程。让数据库担心所有的SQL,并让你的代码担心它将如何处理数据。
我通常的方法是让一个专门用于与数据库交互的类(通常是静态的)。每个存储过程在类中都有自己的静态方法。
答案 2 :(得分:0)
在这里使用枚举是一种巨大的过度杀伤,它会使你的代码更难以读写。
如果您担心有太多代码直接与数据库进行交互(如果您不是,那么您可能应该这样做),更好的方法是使用ORM。
答案 3 :(得分:0)
根据我对我编写的应用程序(web-apps)的经验,我不会这样做。这是判断决定。
作为旁注,您不必使用枚举。你可以使用你想要的任何常数。
答案 4 :(得分:0)
YES枚举可以是组织表格和快速枚举列名称的好方法。例如在cassandra我做:
public class EventSchema
{
public static enum EVENTS {
TYPE_ID("type_id"),
SLICE_START_TIME("slice_start_time"),
EVENT_TIME("event_time"),
EVENT_ID("event_id"),
EVENT_PAYLOAD("event_payload");
public final static String TABLE_NAME = "events";
public final String COLUMN_NAME;
EVENTS (String name) {COLUMN_NAME = name;}
public String toString () {return COLUMN_NAME;}
public static String[] names () {
return Arrays.toString(values()).replaceAll("\\[|]", "").split(", ");
}
}
public void addEvent (String keyspace, String typeId, long timeSliceStart, long timeSliceDuration, Event event) {
Object[] values = {typeId, timeSliceStart, event.getTime(), event.getId(), event.getDetails()};
Statement stmt = QueryBuilder.insertInto(EVENTS.TABLE_NAME).values(EVENTS.names(), values);
getSession(keyspace).execute(stmt);
}
}