前田です。

中村暁史 <anakamur / exa.i-tech.co.jp> writes:

> ->class Foo
> ->  def bar
> ->  end
> ->  def bar=(obj)
> ->  end
> ->end
> ->
> ->というメソッドがあったとしても、barとbar=の間には何の関連もありませ
> ->んよね?
> ->これがFooのbarという属性のgetter/setterである、ということは、慣習的
> ->にそういう場合が多いということから来る推測でしかありません。
> 
> あれ?Moduleクラスのメソッド「attr」って
> 関連を喚起する(^^;のがオシゴトであるメソッドなのかなと
> 思ってたんですが、違ったでしょうか。
> #属性という単語がちゃんと出てくるし>まにゅある

たしかにマニュアルでは、

attr(name[, asignable]) 

 そのモジュールをインクルードするクラスのインスタンスに対して nameという
 属性とそのアクセスメソッドを定義します. 

となっていますが、実際にはインスタンス変数のアクセスメソッドが定義さ
れるだけで、何かアクセスメソッドとは別の「属性」というものが定義され
るわけではありません。
# 心理的効果としては「属性が定義される」といってもよいかもしれませんが。

class Foo
  attr_accessor :attr
  ...
end

は、

class Foo
  def attr; @attr; end
  def attr=(val); @attr = val; end
  ...
end

と等価です。
attrには「関連を喚起する」という面もあるかもしれませんが、アクセスメ
ソッドの定義を簡単にするというのが主な役割だと思います。

Delphiの場合、プロパティという概念は単なるアクセスメソッドとは別のも
のですよね。
# 実際メソッドを定義せずに直接変数の値を読んだりすることもできたよう
# な気がします。

> ->このように言語でプロパティという概念が規定されていることは、コン
> ->ポーネントベースのプログラミング環境の実現に役立っていると思います。
> 
> 役だってはいますが、出生のヒミツ(「ため」)がそれであったかどうかは
> 設計者にきいてみないと、なんとも…(^^;

まあ、それはそうなのですが、単に

obj.attr = ...

と書きたいだけであれば、それこそsyntax sugarでよいわけですから、やは
りコンポーネントを意識した仕様だと考えるのが自然ではないでしょうか。
# そういえばC++ Builderではどうしてるのかしら。

> ->逆にこのような仕組みがない場合はJava Beansみたいにプロパティの登録手
> ->続きが別途必要になってきてちょっと面倒ですよね。
> 
> あーあれはちょっと困りますよねー。ちょっとsunちゃん

Javaの場合は「そこまで言語でサポートする必要はないんじゃない?」とい
うスタンスなのでしょうね。
賢いRADツールがあれば、問題ないと思います。
# VC++みたいにテンプレート作っておしまい、だと困りますが。

-- 
前田 修吾