使用和坚持枚举的最佳实践

使用和坚持枚举的最佳实践

本文介绍了使用和坚持枚举的最佳实践的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我见过几个问题/这里讨论有关的最佳方式来处理和坚持枚举类值(例如的,),我想问一下,一般consenus是

I've seen several questions/discussions here about the best way to handle and persist enum-like values (e.g. Persisting data suited for enums , How to persist an enum using NHibernate ), and I'd like to ask what the general consenus is.

在特定的:


  • 如何应将这些值在代码来处理?

  • 应如何被保存到数据库中(文本/为数字)? ?

  • 什么是不同的解决方案的折衷

注:我感动最初的解释中包含这个问题的答案。

推荐答案

我试着总结一下我的理解。随意,如果您有任何修改编辑。所以这里有云:

在代码

在代码,枚举应该使用了语言的本地枚举类型(至少在Java和C#),或者使用类似的的。使用普通的常量(整数或类似)是气馁,因为你失去的类型安全(并使其很难理解它的值是例如,一个方法法定输入)。

In the code, enums should be handled using either the language's native enum type (at least in Java and C#), or using something like the "typesafe enum pattern". Using plain constants (Integer or similar) is discouraged, as you lose type safety (and make it hard to understand which values are legal input for e.g. a method).

这两者之间的选择,取决于有多少附加功能被附加到枚举:

The choice between these two depends on how much additional functionality is to be attached to the enum:


  • 如果你想要把功能加载到枚举(这是很好的,因为你避免开关()ING在这一切的时候),一个班通常是比较合适的。

  • 在另一方面,对于简单枚举样的价值观,该语言的枚举通常是清晰的。

在特别,至少在Java中的枚举不能从另一个类继承,所以如果你有几个用类似的行为枚举你想它投入一个超类,您不能使用Java的枚举。

In particular, at least in Java an enum cannot inherit from another class, so if you have several enums with similar behavior which you'd like to put into a superclass, you cannot use Java's enums.

坚持枚举

要坚持枚举,每个枚举值应该被分配一个唯一的ID。这可以是一个整数,或短字符串。短字符串是首选,因为它可以记忆(更容易为数据库管理员等,以了解在数据库中的原始数据)。

To persist enums, each enum value should be assigned a unique ID. This can be either an integer, or a short string. A short string is preferred, since it can be mnemonic (makes it easier for DBAs etc. to understand the raw data in the db).


  • 在软件,每个枚举应该再有映射函数来枚举(该软件内部使用)之间的转换和ID值(持久化)。一些框架(例如(N)休眠)有自动做这个有限suppport。否则,你必须把它变成枚举类型/类。

  • 数据库(理想情况下)包含一个表中的每个枚举上市的法律价值。一列将是编号(见上文),这是在PK。其他列可能会做出如感的描述。然后,将包含来自枚举值表中的所有列可以使用这个枚举表作为FK。这保证了不正确枚举值永远不会被持久化,并允许DB为站在自己。

一个这样的问题的做法是,合法枚举值的列表中在两个地方(代码和数据库)是否存在。这是难以避免的,因此通常被认为是可以接受的,但有两个选择:

One problem with this approach is that the list of legal enum values exists in two places (code and database). This is hard to avoid and therefore often considered acceptable, but there are two alternatives:


  • 只保留在DB值列表,产生在构建时枚举类型。优雅,但意味着一个数据库连接需要构建运行,这似乎是有问题的。

  • 定义的代码值的列表是权威。针对检查在运行时(通常在启动时)在DB值,抱怨/放弃的不匹配。

这篇关于使用和坚持枚举的最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 10:00