From: Akira Hayakawa Date: 2008-01-05T12:05:10+09:00 Subject: [ruby-list:44437] Re: コンストラクタの引数について&インスタンス変数の持ち方について たくさんの回答ありがとうございました。 回答を得た事で考えた方がどういう状態になったかを報告します。 (2)Pointクラスの設計について privateでx, yで持たせて、 to_arrayというメソッドで外に配列として公開するのはなんとなく意味的に感じがいいですね。 でも本当は座標とかの場合、xとyを逆にしても成り立つわけですから、 indexをひっくり返して(例えば+1してmod2をとるとか)も、 同様に成り立たないと意味的に少し気持ち悪いような気がします。 でも見た目ではx, yの方がわかりやすいですね。 だから、アルゴリズム用にと、分かりやすい用に def to_array [@x, @y] end と attr_accessor :x, :y の両方を定義しておくというのは、 ソフトウェア工学的には反則ですか? 1種類のプライベート変数に対して2種類のアクセサが存在するというのは。 (1)クルマとタイヤについて 確かに、クルマを作る時に、クルマがタイヤの直径を要求するのは意味的に気持ちが悪いですね。 ぼくは動的言語は幅広く受けるのが正解だという理由で、 外でインスタンスを作って、 インスタンスをコンストラクタの引数の持ってくるのが正解なのかと思っていました。 でも引数にwheel_sizeを持ってくる方がいい場合もあるのでしょうか。 まつもとゆきひろさんの 後者の方が情報の隠蔽の度合いが強いというのは、 つまり、 それとも車を作る人はタイヤの作り方を知らないが、他の人が知っているので作ってもらうか、 車を作る人しかタイヤの作り方を知らないか、 という意味ですよね。 これは考えてもいませんでした、 でも、実際の社会では車メーカーはタイヤを作りませんね。 タイヤは他に受注しません。車メーカーは設計して、パーツを組み合わせるだけです。 ネジ一本にいたるまで他のメーカーが作っています。 仮に、同列の下請けが作ってるとして、タイヤを作る方法は公開されていても、 クラスA(車のクラス)というのは、意味的には「車を組み立てるクラス」のような気がします。 という意味では前者のインスタンスを引数にとってしまう方が意味的に正しいのではという考えになりました。 Pointのクラスについては答えは出ませんが、 (もっとも、 X = 0 Y = 1 def initalize(x, y)  @where[X] = x @where[Y] = y end とすれば少しは意味的にxとyを明示的に表している意味も増すのかなと思いましたが これはやはり場合によりそうですね ) 車の方については一応の答えは得られた気がします。 -- Akira Hayakawa