【问题标题】:How to properly design a class that should contain dual language information如何正确设计一个应该包含双语信息的类
【发布时间】:2011-09-13 10:35:06
【问题描述】:

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

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

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

这似乎是一个简单的问题,但这个决定会对验证、持久性、对象克隆和许多其他事情产生影响。

我可以想到使用新的 dualString 类型的负面:

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

【问题讨论】:

  • 您确定以后不需要添加第三种语言吗?

标签: c# oop domain-driven-design dns class-design


【解决方案1】:

在阅读您的问题时,我一直在考虑 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
{

}

【讨论】:

  • @Haris:我想保留我的域对象 POCO,为什么是继承而不是包含? Plant{public Names Name;}.
  • 好吧,恕我直言,在这种特殊情况下并没有太大的不同......所以你可以做任何你觉得舒服的事情。
  • @Haris Hasan 拥有单独的类而不是 2 个纯字符串属性有什么好处?
  • @qrow 我认为这种结构将更容易融入变化,如果将来某些需求变化比如添加更多语言或一次只显示一种语言(通过本地化)
  • @Haris Hasan 我认为作者明确指出它将只有 2 种语言。他提到了拉丁语,所以他的领域可能是关于医学的(或者他们使用母语+拉丁语的另一个领域)。再说一次,如果我们同意只有两种语言,那么上课有什么好处?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 2016-02-29
      • 2012-04-03
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多