nDiki : アクセサ

アクセサ - accessor

オブジェクトのプロパティを取得・設定するメソッドのこと。 取得するメソッドを getter と呼び、設定するメソッドを setter と呼ぶ。

Perl

Perl では setter と getter を1つのメソッドとして定義し、引数の有無で処理をわけるということがよく行われる。

Perl ベストプラクティスでは getter と setter を分けてそれぞれ get_foo、set_foo というメソッド名にすることを勧めている。

C++

Google C++ スタイルガイド

getter を accessor と呼び foo_ というプライベートメンバ変数に対して、 foo() という命名し、また setter を mutator と読んで set_foo() と命名している。

C#

C# でプロパティの getter と setter を定義する構文が用意されている。 setter を定義すると obj.foo = "abc" のように代入演算子の左オペランドにあらわれることができる。

Java

Java では getFoo、setFoo という名前で getter と setter を定義することが多い。

スポンサード リンク

2009年8月20日 (木)

アクセサは foo と set_foo にしたい

オブジェクト指向プログラミングではほとんどの場合に必要となるアクセサについては命名規則にいくつかのパターンがある。

  1. 属性名に対して getter に get (get_)、setter に set (set_) をプレフィックスとしてつける。
  2. getter も setter も同じ名前とし属性名にする。
  3. setter のみ set (set_) を属性名にプレフィックスとしてつける。

1 番目は Java プログラミングでよく使われる。 またそれ以外でも広く使われている形式だ。 get と set 命名規則的に対になっていて規則的には美しい。 getter と setter を別々に検索するのも用意だし、プログラミング時にも誤解を招きにくい。

ただし例えば x、y、z のような短い名前の属性の取得の場合 obj->get_x などと、うるさい感じになってしまう。また obj->get_foo->get_var なども obj->foo->var などに比べてすっきり感がない。

2 番目は Perl でよく使われる。C# のプロパティへのアクセサは getter と setter が同じ名前になる。 呼び出し側ではコードが短くなりすっきりする。

ただし Perl の場合は引数の数を動的にチェックするために効率が若干犠牲になるのと、setter の機能が無いアクセサに引数を渡してもエラーにならないため見逃しやすいバグが潜んでしまう可能性があるなどの問題もある。Perl ベストプラクティスではこの形式ではなく1番目の形式を勧めている。

3 番目はあまり多くないかな。 getter に get がついていると個人的には重い印象を感じる。 getter を属性名だけにすることですっきりするとともに、setter は set_ と動詞がつくことでオブジェクトに働きかけるという印象を残すことができる。

命名規則が非対称なのでちょっと気持ち悪いといえば気持ち悪い。

Google C++ スタイルガイドではこの形式を採用している。

個人的には3番目がコードの見た感じにもすっきりしていて読みやすく、また getter と setter の区別も(1番目ほどではないにせよ)つきやすいので良いのではないかと思う。 2番目もよく使っていたのだが、しばらく3番目にしてみようかと思った今日このごろ。

スポンサード リンク
[ 8月20日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.053924s / load averages: 0.41, 0.47, 0.48
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker