[#44431] コンストラクタの引数について&インスタンス変数の持ち方について — Akira Hayakawa <ruby@...>

度々オブジェクト指向についての質問ですいません。

17 messages 2008/01/04
[#44433] Re: コンストラクタの引数について&インスタンス変数の持ち方について — Yukihiro Matsumoto <matz@...> 2008/01/04

まつもと ゆきひろです

[#44469] pdf 作成 ライブラリ — "Luiz Aoki" <luizruby@...>

はじめまして、青木ルイスと申します、

14 messages 2008/01/12
[#44479] ファイル出力時のprintについて — m-hatake@... 2008/01/16

畠山と申します。

[#44483] format %g の丸めについて — 山崎雄介 <y-yamasaki@...>

山崎(ゆ)です。

14 messages 2008/01/16

[ruby-list:44447] Re: コンストラクタの引数について&インスタンス変数の持ち方について

From: m-hatake@...
Date: 2008-01-06 06:54:23 UTC
List: ruby-list #44447
畠山といいます。

私もオブジェクト指向を勉強しはじめたときは、
やっぱりどういうふうにクラスを作ったらいいのかと、
悩んだ記憶があります。

で、(いわゆるオブジェクト指向言語を使うという前提で)
どういうクラス構造にするか(そもそもクラス設計すべきか)
というのは
・解決したい問題構造
が重要で
・現実の世界構造
がどうであろうと関係ないと思います。
(よく生物の階層構造とかが継承の例題で使われたりしてますけど)

さらに、
・保守性
・拡張性
・実行速度
・開発速度etc.
などに依存する部分が多いと思ってます。
個人で使用する小規模なスクリプトに限定していえば
一回こっきりの使い捨てスクリプトや、
1画面以内におさまるコード量の処理であれば
クラス定義は要らない、という主義です

なので、
例えばあきらさんがあげた例題でPointクラスをどうするか
というのも、やりたいこと(解決したい問題)が二次関数をグラフで書く、
とかいうのであれば、そもそもPointクラスはつくりません。
もちろん関数(メソッド)もつくりません。

----
(-100).step(100,0.1) do |x|
  print x,"\t",x*x,"\n"
end
---

とかして終りにします。
(実際はこれをなにか描画ソフトに読み込ませて表示という感じだと思いますけど)
(もっともこれくらいのグラフを描くだけならRubyもつかいませんが)

----
ちょっと話が脱線気味ですが、ということでもし、より適切なアドバイスを
もらいたいなら、
・具体的に処理したい問題(現実世界の構造とかではなく)と
・具体的に(短めな)コードを提示して、どう改良するべきか
・(Ruby的にはどういうのがエレガントな書き方か、とか)
的な質問にしたらどうでしょう?
そのほうがあきらさんにとっても有益だと思いますし。
みなさんも答えやすいでしょうし。

ご参考までに。
畠山

From: Akira Hayakawa <ruby@i-mail.jp>
Subject: [ruby-list:44437] Re: コンストラクタの引数について&インスタンス変数の持ち方について
Date: Sat, 05 Jan 2008 12:05:10 +0900

> たくさんの回答ありがとうございました。
> 回答を得た事で考えた方がどういう状態になったかを報告します。
> 
> (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 <ruby@i-mail.jp>

In This Thread

Prev Next