自分のフィールドへのアクセスにアクセッサを使うことの是非

もちろん、すべてがすべてアクセサを利用するわけではない。だが、まさにいつか誰かのソースで問題が起きたり、忘れた頃の自分のソースに問題が起きたときのために、ここぞというフィールドについてはアクセサを利用する。

L'eclat des jours - 自分のフィールド呼ぶときどれで呼ぶ?


ケント・ベックSmalltalk ベストプラクティス・パターン で似たようなことを書いていたなぁ…と思い出しました。

 インスタンス変数を読み書きするのに、もっとも簡潔で読みやすい方法は、メソッド内で変数を直接使うことです。一方で柔軟性を求めるやり方では、インスタンス変数の読み書きに、毎回メッセージ(アクセッサ)を呼びます。

(中略)

 そのクライアント(間接アクセスを強要された…)との仕事が終わったあと、家でちょっとしたコードを書いてみました。前の仕事と比べてそのコードがなんと読みやすかったことでしょう。スタイルの違いはまさに、直接アクセスか間接アクセスかということにあったのです。

(中略)

 一方で、誰かの書いたクラスを継承して再利用できるか、素早く判断したいようなときには、Direct Variable Acesss(直接アクセス)を用いているのを見つけると、非常にがっかりすることがあります。スーパークラスのコードをかなりいじらないと、適切な拡張ができなくなっているからです。

(中略)

警告−−(両者を使い分けは)中途半端にやらないこと。直接アクセスを使うことにしたのならば、すべてのアクセスについてそうすべきです。もし、後になってある変数を間接アクセスに移さなければならない場合は、その変数のすべてのアクセス箇所を変更しましょう。一方、いくつかの変数が直接アクセスで、他は間接アクセスというふうに混ざっていたとしても、あまり気にはなりません。


※文中の括弧は sumim による補足。

(“メッセージ”は「送る」もので「呼ぶ」ものじゃないので、これは“メソッド”の間違いじゃないかなーという細かい話はいいとして、っても前回みたいなこともあったばかりなのでめんどくさがらず原文に当たってみるとちゃんと send a message って書いてありました(^_^;)、って話はいいとして…)


本来は、この冒頭にもありますように、読みやすさと拡張性、どちらを優先するかでどちらのスタイルにするかも(慣れれば)あるていど自然に決まり、そこには言語の違いは関係ないはず…なのですが、DSL が得意な言語、ことに、記述の柔軟さに加えて、アクセッサの自動定義のマクロもどきが装備され、self が省略可能、さらにはインスタンス変数にいちいち付けなきゃあかん @ がうざい Ruby においては、従来とは違う何か新しいステージでの対立(あるいは判断基準)が生じてきているようで、ちょっとこの話、興味深いです。


…とか思ったのですが、なんのこたーない、LISP などのマクロ機能につきまとう毎度おなじみの話(子細を把握できている状態で書く方はいいが、未来の自分を含めて初めて読む方はかなわん…)と、根っこは一緒でなんら新しい話ではないことに、いま、気が付きました(^_^;)。すみません。