如何正确设计一个应该包含双语信息的类

本文关键字:包含双 信息 一个 何正确 | 更新日期: 2023-09-27 17:59:09

如果我的域对象应该包含两种语言的字符串属性,我应该创建两个单独的属性还是创建一个新的类型BiLingualString?

例如,在植物分类应用程序中,植物域对象可以包含plant.LatName和plant.EngName.

整个域的双语属性数量不多,大约为6-8个,我只需要支持两种语言,信息应该同时以这两种言显示给UI。(所以这不是本地化)。在开发过程中,需求不会发生变化。

这看起来可能是一个简单的问题,但这个决定将对验证、持久性、对象克隆和许多其他事情产生影响。

反面我可以考虑使用新的dualString类型:

  • 验证:如果我要使用DataAnatations、Enterprise Library验证块、Flued验证,这将需要更多的工作,对象图验证比简单的属性验证更难
  • 持久性:NH或EF需要更多复杂属性的工作
  • OOP:更复杂的对象初始化,我必须在构造函数中初始化这个新类型,然后才能使用它
  • 体系结构:转换对象以在层之间传递它们更困难,自动映射工具将需要更多的手工工作

如何正确设计一个应该包含双语信息的类

在阅读您的问题时,我一直在思考why not localization,但在阅读information should be presented to UI in both languages at the same time.时,我认为使用属性是有意义的。

在这种情况下,我会选择一个每种语言都有一个字符串的类,就像你提到的BiLingualString 一样

public class Names
{
    public string EngName {get;set;}
    public string LatName {get;set;}
}

然后我会在我的主要工厂类中使用这个类,就像这个一样

public class Plant: Names
{
}

如果你100%确定它总是只有拉丁语和英语,我会坚持使用最简单的解决方案-2字符串属性。它在UI方面也比BiLingualString更灵活。而且在持久化时,您不必处理复杂类型。

为了帮助做出决定,我建议考虑这种行为在所有层的一致性。例如,如果您将它们公开为业务对象上的两个独立属性,我还希望看到它存储为数据库记录中的两个单独列,而不是存储在单独表中的同一属性的两个转换。以这种方式存储翻译似乎很奇怪,但您的理由听起来很合理,并且6个属性并非不可管理。但要确保你不打算在未来添加更多的语言。

如果你希望这个系统在某种程度上是动态的,因为你可能需要在某个时候添加另一种语言,那么对我来说,以不同的方式实现它似乎更有意义,这样你就不必在需要支持新语言时更改模式。

我想需要平衡的是:考虑必须调整语言或属性以适应新语言的可能性,以及通过将这些语言或属性直接作为单独的属性公开而不是作为单独的级别加载翻译所获得的优势(简单性)。