如何简化导致链接方法调用的层次类结构?

Posted

技术标签:

【中文标题】如何简化导致链接方法调用的层次类结构?【英文标题】:How can I simplify hierarchical class structure resulting in chained method calls? 【发布时间】:2010-09-29 00:20:09 【问题描述】:

在我正在处理的问题中,我有以下类层次结构。

DiscountEvent
  DiscountGroup
    ProductFamily
      Product

其中每个类都包含下一个类的集合(例如,DiscountEvent 包含 DiscountGroups 的集合等)

这种有点深的层次结构会导致来自更高模块的许多链式调用。 例如,在将产品数据从数据库读取到此类层次结构中时,我有调用链和类似的AddProduct 方法。

class DiscountEvent
  Dictionary<int, DiscountGroup> DiscountGroups;
  public void AddProduct(ProductInfo info)
    DiscountGroups[info.groupId].AddProduct(info);
  
  ...

class DiscountGroup
  Dictionary<int, productFamily> productFamilies;
  public void AddProduct(ProductInfo info)
    productFamilies[info.familyId].AddProduct(info);
  
  ...

...

类似的添加方法一直到叶类。你能想出什么办法来简化这种分层的类结构吗?

【问题讨论】:

这不是类层次结构,因为它们不相互继承。这只是一个有点复杂的数据结构。 @sje397:嗯,有很多种层次结构。 :-) 您有专业化层次结构(您所指的那些),但也有分子层次结构(问题所指的那些)。所以我认为那里没有问题。 @CesarGon:OOP 术语中的“类层次结构”是指类之间的继承关系。如果您要使用来自 mereology 的术语,那么我们甚至不是在谈论同一种“类”。 @sje397:很抱歉不同意; 15 年来,我一直在专业撰写有关软件工程的文章,并使用“层次结构”来指代分子层次结构。我的大多数同事都同意。也许我们需要承认软件中不同的子社区对该词的使用不同;我们不要教条。 @CesarGon:关于教条的观点很公平——我也很讨厌。但这种用法令人困惑。是的,“层次结构”可以指很多东西,但我特别指的是在问题中使用“阶级层次结构”一词。在我多年阅读和研究软件工程的过程中,我从未见过上述被称为“类层次结构”的数据结构,在我的理解中这是完全不正确的。 【参考方案1】:

最现代的ORM 可以为您解决这个问题。

您实际上无法简化您的“层次结构”,因为它基于现实生活中的抽象,但您可以简化您的生活,消除手工儿童的数量。

在这种情况下,您仍然需要所有子集合(因为这是您的域逻辑或数据访问层的一部分),但所有这些复杂性(填充它们)将被 ORB 实现隐藏。

【讨论】:

【参考方案2】:

一个想法是使用Serializer Pattern 的一种形式...因为您正在从数据库中“反序列化”。

也就是说,您可能有一个 DiscountEventReader 类,您可以将数据库连接传递到其中 - 它可能会调用其他读取器类来创建包含的对象实例。

这样做的好处是,例如,ProductFamilyReader 可以读取(并可能缓存)多个数据库行,将多个 Product 实例添加到父容器,而无需遍历每个新对象的“addProduct”调用的整个层次结构。

【讨论】:

以上是关于如何简化导致链接方法调用的层次类结构?的主要内容,如果未能解决你的问题,请参考以下文章

使用重载方法等待

调用具有多个子视图层次结构的协议方法

调用层次结构和查找引用eclipse有什么区别?

外观模式

在 Eclipse 中显示 JSF EL 调用层次结构

递归调用太深,可能导致栈溢出