Enums 编码系统值的最佳实践

Enums 编码系统值的最佳实践,enums,domain-driven-design,database-schema,Enums,Domain Driven Design,Database Schema,我认为这应该是一个简单的问题,但还没有找到任何明确的答案,最好的做法是什么 在应用程序中,我们保持订单的当前状态为打开、取消、已发货、已关闭。。。。 如果不更改代码,此变量将无法更改,但应用程序应满足以下条件: 状态名称应易于以不同的语言显示, 应用程序可以通过自由文本状态名称进行搜索,比如谷歌搜索open 开发人员应通过enum获得状态标识 添加新状态时无需头痛 到目前为止,我们解决这一问题的可能方法: 具有具有PKid、语言id和表示应用程序中此状态的单独枚举的DB表状态。 优点:1,2,3

我认为这应该是一个简单的问题,但还没有找到任何明确的答案,最好的做法是什么

在应用程序中,我们保持订单的当前状态为打开、取消、已发货、已关闭。。。。 如果不更改代码,此变量将无法更改,但应用程序应满足以下条件:

状态名称应易于以不同的语言显示, 应用程序可以通过自由文本状态名称进行搜索,比如谷歌搜索open 开发人员应通过enum获得状态标识 添加新状态时无需头痛 到目前为止,我们解决这一问题的可能方法:

具有具有PKid、语言id和表示应用程序中此状态的单独枚举的DB表状态。 优点:1,2,3。开箱即用,缺点:4。需要在每个客户端安装上运行更新脚本,当处理大量代码表时,SQL选择可能会变得庞大而繁琐 刚刚列举: 优点:3,4。缺点:1,2。这完全是一场噩梦 具有枚举,用于在应用程序每次启动时填充数据库表: 优点:1,2,3,4。工作缺点:在处理大量代码表时,应用程序启动时的一些开销、SQLSelect可能会变得庞大而麻烦。
解决这个问题最常用的方法是什么?

我会使用方法3,因为它是最好的方法。您可以使用资源文件在中存储转换,并将枚举值映射到资源文件中的键。您的数据库可以包含状态的枚举id。

听起来您自己对它进行了很好的总结,并将优缺点与3进行了比较。但在实施3时,只需一条注释:


使用缓存机制,甚至是一个简单的HashMap!再加上添加刷新缓存的选项,当您想要更改值而无需每次重新启动时,将简化您的工作

1.状态名称应易于以不同语言显示, 2.应用程序可以通过自由文本状态名称进行搜索,比如谷歌搜索open

这些是接口层所关心的,您最好不要在域模型中混用它们

我会在状态枚举和i18n代码之间设置一个映射。映射可以存储在缓存在内存中的文件中,也可以硬编码

例如:如果使用dto或view adatper呈现ui

public class OrderDetailViewAdapter {
     private Order order;

     public String getStatus() {
         return i18nMapper.to(order.getStatus());//use hardcoded switch case or file impl
     }
}
也可以在填充DTO之前执行此操作

对于目标2,您可以使用类似的解决方案。当用户键入文本时,从映射中查找相应的枚举并使用枚举进行搜索


无论如何,使用db表越少越好。

就我个人而言,我总是在域内使用专用的枚举类。此类的唯一责任是保持状态名称为“打开”、“已取消”、“已装运”。。。。状态名称在代码库外部不可见。此外,状态也可以作为字符串varchar或类似形式存储在数据库字段中

出于呈现的目的,根据用例的数量,有时我在格式化程序中实现格式化,例如OrderFormatter::formatStatusName、OrderFormatter::FormatAbstratedStatusName等。。。。如果经常需要格式化,我会创建一个带有所有格式化样式的专用类OrderStatusFormatter::short,OrderStatusFormatter::abbriviated。。。。当然,将状态名称映射到状态标题需要内部映射,这是一个棘手的部分。但是如果你想要分层,你不能避免映射

到目前为止还没有涉及翻译。我在模板中翻译字符串,这样格式化程序就不用承担这个责任了。总结如下:

域内枚举模型 表示层内的格式化程序 模板内翻译
不需要为订单状态转换创建特殊表。更好的选择是实现与业务代码分离的通用翻译机制。

搜索全文会出现一个小问题,用户搜索open john deer,然后我需要将其重写为open status=1 john deer可能有一个名为open:的合法客户,另一方面,这可能会起作用,但是我的searcher类需要知道它正在搜索的上下文。@zeldi我想需要多语言状态文本搜索,因为它们需要以不同的语言显示?我事先知道该用户将使用哪种语言进行搜索,所以从DB,我可以加入正确的语言。我不确定我是否理解正确,在3中我建议在数据库中有状态文本。我的状态表应该是什么样子?这种方法的唯一问题是全文数据库搜索需求2,如果用户搜索open zevnik,我应该得到客户zevnik的所有未结订单,这是我目前的头痛问题:您可以制作某种读取模型来完成该搜索问题,并定期或基于事件进行更新。此外,您可以使用独立产品进行索引/搜索,如Solr/Lucene、ElasticSearch……我想您是对的,现在我需要做的就是实现它: