- - PR -
記事:メソッドとコンストラクタはなぜ必要? はおかしくない?
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-16 01:48
>一方、「メソッド」とは、オブジェクトがメッセージを受信したときに、どの
>ような「方法(method)」でそれを解釈実行すればよいかを記述したものです。 >つまり、メソッドはあくまで「オブジェクトがメッセージを解釈実行するため >に内部的に用いる手段」です。メソッドは「隠蔽されている」のです。 興味深い解釈ですね。 >このページでは、メッセージ・パッシングの例として >g.setColor(Color.white); >というコードが挙げられていますが、これはEventListenerインタフェースの説明 >とは関係ないですよね。 私もそう思います。 EventListener(あるいはListener)というのはメッセージの一形態でしょう。 ちなみに、メッセージの説明が書いてある前のページ(What Is an Object?) にはこう書いてあります。 Methods surround and hide the object's nucleus from other objects in the program.Packaging an object's variables within the protective custody of its methods is called encapsulation. This conceptual picture of an object-a nucleus of variables packaged within a protective membrane of methods-is an ideal representation of an object and is the ideal that designers of object-oriented systems strive for. (http://java.sun.com/docs/books/tutorial/java/concepts/object.html) オブジェクト同士がデータの交換をするためにメッセージを用いるのは、 やはり「hide」が理由だと思います。 ただ、この形は理想形(ideal)だとことわってあり、この文に続いて アクセス制御が書いてあるあたりはJavaならではなのでしょうか? > にっくさん | ||||||||
|
投稿日時: 2003-05-16 02:06
>まりりさんの
>引用: >------------------------------------------------------------------------ >そもそも、隠蔽されてるデータなんてものを意識させる必要はないのではないですか? >------------------------------------------------------------------------ >って、 >意識させないために、メソッドが隠蔽されてるデータへアクセスするんだと思うんですけれど。 私もそう思います。 意識させない(==隠蔽する)ためにメソッドが必要となります。 | ||||||||
|
投稿日時: 2003-05-16 03:42
実を言うと、このページの説明は、私的にはしっくり来ません。なぜなら、 このページ(およびカプセル化に関する議論一般)では、 ●インスタンス変数(オブジェクトの状態)の隠蔽 ばかり強調しているからです。そのため、メソッド=アクセッサという解釈に なってしまいます。正直、それは違うと私は思います。 私は、 ●インスタンス変数(オブジェクトの状態)の隠蔽 および ●振る舞い(behavior=メソッドの集まり)の隠蔽 こそが、オブジェクトの本質と思います。これを説明するために、Kent Beck "Smalltalk Best Practice Patterns"の一節を引用します(にっく訳・カッコ 内はにっく補足) 「(OOPでは)計算処理をメッセージ送信とメソッド呼び出しの2つに分離す る。そして、オブジェクトのクラス定義に基づき、メッセージに対応するメソ ッドの検索を実行時に行う。これは、関数呼び出しとさほど変わらないように 見えるが、大きな違いを生み出す。」 (p19) 「(手続き的な)条件分岐のコードは、『このコードを実行するか、もしくは こっちのコードを実行せよ』といった具合に動作する。また、関数呼び出しのコー ドは、『あのコードを実行せよ』と働く。これに対し、メッセージ送信のコード は、『このコードか、あのコードかどちらかを実行せよ。どちらを実行するかは (送信側は)関知しない』という動作になる。」(p44) ----- 今までの議論はインスタンスメソッドに対するものです(おたまさんのbとc)。 ちなみに、staticメソッドですが、ルーツはSmalltalkのクラスメソッドだと 思います。SmalltalkやRubyでは、クラスもオブジェクトであり、クラスメソッド もインスタンスメソッドです(ややこしい)。関数的メソッドのような区別は 本来はありませんでした。 | ||||||||
|
投稿日時: 2003-05-16 10:26
ども、ほむらです、
もしかしたら、気に障るようなことを いっているかもしれないのですが、 ご容赦>< ------------------------- えっと、個人的に、'アクセス'という言葉を使うと かなり*直接的*なイメージかつ、*存在することの前提*があります。 もしかしたら思っていることは一緒なのかもしれませんが アクセスするという直に編集することを思わせる行為をメソッドに させてしまったら、隠蔽という動作になんの意味もなくなってしまいます。 個人論が続くばかりで心苦しいですが^^;;;; オブジェクトにあるデータはプログラマの都合だと思っています。 ユーザーがそのオブジェクトを利用するときに内部のデータ(の存在)を 意識してコードを記述していくという状況を無くすために データの隠蔽とメソッドの使用があるのではと考えいます。 同じアーティクル内にデータ件数をだすなんてたとえ話を しています。
このときに大切なのは、名前のとおり*データの件数がほしい*のであって データの件数 が 格納されているデータ*そのものでは*ありません。 # 僕の言いたいことがうまく伝わってくれるといいのですが・・・ | ||||||||
|
投稿日時: 2003-05-16 10:33
UMLのシーケンス図の矢印線はメッセージ・パッシングを意味します。 しかし、 Javaのメソッド呼び出しが全てメッセージ・パッシングだという意味ではありません。 どう考えたらUMLの表記法とJavaの実装が結びつくんですか? UMLはあくまでオブジェクトの振る舞いを記述する方法でしかありません。 | ||||||||
|
投稿日時: 2003-05-16 11:41
ども、ほむらです。
最初から読み返していて書き込みを忘れていることに 気が付きました^^;;;;;;; ごめんなさい、かなりの亀レスです。 ---------------------- KO-JIさんへ 軌道修正については僕の希望が大きいところではあったりします(ぉぃ 次回からは制御文ということですが、理由ありきで必要という形を とっているあたりに大きな心配があったりもしますね。 個人的には、配列なんかよりも先に例外処理で二回くらい使ってほしい気もします。 条件分岐 → 例外処理 → 繰り返し → メンバ → 配列 くらいあとでもいいかなと。。。 せっかく、まっさらな人を対象としているのだから 多少は現実の書き方と違っていても理想を書いていってほしいです。 なんか、このまま、エラー処理までif文で突っ走りそうでこわいですね(笑) # 入門書としてはじめて目にしたものの影響力はすさまじいです。 # その後の考え方でホントの基盤となってしまいます。 # そういった意味でも概要や背景も無く*ただ動くという理由で*覚えてしまったら # その人にとって不幸なことなのかもしれません | ||||||||
|
投稿日時: 2003-05-16 13:14
Javaでもstatic定義された要素はクラスがロードされた初回に実体化されます。 「クラス」というオブジェクトはクラスファイルに対して一意のもので、 クラスファイルリソースへアクセスするためのものです。 (オブジェクトをインスタンス化する時にも初回であれば直前に実体化します。) static宣言された変数は一般的にクラス変数と呼ばれていますので、 その辺は同じ考え方だと思います。 static宣言されたメソッドは宣言元のクラスを実体化したクラスローダで一意の オブジェクトのメソッドとして動作するため、決して関数ではありません。 ちょっと冗長になったので・・・ 「Javaでもstaticメソッドは関数ではありません。」 | ||||||||
|
投稿日時: 2003-05-16 13:32
まず最初にゴメンナサイ。
ここの解説では関係ないですね。 A can use a message to request that object B という意味ではメソッド呼び出し=オブジェクト間のメッセージということですね。 斜め読みしすぎて肝心なところをちゃんと読んでませんでした。 OOP的なメッセージ・パッシングはEVENT処理に相当するという思い込みが あるので今までの書き込みの論法は間違ってないけど 意図するところが違ってたようですね。 ただ、Javaのメソッド呼び出しはパラメータがオブジェクトであった場合 (プリミティブ型でない場合) 基本的に参照渡しなので今ひとつメッセージと表現するのに抵抗があります。 | ||||||||
