首先,让我们在范例上弄清楚。
- 数据结构->可以由适当了解知识的功能遍历和操纵的内存布局。
- 对象->一个自包含的模块,它隐藏其实现并提供可以通过其通信的接口。
吸气剂/设定剂在哪里有用?
获取器/设置器在数据结构中有用吗?没有。
数据结构是一个内存布局规范,它是一系列功能所共有和操纵的。
通常,任何旧的新功能都可以出现并操纵数据结构,如果这样做可以使其他功能仍然可以理解它,那么该功能将加入家族。否则,它是流氓功能和错误源。
不要误会我的意思,可能会有多个函数系列在数据结构上交织在一起,到处都有弯刀,反光涂层和双代理。当他们每个人都有自己的数据结构可以使用时很好,但是当他们共享它时...想象一下几个犯罪家庭在政治上意见分歧,那么它很快就会变得一团糟。
鉴于混乱的扩展功能系列可以实现,是否有一种方法可以对数据结构进行编码,以使恶意功能不会将所有事情弄乱?是的,它们被称为对象。
获取器/设置器在对象中有用吗?没有。
将数据结构包装在对象中的全部目的是确保不存在恶意功能。如果该功能想加入这个家族,则必须首先对其进行彻底的审查,然后再成为对象的一部分。
获取器和设置器的目的/目的是允许对象外部的功能直接更改对象的内存布局。这听起来像是在允许流氓的门户开放。
边缘案例
有两种情况使公众获得者/制定者有意义。
- 对象中一部分数据结构由对象管理,但不受对象控制。
- 一个接口,用于描述数据结构的高级抽象,其中某些元素不应控制于实现对象。
容器和容器接口是这两种情况的完美示例。容器内部管理数据结构(链接列表,地图,树),但由特定人员掌控所有特定元素。接口对此进行了抽象,并完全忽略了实现,仅描述了期望。
不幸的是,许多实现都犯了这个错误,并定义了这类对象的接口以提供对实际对象的直接访问。就像是:
interface Container<T>
{
typedef ...T... TRef; //<somehow make TRef to be a reference or pointer to the memory location of T
TRef item(int index);
}
这已破了。Container的实现必须明确将其内部控制权交给使用它们的任何人。我还没有见过这样的可变值语言(从数据损坏的角度来看,具有不变值语义的语言从定义上来说是很好的,但不一定从数据间谍的角度来看)。
您可以通过仅使用复制语义或使用代理来改进/更正获取器/设置器:
interface Proxy<T>
{
operator T(); //<returns a copy
... operator ->(); //<permits a function call to be forwarded to an element
Proxy<T> operator=(T); //< permits the specific element to be replaced/assigned by another T.
}
interface Container<T>
{
Proxy<T> item(int index);
T item(int index); //<When T is a copy of the original value.
void item(int index, T new_value); //<where new_value is used to replace the old value
}
可以说,流氓功能仍然可以在这里发挥混乱的作用(只要有足够的努力,大多数事情都是可能的),但是复制语义和/或代理减少了出现许多错误的机会。
- 溢出
- 下溢
- 与sub元素的交互是类型检查/类型检查(在类型丢失的语言中,这是福音)
- 实际元素可能驻留在内存中,也可能不是。
私人获取者/设定者
这是直接在类型上使用的getter和setter的最后堡垒。实际上,我什至不称这些getter和setter为存取器和操纵器。
在这种情况下,有时总是/几乎总是/一般地操纵数据结构的特定部分需要进行特定的记账。假设更新树的根时,需要清除后备缓存,或者在访问外部数据元素时,需要获取/释放锁。在这些情况下,应用DRY主体并将这些动作组合在一起是有意义的。
在私有上下文中,该家族中的其他功能仍然有可能避开这些“获取和设置”并操纵数据结构。因此,为什么我将它们更多地视为访问者和操纵者。您可以直接访问数据,也可以依靠其他家庭成员来正确处理该部分。
受保护的吸气剂/阻气剂
在受保护的上下文中,它与公共上下文没有很大不同。外国可能的流氓功能想要访问数据结构。所以不,如果它们存在,它们将像公共获取者/制定者一样运作。
this->variable = x + 5
或UpdateStatistics
在setter中调用一个函数,在这种情况下classinstancea->variable = 5
会引起问题。