【问题标题】:Accessing parent elements in an object model efficiently有效地访问对象模型中的父元素
【发布时间】:2010-09-23 07:31:39
【问题描述】:

我有以下对象模型:

- 书 - 第1章 --- 第 1 页 ---- 图 1 ---- 图 2 - - 文本1 - - 第2页 ...

资源位于页面级别。但是,我需要从资源的角度了解资源的完整路径。

一种方法是让资源了解他们的父母。

所以我的 Image 对象可以有一个“parentPage”属性,而后者又可以有一个“parentChapter”属性。这样,我可以通过 currentImage.parentPage.parentChapter 访问完整的路径。有没有更好的办法?

关于为什么我需要从资源的角度了解完整路径的几句话。我有一个可以在屏幕上行走和渲染的对象模型。渲染器从章节级别一直下降到元素/资源级别(这是渲染发生的地方)。但是要显示资源,我需要知道它们的位置(即磁盘上的实际路径),并且这些信息通常在章节级别指定。

谢谢!

-- 编辑-- 只是为了澄清一下,这种 parent.parent 方法是最好的吗?它迫使子对象了解父母,这让我感到不舒服。耦合?

【问题讨论】:

    标签: xml language-agnostic design-patterns dom


    【解决方案1】:

    我建议使用树结构,而您的每个类都继承自树节点。

    c#中的示例:

    class TreeNode {
     public TreeNode Parent { get; set; }
     public List<TreeNode> Children { get; set; }
    }
    
    class Book : TreeNode {
     ... book attributes ...
    }
    
    ... other classes ...
    

    其实,如果你担心耦合这个东西就问问自己是好耦合还是坏耦合?如果耦合确实增加了价值,并且有合理的理由这样做,那就去做吧。如果没有,那就是浪费代码。如果您使用的是支持泛型的语言,则可以将其进一步解耦:

    class TreeNode<TParent, TChild>  
    {
        public TParent Parent { get; set; }
        public List<TChild> Children { get; set; }
    }
    
    class Book : TreeNode<object, Chapter> { }
    class Chapter : TreeNode<Book, Page> { }
    class Page : TreeNode<Chapter, object> { }
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      无论您是否使用 Zachary 的树形结构,还是以更特定于类型的方式使用,关于耦合的问题仍然存在。

      如果图像的很多内容与图像在页面中的“托管”方式没有任何关系,您可能希望使用具有上下文相关方面并包含图像实例(参考)。

      只有您可以决定这是否过度,这取决于应用程序以及减少耦合和允许在其他上下文中更多地重用某些成分的重要性。

      【讨论】:

        【解决方案3】:

        听起来您想要doubly-linked list,甚至可能考虑使用tree structure

        【讨论】:

          【解决方案4】:

          您可以将对象序列化为 xml 并使用 linq to xml 来解析信息。

          如果您必须使用对象的实例,另一种选择可能是查看复合模式 (see wikipedia)

          埃里克

          【讨论】:

            猜你喜欢
            • 2017-05-08
            • 1970-01-01
            • 2017-05-06
            • 2020-11-16
            • 1970-01-01
            • 2011-01-23
            • 2018-06-11
            • 2013-06-22
            • 2020-11-26
            相关资源
            最近更新 更多