なぜ Stack.Peek() がメソッドなのか?[閉まっている]
質問
タイトルの通り。なぜそうなるのか スタック クラスには最上位オブジェクトの参照を返すメソッドが必要ですか?私はいつも、メソッドは何らかのコンピューティングが関与していることを示唆しており、代わりに単純なオブジェクトをプロパティとともに返す必要があると言われてきました。 Peek()
このメソッドにはパラメータがなく、コードレベルでは単純な操作であると思います。
質問は:それには具体的な理由があるのでしょうか?パフォーマンスに影響を与える隠れた動作はありますか?
編集: クラスの実装はわかりませんが、f.e.メソッドが下位の列挙子を使用する場合、最後の要素まで何度も繰り返すのは賢明ではありません。逆にシングルの場合は IList
, であれば、パフォーマンスに大きな影響を与えることはありません。
解決
「Peek」は動詞なので、私の本では Peek()
すべき メソッドであること。ただし、別の名前を付けてプロパティにすることもできます。
どのプロパティにも get メソッドや set メソッドが関連付けられているため、最終的にはどちらの方法でもメソッドが得られることに注意してください。
他のヒント
私は質問を「なぜプロパティではなくメソッドなのか」と理解しています。
理由の 1 つは一貫性です。すべてのアクセス メソッドは実際にはメソッドです。純粋なコードの観点から見ると、これをプロパティとして持たない理由はないので、これは完全にスタイルの問題です。
ドキュメントには、スタックを処理するために実際にどのコレクションが使用されるかについては正確には記載されていませんが、基本的に、そのコレクションの「先頭」のみにアクセスできるようにするこれより効率的な方法は他にありません。また、「トップ」が最初の要素なのか最後の要素なのかもわかりません。スタックはどの要素が「トップ」であるかを追跡しており、ポップされたメンバーを実際には削除していない可能性があります(少なくとも毎回ではありません)。ポップされます) 1 つおきの要素を移動する必要を避けるためです (ここでも、リンクされたリストのような構造ではなく配列のような構造を使用していると仮定します)。
値はのプロパティではないので、 Stack
それ自体ですが、スタックの現在の内容を評価した結果であるため、私の意見では、プロパティよりもメソッドの方が適しています。
そしてCとして。Evenhuis は次のように述べています。 彼の答え, ピーク です 動詞, 、したがってメソッドはより論理的です。また、ピークはスタックでのこの操作の一般的な用語であるため、プロパティを使用するためだけに新しい/別の用語を使用するよりも、ピークを使用する方が合理的です。
同意します。次のようなプロパティにすることができます TopItem
それは最初は意味があるからですが、空の場合は例外をスローするか、null を返すのでしょうか?プロパティは例外をスローしてはなりません。 MSDNによると.
から スタックのソースリファレンス, を参照すると、特定の例外をスローするために必要なコードが表示されます。
// 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];
}
これは、上記のプロパティ概念の処理方法とは異なります。つまり、一方と他方の対戦です。
プロパティドキュメントを編集して追加しました。そして、勝利の答えではありませんが、それがプロパティではない理由のロジックについてのさらなる説明を提供します。
これはカプセル化であり、その目的はオブジェクト コンポーネントへのアクセスを制限することです。 http://en.wikipedia.org/wiki/Encapsulation_(オブジェクト指向プログラミング)