【问题标题】:Object Architecture Design Question对象架构设计问题
【发布时间】:2010-10-04 22:57:08
【问题描述】:

我正在尝试找出最好的方式来解决这个问题。我将解释我现在所拥有的,但我想知道是否有更好的方法来做到这一点。

我有一个具有基本属性的类 Section:名称、描述等。我使用部分列表供用户选择。他们可以根据需要向 Parent 对象和任意数量的 Section 添加一个 Section。

当他们向父级添加一个 Section 时,他们必须指定它属于哪个组(比如说 group1、group2、group3)以及它将以什么顺序显示。这个 Group 属性不在桌面上,当我列出供用户选择的 Sections 时不需要组,这没有意义。将这部分视为他们添加的具有额外属性的克隆。

我有另一个表,它有一个外键到 Parent 和 Section。许多部分可以添加到 1 个父级。在此链接表上还有他们添加的每个部分的 Grouping 和 DisplayOrder 列(以及其他一些列)。

所以当我创建 Parent 对象并查询其 Sections 的集合时,我是否想尝试使用相同的 Section 类并添加一个 Grouping 属性?

 Section 1
 Section 2
 Section 3


Parent 1
     Section 1 - Group = g1, DisplayOrder = 1
     Section 1 - Group = g2, DisplayOrder = 2
     Section 2 - Group = g2, DisplayOrder = 3
     Section 3 - Group = g3, DisplayOrder = 4

Parent 2
     Section 4 - Group = g3, DisplayOrder = 1
     Section 1 - Group = g2, DisplayOrder = 2
     Section 2 - Group = g3, DisplayOrder = 3

如果您不知道我在说什么,请告诉我,我会尽力解释得更好……或者我会删除它并假装我从未问过。 =P

【问题讨论】:

  • 当您向父级添加一个部分时,您是在添加一个新部分还是对一个可能被多次添加的部分的引用?
  • 我正在添加对已经存在的 Section 的引用,但在该引用中我添加了 Group 和 DisplayOrder 等额外字段
  • 如果是 /same/ 部分,那么您需要一个类来包含该部分以及不会共享的唯一信息。

标签: c# architecture oop object


【解决方案1】:

我会添加 group 属性。空值适用于尚未分配给父级的部分。这类似于 Windows 窗体组件中 Owner 的行为。

【讨论】:

    【解决方案2】:

    我会让 group 成为 Section 的属性。然后,您可以使用 LINQ 在 Parent 上添加 group1、group2 等的属性来查询集合并仅返回每个组中的那些(如果您需要能够这样做)。

    【讨论】:

      【解决方案3】:

      听起来组不是一个部分的固有属性。仅在将部分与父母相关联时才有意义。鉴于此,我不会添加组属性。也许制作一个公开组的部分容器类:

      interface IGroupedSection
      {
          ISection Section { get; }
          string Group { get; }
      }
      

      或将分组作为父级的属性,例如

      interface IParent
      {
           void AddSection(string group, ISection section);
           IEnumerable<ISection> GetSectionsInGroup(string group);
      }
      

      毕竟,您可能需要多个部分分组策略,因此最好不要将您的部分设计与其可以包含的集合类型结合起来。

      【讨论】:

      • 我最终使用了这个解决方案,更具体地说,是“使分组成为父级的属性”。
      【解决方案4】:

      如果可能在对象层次结构中,您希望避免子到父链接。这会导致非常紧密的耦合和尴尬的关系。

      假设我了解您的问题,我将创建一个 Group 对象以插入到父级和部分之间。父母有一个组列表,每个组都有一个部分列表。

      编辑以响应 DisplayOrder:

      显示顺序实际上是父级的属性,而不是部分。父级包含一个部分列表,并且该列表具有与之关联的特定顺序。

      【讨论】:

      • 我喜欢这个解决方案。我将如何处理 DisplayOrder(我更新了上面的内容)。添加的每个部分也有一个 DisplayOrder(它们将显示在屏幕上的顺序)我需要两个链接表吗? Parent > Group > GroupSection > Section with Group section 知道 DisplayOrder?
      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2015-08-29
      • 2011-05-12
      相关资源
      最近更新 更多