【发布时间】:2012-07-17 15:57:03
【问题描述】:
这是一个很简单的问题,我还是很不安:
为什么现在广泛接受一个类通过访问器方法返回对其私有成员的引用?这不是完全破坏了封装原则吗?如果可以,那为什么不把会员公开!?
public class EncapsulationViolator
{
private object abuseMe;
public object AbuseMe
{
get { return abuseMe; }
}
}
编辑我考虑的情况是这样的
EncapsulationViolator ev = new EncapsulationViolator();
object o = ev.AbuseMe;
o.SetValue(newValue);
现在 ev 的状态通过传递性发生了变化,因为它的成员 abuseMe 的状态发生了变化。
在 DDD 的上下文中,如果对象是聚合根,则这是不行的。我引用
只允许外部对象保存对根的引用。短暂的 可以传递对内部成员的引用以供在 仅限单次操作。因为root控制访问,所以不能 内部结构的变化让我们措手不及。
[Domain-Driven Design,埃里克·埃文斯]
... setters schmetters ...
【问题讨论】:
-
没有二传手,所以没有太多滥用的余地
-
有时人们使用这种方法在
return被解雇之前做一些事情,这基本上是一个公共领域,但人们需要在设置/获取之前做一些事情。此外,getter 和 setter 在 java 中也被广泛使用。 -
布拉德:我的观点完全正确。一旦调用者在调用 AbuseMe 后获得了引用,他们现在就可以更改 abuseMe 了,对吧?
-
@ForteL.,他们可以改变被引用对象的属性。
-
@ForteL.: 如果 prop 返回一个实现 IDisposable 的对象,您可以销毁该对象。
标签: c# oop encapsulation solid-principles design-principles