- - PR -
記事:メソッドとコンストラクタはなぜ必要? はおかしくない?
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-05-14 12:19
基本的にオブジェクトは以下の3項目を満たしていないといけません。
1.Attributes(属性) − Javaでいうフィールド変数。C++のメンバー変数。VBのプロパティー 2.Operations(操作) − Javaでいうメソッド群(private, default, protected, public) C++のメンバーファンクション(private, protected, public) 3.Interfaces(公開されている操作) − JavaやC++でいうpublicでドキュメントされているメソッド (参照:講義ノート@UNSW←うちの大学) 茶葉さんが言われるような、「隠蔽されたフィールドにアクセするため」がぴったりくるのはJavaBeanのようなオブジェクト自体が保持しているデータを重視している場合です。 YOU@ITさんが言われるような「そのオブジェクトが外部に対して公開(提供)する機能」 がぴったりしているのはJavaのインターフェイスのように操作を重視している場合です。 つまり、どちらを重視するかによってどちらも正しくなります。ただ、データのカプセル化(隠蔽化)はオブジェクト指向の一部分だけをさすことですので、あまり極端に「隠蔽されたフィールドにアクセするため」というのは少し危険だと思います。確かに、記事からはそういうところがきちんと説明できていない感じがしますね。 ただ、コンストラクタの説明はまぁそこそこ当たっているかと。もともとコンストラクタはプログラマによるミスを減らすために作られたもので、基本的にはメソッドと変わりません。(参照:"The C++ Programming Language" Bjarne Stroustrup著) | ||||
|
投稿日時: 2003-05-14 12:24
確かに「メソッド」といってもいろいろ用途がありますから、
「なぜ必要か」では纏めにくいような気がします。 「メソッドの用途」を例示していくほうが有益じゃないですか? ・インスタンス状態を変化させる(アクセサ) ・繰り返し記述を正規化する(非公開メソッド) ・他のオブジェクトに対して機能を公開する(公開メソッド) などなど。 うーん、厳密には違うかな・・・あまり良くない例かも。 その辺ツッコミはよろしくお任せします | ||||
|
投稿日時: 2003-05-14 13:36
>YOU@ITさんが言われるような「そのオブジェクトが外部に対して公開(提供)する機能」
>がぴったりしているのはJavaのインターフェイスのように操作を重視している場合です。 インタフェースというのは処理の抽象化だと理解しています。 処理の抽象化というのは、内部のデータが異なるクラスに対して 共通の操作(呼び出し名・引数)を提供することだと思います。 内部のデータが異なるにもかかわらず共通の操作が可能となるのは、 その内部のデータを「隠蔽する」からこそだと私は理解しているのですが、 皆さんは違うのでしょうか? 私が例えによく使うのは、車のハンドルと飛行機の操縦桿です。 いずれも右に回すと右方向に進むことが出来ますが、 片や車輪で片やフラップと内部は全く異なる構造です。 でも、その構造が「隠蔽され」操作が抽象化されるからこそ 使う側にとって便利になるんだと説明しています。 念のため繰り返しますが、 「隠蔽された内部データにアクセスするメソッド == ゲッタやセッタ」 というつもりで書いているわけではありません。 | ||||
|
投稿日時: 2003-05-14 14:42
私もそう思います。 「なぜ必要か」という問いかけ(?)が間違っていて、 Javaのインスタンス化のルールとして(暗黙も含む)コンストラクタが必須 という説明なら言語の説明になってますよね。 メソッドが必要か?なんて議論はDukeにまかせておけばいいんじゃない? メソッド無しでいったい何ができるのさ・・・mainだってメソッドだし。 | ||||
|
投稿日時: 2003-05-15 02:19
もしメソッドを使わないと、オブジェクトの値を(メインの処理が)直接読み出したり書き換えたりするわけですよね。
この場合オブジェクトは単なるデータでしかありません。 ・すべての処理はメインの処理が行い、 ・処理に必要なデータはメインの処理がオブジェクトから直接読み出します。 これって、オブジェクトではなく構造体ではありませんか? 逆にメソッドを使用すると、 ・処理はオブジェクトが行う。 ・メインの処理は、オブジェクトへ処理を依頼する。(依頼元は具体的な処理方法を気にする必要はない) ・メインの処理は、オブジェクトの個々のデータを気にする必要はない。 などの利点があるわけで。 (もちろんこれだけではなく) ですから「なぜ必要か?」という問いには、
かなぁと思います。 <※1> これは、茶葉さんの言う「隠蔽された情報へアクセスするため」と同意になるのでしょうか...? | ||||
|
投稿日時: 2003-05-15 14:45
>これって、オブジェクトではなく構造体ではありませんか?
そうです。 >処理は適切な者(オブジェクト)が行うため >オブジェクトの内部構造を隠蔽するため (※1) >これは、茶葉さんの言う「隠蔽された情報へアクセスするため」と同意になるのでしょうか...? はい。 隠蔽することが目的であり、メソッドはそれを実現する手段です。 つまり、「なぜメソッドが?」と問われたならば、 その最大の目的(==理由)である隠蔽にあの記事で触れるべきだ というのが最初からの私の意見です。 オブジェクト指向的観点から見たこの説明が無いのは納得出来ない と書いた理由も同じです。 | ||||
|
投稿日時: 2003-05-15 15:11
「Javaのメソッドはオブジェクトを隠蔽することが最大の目的です」 って明らかに間違ってませんか? そういった側面があることには違いないのですが、 言い回しが極端すぎて、YOUさんとかまりりさんとかH2さんとか大御所から 警告されていることに気が付いてください。 標準ライブラリ中にあるようにJVMの外のデータへのアクセス方法を 一般化するための(スタティック)メソッドもあるわけですから、 よく頭を冷やして考えてみてください。 | ||||
|
投稿日時: 2003-05-15 17:42
以下、元Smalltalkerの感覚で「メソッドとは何か」を捉えてみます。
そもそも、メソッドはなぜ「メソッド(方法)」と呼ばれているのでしょうか? オブジェクト指向の基本は「メッセージ・パッシング」です。つまり、オブジェクト からオブジェクトにメッセージを送信し、受け手がそれを解釈実行することで、 処理が進みます。例えば、 foo.doSomething(); と書いたとき、doSomethingは、「メッセージ名」であり「メソッド名」では ありません。オブジェクトの外側からは、<オブジェクトに対してメッセー ジを送ることしか行えません>。 一方、「メソッド」とは、オブジェクトがメッセージを受信したときに、どの ような「方法(method)」でそれを解釈実行すればよいかを記述したものです。 つまり、メソッドはあくまで「オブジェクトがメッセージを解釈実行するため に内部的に用いる手段」です。メソッドは「隠蔽されている」のです。 JavaはC言語に似ているので、「メソッド呼び出し」=「関数呼び出し」という 感覚が(私自身を含めて)浸透してしまっていますが、本来この両者は全く異 なります。 C言語の関数呼び出しと、メッセージ・パッシングによるメソッド実行の決定的 な違いは、dynamic bindingにあります。メッセージを受信したオブジェクトは、 それをどのようにして実行すればよいか、判断を行います。その結果、クラス やスーパークラスが備える多数のメソッドのうちいずれか1つを選択し、それを 利用してメッセージを解釈実行します。 このように、メソッドをオブジェクトに隠蔽してしまい、メッセージによる オブジェクト間の動的な疎結合によって機能を実装することで、デザイン パターンや多態性として知られるような柔軟かつ表現力の高いコード記述が 可能になる、というのがオブジェクト指向の基本だと私は思います。 いろいろ異論もあるでしょうが、こういう見方もあるということで。。 | ||||
