代码之家  ›  专栏  ›  技术社区  ›  Chris Ammerman

在没有单一权威集合可供参考的情况下,跟踪一组对象大小的优雅方法是什么?

  •  1
  • Chris Ammerman  · 技术社区  · 17 年前

    更新:请在设计原则、优雅、意向表达的背景下阅读这个问题,尤其是通过设计选择发送给其他程序员的“信号”。

    我有两个对象集的“视图”。一种是用字符串值对对象进行字典/映射索引。另一种是用序数(排序整数)对对象进行字典/映射索引。没有对象本身的“主”集合可以作为对象数量的权威源,但这两个字典应该始终都包含对所有对象的引用。

    当向集合中添加新项时,将向两个字典中添加引用,然后需要进行一些处理,这会受到新对象总数的影响。

    对于对象集的当前大小,我应该使用什么作为引用的权威源?我所有的选择似乎都在某个维度上有缺陷。我可以一直引用其中一个词典,但这将编纂出该词典优于另一个词典的含义。我可以添加第三个集合,一个简单的对象列表作为权威列表,但这会增加冗余度。存储运行计数看起来很简单,但也增加了冗余,而且比动态引用集合的自跟踪计数更脆弱。

    有没有另一种选择可以让我避免选择不那么邪恶的,或者我必须接受优雅的妥协?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Steve Duitsman    17 年前

    我将创建一个具有(至少)两个集合的类。

    • 集合的版本 按字符串排序
    • 一个版本的 按序数排序的集合
    • (可选)主集合

    该类将处理基本的粗糙管理:

    • 集合内容的同步
    • 标准收集操作(例如允许用户获取大小、添加或检索项)
    • 允许用户按字符串或序号获取

    这样,您就可以在任何需要行为的地方使用相同的集合,但仍然可以抽象出要使用的“索引”行为。

    单独的类为您提供了一个接口,用来解释您对如何使用这个类的意图。

        2
  •  3
  •   Ken Gentle    17 年前

    我建议封装:创建一个隐藏“管理”详细信息(如当前计数)的类,并使用它公开两个集合的不可变“视图”。

    客户机将要求“manglement”对象对其中一个集合进行适当的引用。

    向集合中添加“term”(因为缺少更好的单词)的客户机将通过“manglement”对象进行添加。

    这样,您的假设和实现选择对服务的客户机是“隐藏的”,您可以记录为大小/计数选择的集合是任意的。未来的维护人员可以在不破坏客户机的情况下更改计数的管理方式。

    顺便说一句,是的,我的意思是“乱七八糟”——我最喜欢的管理不善(在任何情况下!)

        3
  •  0
  •   Mark Ransom    17 年前

    如果两个字典都包含对每个对象的引用,那么两个字典的计数应该相同,对吗?如果是这样,只需选择一个并保持一致。

        4
  •  0
  •   Tim    17 年前

    我觉得没什么大不了的。每次都按相同的顺序引用集合 你需要接触他们。

    如果你真的关心它,你可以用一个公开公共接口的包装器来封装集合,比如

    • 添加(项)
    • 计数()

    这样,它将始终保持一致性和原子性——或者至少您可以通过这种方式实现它。

    但是,我不认为这有什么大不了的。