如何简化导致链接方法调用的层次类结构?
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”调用的整个层次结构。
【讨论】:
以上是关于如何简化导致链接方法调用的层次类结构?的主要内容,如果未能解决你的问题,请参考以下文章