web-dev-qa-db-ja.com

「アクセサメソッド」の定義は何ですか?

私は「アクセサ」という言葉の使い方について議論してきました(コンテキストはJavaプログラミングです)。アクセサは暗黙的に「プロパティアクセサ」であると考えがちです-つまり、という用語は、オブジェクトの内部状態への直接アクセスを提供することは多かれ少なかれそこにあることを意味します。相手は、オブジェクトの状態に何らかの方法でアクセスするメソッドはすべてアクセサーであると主張します。

私はあなたたちが私のために議論に勝つことができないことを知っていますが、あなたがどのようにこの用語を定義するのか知りたいです。 :)

15
Rytmis

アクセサについては、ゲッターとセッターについて考える傾向があります。

オブジェクトの内部状態を操作するすべてのメソッドがアクセサーであることを主張すると、オブジェクトの状態を実際に使用するインスタンスメソッドはアクセサーになり、正しくないように見えます。オブジェクトの状態を使用しないのはどのようなインスタンスメソッドですか?つまり、オブジェクトの状態を何らかの方法で使用しないインスタンスメソッドは、最初はインスタンスメソッドではなく、クラスメソッドである必要があります

たとえば、 BigDecimal.add メソッドはアクセサと見なされますか?これは、addメソッドが呼び出されたインスタンスの値を読み取り、別のBigIntegerの値を追加した後に結果を返すメソッドです。 addインスタンスメソッドがゲッターでもセッターでもないことは、かなり簡単に思えます。

16
coobird

アクセサメソッドは、缶に書かれていることを正確に実行します。副作用なしで型から一部の状態にアクセスします(遅延インスタンス化は別として、呼び出し側が通常知っていることではありません)。

private int _age;

public int getAge()
{
    return _age;
}

状態を変更するメソッドは、ミューテーターとしてより便利に(私の意見では)考えられています。

9
Drew Noakes

グーグルとウィキペディアの他に、 Java言語仕様 は、これをアクセサーメソッドの例として示しています。

private static int N;
public static int getN() { return N; }

つまり、はい、フィールドの値を取得するだけです。コンパイラーはこれをインライン化して、単純な読み取りに変換する可能性があるため、それ以上のものはおそらくアクセサーではありません。

3
John Ellinwood

アクセサメソッド: getRed、getGreen、およびgetBlue

これらのメソッドは通常、値にアクセスします。

ミューテーターメソッド: setRed、setGreen、setBlue

ミューテーターは値を変更します

私はいつも最初の定義で行ってきました。したがって、一般的にはゲッターとセッターにのみ適用されます。 2番目の方法を使用する場合、ほとんどすべての方法をカバーしているため、それほど有用な区別ではありません。

1
Don Branson

アクセサメソッドは、オブジェクトのフィールドにアクセスするために使用されます。したがって、ゲッターとセッターはどちらもアクセサーメソッドです。 オブザーバーメソッドは、外部から観察可能な副作用を引き起こすことなく、オブジェクトについてより一般的な観察を行うメソッドの正しい用語です。副作用を引き起こすことを主な目的とするメソッドはミューテーターメソッドです。したがって、セッターはミューテーターメソッドのです。パブリックセッタは、クラスがデータに不変条件を適用することを不可能にするため、優れたエンジニアリング手法としては避けるべきです。クラスが通常適用すべき抽象化の障壁に違反します。

1
andru

技術的な会話でゲッターとセッターを区別できるのは良いことです。 Accessorメソッドはmodifierメソッドのパートナーです。 Accessorsはオブジェクトの状態を読み取り(getA())、modifiersは状態を書き込みます(setA(Object))。

0
akf

オブジェクトの内部へのアクセス(「読み取りアクセス」または「書き込みアクセス」)を提供するメソッドは、「アクセサメソッド」です。

ここの著者は確かにこの方法でそれを使用します:

  1. http://www.javaworld.com/article/2073723/core-Java/why-getter-and-setter-methods-are-evil.html

  2. http://c2.com/cgi/wiki?AccessorsAreEvil

この用語は、Common LISP(すべてではないですか?).

0
Happyblue