2006 年 4 月 5 日 19 時 28 分

setter/getter の設計思想


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


Perl によるアクセサの実装は以下のようだった。

$value = $jack->salary;
$jack->salary($new_value);

Perl では、利便性や実装の手間の関係で、
setter/getter に同じメソッドを流用する。

高級言語では、通常このような実装は嫌われる。
同じ名前のメソッドが異なる挙動をするというのは、
設計者視点で考えても、使用者視点で考えても、
あまり好ましいことではないのだ。

Perl でも、そのような考えを持つ開発者がいる。
他の言語の影響もあったのかもしれないが、
setter を分けて書く人も現れた。
getter は変えず、setter のみ set_ をつけて別とするのだ。

$value = $jack->salary;
$jack->set_salary($new_value);

片方だけ変えた理由は昨日も述べたとおり、
getter は、引数が必要ないため、括弧を省略できる。
Perl ならではの特徴を生かしているのだ。
プロパティっぽく見えるのでよしとしたのだ。

もちろん、他の言語から Perl にきた開発者や、
setter/getter の対称性を重んじる方など、思想の問題で、
set_XXX / get_XXX という設計をする方もいる。

$value = $jack->get_salary();
$jack->set_salary($new_value);

どうだろう、一般的に上級言語のそれに近くなった。
この場合、利用者も getter の後ろの括弧は省略しない。


しかし、私は気に入らない。以下のように書けないだろうか。
こういう構文が書ければ、プロパティのような扱いができる。

$value = $jack->salary;
$jack->salary = $new_value;

Perl の特性上、getter はこのままで OK なのだが、
setter をこのように呼び出す場合に問題となる。
上を実行すると、以下のようなエラーが出てしまうのだ。

Can't modify non-lvalue subroutine call.

でもよく読んでみよう。
「メソッドに代入など言語道断!」って感じではない。
「左辺値でないサブルーチンには代入できませんぜ」だ。

「左辺値でないサブルーチン」ってのがミソである。
裏を返せば、「左辺値であるサブルーチン」ってのが存在し、
それには代入ができるって事なのだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.