如标题所示。为什么Stack类需要一个方法来返回顶部对象的引用?我一直被告知,方法表明涉及一些计算,并且应该返回简单的对象和属性。Peek()
方法没有参数,并且在代码级别上它(我认为)是一个简单的操作。
问题是:这有什么具体原因吗?任何影响性能的隐藏行为?
编辑:我不知道类的实现,但是如果方法使用下面的枚举器,那么多次迭代到最后一个元素是不明智的。另一方面,如果它是一个单一的IList
,那么它不应该对性能产生任何更大的影响。
Peek 是一个动词,所以在我的书中Peek()
应该是一个方法。但是,如果名称不同,它也可能是一个属性。
请记住,任何属性都有关联的 get 和/或 set 方法,因此您最终会得到一个方法。
我将这个问题理解为“为什么它是一种方法,而不是一种属性”。
一个原因可能是一致性——所有访问方法实际上都是方法。这完全是样式问题,因为从纯代码的角度来看,我认为没有理由不将其作为属性。
我同意,可以是 Property asTopItem
或其他东西,因为这具有初始意义,但如果为空,它会引发异常或返回 null 吗?根据 MSDN,属性不应引发异常。
从Stack 的源代码参考中,您将看到引发特定异常的代码。
// Returns the top object on the stack without removing it. If the stack
// is empty, Peek throws an InvalidOperationException.
public virtual Object Peek() {
if (_size==0)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_EmptyStack"));
Contract.EndContractBlock();
return _array[_size-1];
}
现在,这与上述属性概念的处理方式不同。所以一个对另一个。
编辑添加的属性文档。而不是获胜的答案,而是提供关于为什么它不是属性的逻辑的进一步解释。
文档没有确切提到实际用于处理堆栈的集合,但基本上没有其他更有效的方法可以让您仅访问该集合的“顶部”。我们也不知道“顶部”是否是第一个或最后一个元素,堆栈可能会跟踪哪个元素是“顶部”并且实际上并没有删除弹出的成员(至少不是每次他们被弹出)以避免必须移动所有其他元素(再次假设它们使用类似数组而不是类似链表的结构)。
我想说,由于值不是其Stack
本身的属性,而是评估堆栈当前内容的结果,我认为方法比属性更合适。
正如 C. Evenhuis 在他的回答中提到的那样,Peek是一个动词,所以一种方法更合乎逻辑。由于 peek 是堆栈上此操作的常用术语,因此使用它更有意义,然后使用新的/不同的术语来使用属性。
这是封装,其目的是限制对对象组件的访问:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)