【问题标题】:OOP Design: Where to put object specific "compare" method?OOP 设计:将对象特定的“比较”方法放在哪里?
【发布时间】:2011-05-03 15:54:40
【问题描述】:

我有一些来自存储在测试集合对象中的一系列测试运行的测量对象实例。我还有一些逻辑可以比较两个测试结果对象实例并告诉我它们是否“足够接近”。

这个逻辑应该放在哪里?

  1. 将对象作为方法?喜欢:instance.approximately_equal(other)
  2. 将对象的类作为类/静态方法? class.approximately_equal(a,b)
  3. 将集合对象作为方法? collection.approximately_equal(a,b)

什么是正确的面向对象设计?

(我问,虽然 #1 似乎是正确的解决方案,但我永远不会问某个实例是否近似等于另一个实例。只有当“某些对象组”彼此相等时。它得到了我在想……)

谢谢

【问题讨论】:

  • approximately_equal 可能是一个比 compare 更好的名字。

标签: oop class-design static-methods ooad class-method


【解决方案1】:

我读过的面向对象设计书籍建议将跨类功能放入服务提供者对象中。这将解耦这两个对象并降低复杂性,但如果您的项目很小,则可能会有点过分。

【讨论】:

  • 跨班?所有记录都是同一类。
  • DistanceConverter/DistanceComparer 和 WeightConverter/WeightComparer 之类的东西,其中包含转换/比较不同类型对象的方法。
  • 啊哈……我明白了。但就我而言,我只有一种测量记录对象。只是一大堆实例。 (坦率地说,我什至可以让它们成为结构类型的东西……但它们是对象。)
  • 如果“足够接近”的问题回答了类本身所关心的问题,那么它应该是一个实例方法(例如,hitbox 对象上的“足够接近”函数是有意义的)。如果比较与集合相关(例如包含一组通用点的空间分析器对象),则比较应与集合相关联。如果比较与任何现有对象的分离关注点无关,则将其添加到为此目的明确创建的服务提供者对象。
【解决方案2】:

我会使用选项 1(实例方法),因为这使您能够优化派生类中的比较逻辑(如果需要)。

【讨论】:

  • 我会走这条路线来实现 IComparable。 IComparable 的问题在于,您将来可能还希望支持执行精确比较。
  • 对,IComparable 肯定不是我想要的。我也需要精确的平等测试。为此,我将使用 IComparable。
【解决方案3】:

我发现#3 是最不显眼的并且导致代码不那么臃肿,因为它往往会迫使您使这些方法尽可能灵活/可重用。例如,在 C++ 中,您可能只使用运算符重载来处理它;如果您有一个实用程序类(或者,如果您计划扩展本机数据类型),最终效果是相同的,只是呈现方式不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多