gpt4 book ai didi

面向对象设计 : where to put responsability?

转载 作者:行者123 更新时间:2023-12-02 05:31:49 25 4
gpt4 key购买 nike

我有一个简单的对象列表。我想为每个对象计算一种哈希值,用于对列表进行排序。

我的问题是:谁负责计算哈希?

1/列表

因为哈希方法是特定于列表的,并且应用于每个对象。对象只是对象,它们不知道排序和散列。

2/每个对象

因为对象是最佳候选者,因为他拥有所有数据来做这件事。这可能是根据其他人无法访问的内部数据计算得出的。

3/另一个挑战者?就像列表和对象之间的 Controller ?

最佳答案

定义所用等价概念的类。

如果一个对象定义了一个通用的相等性概念,那么它应该定义一个与之对应的哈希码,作为该工作的一部分。

毕竟,是那个类“知道”Equals() , isEqual() , areEqual , ==或任何定义。有必要当a == bhash(a) == hash(b) , 所以它是唯一可以这样做的类。

但是,如果另一个类定义了相等的概念,(也许对不同的方式使用不同的概念,其中不同的方式可能认为字符串相等或不相等是一个典型的例子)那么该类必须定义哈希码类似的原因。

.NET 表达了这种责任联系,作为一个例子。在 .NET 中,所有对象都有一个 Equals() .这是否是一件好事值得商榷(有些人更喜欢 C++ 方法,其中一个对象不需要有任何与另一个相等的感觉),但一旦完成,所有对象也有一个 GetHashCode() 确实有意义。 ,因为一个和另一个之间的联系。 .NET 也有 IEqualityComparer<T>IEqualityComparer它定义了类对特定的非内置平等感负责的方法。同样,要对一个人负责就需要对另一个人负责。

现在。哪个更好?

好吧,如果在给定情况下对“等于”的含义有压倒性的明显感觉,它可能应该由类来处理:相同坐标或相同复数的两种表示形式,或者指的是同一个真实世界的对象,在大多数情况下应该被认为是相等的。这样就给出了默认使用。

如果在给定容器类型的上下文中对等号的含义有非常明显的感觉,那么就应该在那里应用。

否则应该有定义它的连接器。因此,我们可以很好地分离关注点。

但是我们可以非常巧妙地将三者联系在一起。我们定义一个默认连接器。它的实现只是传递调用以获取哈希码或测试是否与对象上定义的哈希码相等。

我们定义了任何通用哈希表、哈希集等,以始终使用连接器,并在构造时使用默认值或默认模板参数(如果语言具有允许这样做的通用/模板方法,这例如 C++ 会,而 C# 不会),因此默认情况下我们使用此默认连接器。

在定义依赖于特定概念 View 的特殊用途集合类型时,我们从这些集合之一构建它,覆盖连接器。

这条规则的另一面是,如果您没有为所有等同对象提供哈希码的定义方法(例如,您有一个 == 覆盖机制,但不深入支持 GetHashCode() ),那么您必须使用连接器方法。请注意,虽然 C++ 例如确实有 == ,它没有那种知道如何拥有给定对象的支持。因此,STL 必须有一个 hash_map并且对开箱即用的默认设置的支持非常有限。

关于面向对象设计 : where to put responsability?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com