【问题标题】:Why is Stack.Peek() a method? [closed]为什么 Stack.Peek() 是一种方法? [关闭]
【发布时间】:2014-03-27 18:53:51
【问题描述】:

如标题所示。为什么Stack 类需要一个方法来返回顶部对象的引用?我一直被告知,方法表明涉及一些计算,并且应该返回简单的对象和属性。 Peek() 方法没有参数,在代码级别上它(我认为)是一个简单的操作。

问题是:这有什么具体原因吗?任何影响性能的隐藏行为?

编辑:我不知道类的实现,但是 f.e.如果该方法在下面使用枚举器,那么多次迭代到最后一个元素将是不明智的。另一方面,如果是单个IList,那么它应该不会对性能产生任何更大的影响。

【问题讨论】:

  • 堆栈是一个奇怪的东西,你可以从里面推送和弹出东西,但不能得到特定的项目。有时您想知道最重要的项目。所以 peek() 被引入。你可以有一个属性 TopItem 等。这是@TomTom 所说的风格问题
  • @DaveShaw:无论如何,当前来源。未来的版本可能会在不更改接口的情况下采用不同的实现。
  • 除了答案所说的动词之外,它更像是保留实际不同数据的属性 - peek 是集合中的计算值 - 最后一项 - 属性也被解包到方法中:a get例如 -er 和 set-er。

标签: c# stack peek


【解决方案1】:

Peek 是一个动词,所以在我的书中Peek() 应该是一个方法。但是,如果名称不同,它也可能是一个属性。

请记住,任何属性都有关联的 get 和/或 set 方法,因此您最终会得到一个方法。

【讨论】:

  • 我很确定问题不是why is the code object named Peek a method?,而是why is peeking at the top element of a stack done using a method?
  • However with a different name it could also be a property. 解决实施的原因
【解决方案2】:

我将这个问题理解为“为什么它是一种方法,而不是一种属性”。

一个原因可能是一致性 - 所有访问方法实际上都是方法。这完全是样式问题,因为从纯代码的角度来看,我认为没有理由不将其作为属性。

【讨论】:

    【解决方案3】:

    文档并没有确切提到实际使用什么集合来处理堆栈,但基本上没有其他更有效的方法可以让您仅访问该集合的“顶部”。我们也不知道“顶部”是否是第一个或最后一个元素,堆栈可能会跟踪哪个元素是“顶部”并且实际上并没有删除弹出的成员(至少不是每次他们被弹出)以避免必须移动所有其他元素(再次假设它们使用类似数组而不是类似链表的结构)。

    【讨论】:

    • 不确定这是否相关。如果Peek() 方法能够获取“顶部”元素,则属性也可以使用完全相同的代码来获取。
    【解决方案4】:

    我想说,由于值不是Stack 本身的属性,而是评估堆栈当前内容的结果,在我看来,方法比属性更合适。

    正如 C. Evenhuis 在his answer 中提到的,Peek 是一个动词,因此方法更符合逻辑。由于 peek 是堆栈上此操作的常用术语,因此使用它比使用新的/不同的术语来使用属性更有意义。

    【讨论】:

      【解决方案5】:

      我同意,可以是 TopItem 之类的属性,因为这具有初始意义,但如果为空,它会抛出异常或返回 null 吗?属性不应该抛出异常,according to MSDN

      Stack's source reference,您将看到引发特定异常的代码。

          // 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];
          }
      

      现在这与上述属性概念的处理方式不同。所以一个对另一个。

      编辑-添加的属性文档。不是成功的答案,而是提供关于为什么它不是属性的逻辑的进一步解释。

      【讨论】:

      • 是的,但是属性能够以上述方法的确切方式起作用。
      • “我同意,可以是 TopItem 之类的属性,但如果为空,它会抛出异常或返回 null 吗?” - 是的,当然会。
      • @O.R.Mapper Yes 不是非此即彼问题的有效答案。我希望属性不会抛出异常,而是返回 null。长期存在的 Stack 功能是个例外。
      • @bland:这是一个“是的”,就像“是的,它会做任何一个。”
      • @O.R.Mapper MSDN 声明属性应该避免抛出异常。我的观点是,作为一个属性,它改变了功能的现状和过去。两者都可以肯定存在,但是如果堆栈为空,它们会导致不同的处理。
      【解决方案6】:

      这是封装,目的是限制对对象组件的访问:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

      【讨论】:

      • 我知道什么是封装。我问为什么它被实现为一个方法而不是一个 getter-only 属性。
      • getter 方法会暴露内部实现细节 - peek 方法只提供高级功能而不暴露任何内部数据结构
      • @light_303 能否请您扩展该评论​​?我不明白你隐瞒内部实现细节是什么意思。
      • 这个答案不正确。属性不会暴露任何被方法隐藏的实现细节(如果只是因为属性本​​质上包含一个或两个(get 和 set)方法)。
      • 编辑后,答案仍然与问题无关。方法和属性都是封装的手段。
      猜你喜欢
      • 2018-06-23
      • 2015-07-08
      • 2021-01-06
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 2020-02-14
      • 2016-12-12
      • 2016-05-17
      相关资源
      最近更新 更多