在我们的应用程序中,我们使用enum作为类型来定义特定的Office活动涉及什么官员,例如:在安全活动中,所涉及的角色可以是安全官员、安全控制干事、安全管理人员等。
此详细信息是完全可配置的,因此我们可以在系统中通过UI向活动添加另一个正式角色,只需将特定的位添加到bitwrise值中,此值存储在活动表的字段中,所有类型都存储在sql表中;此字段用于某些存储的过程,一些商业智能是基于此字段的。
[Flags]
public enum eFatEnumBW : long
{
None = 0,
SecurityOfficer = 1L << 0,
SecurityAssistant = 1L << 1,
//...some referee of every type you can immagine
LastAssistantAtTheMoment = 1L << 63,
//...
}现在,我们的胖bitwise enum已经完全饱和,我们的客户最近被要求添加新类型的官方角色来管理新的活动。
我知道,这不是管理这种情况的最佳方法,这一选择是从8年开始的,没有问题,没有人能想象事情会如何发展,现在我们正在等待完全重写我们的应用程序,但与此同时,我们必须继续保持旧的应用程序没有什么变化。
我认为我们可以在此基础上维护旧的解决方案,只需在代码中更改long中的ulong,并在SQL-side上使用numeric(20,0),这将给我们很大的空间。
在我的结论中有一些东西我遗漏了,这会导致解决方案的不适用性?
谢谢你的建议
发布于 2014-06-22 10:57:56
我不认为从long到ulong有什么帮助。这两种类型都有相同的位数,而且您已经用完了所有这些位数。充其量,你会得到符号位,但这不是长期的解决方案。
一个可能的解决方案是引入两个新的数据库表:
RefereeTypes (每个enum值都有一个条目);FooReferees (一个n:n关联表,它将每个业务实体链接到一个或多个RefereeTypes。在您的代码中,而不是业务实体上的enum属性,您将拥有RefereeType的集合.这可能意味着相当的改写。
发布于 2014-06-22 10:55:51
我不认为你错过了什么。事实上,目前您没有使用long的全部大小,因为您没有使用低于0的范围。
不使用ulong,您可以选择继续使用long,但开始使用负值。
但正如在评论中所述,这只会得到一点好处,所以并不是真正有助于长远发展的事情。
https://stackoverflow.com/questions/24350504
复制相似问题