• 締切済み

オブジェクト指向の実装方法

オブジェクト指向では、クラス間の関係に「依存」「関連」「集約(composite/aggrigate)」などがありますが、実装上はどのように表現できるのでしょうか? たとえば、C++の場合は関連と集約を実装上区別することが(自分の知識では)できません。compositeとaggrigateは実体化ポインタかで区別しています。 Javaの場合はcompositeとaggrigateの区別もできない???(Javaはあまり詳しくありません。。。) C++、Java、その他、言語は何でも結構ですので、どのように表現しているか教えてください。

noname#183335
noname#183335

みんなの回答

回答No.1

なっかなか回答が出ないですね~。もうそろそろ1週間も経つというのに、1件もないということは、現状では、それだけUMLの普及が進んでいないということなのか、又はUML技術者の方々が単にこのサイトを訪れていないだけなのか?(あと、単に忙しいので、そんなことにいちいち付き合ってられない、というのもありますかね。) 一応、過去ログの方も調べてはみたのですが、以下の2件ぐらいで、ほんと乏しいっすね。私自身、UMLの方も勉強中なんですが、できる範囲での回答をしておこうと思います。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=1547798 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=1174553 まず始めに、Javaでの表記です。 関連→フィールド(クラス内で定義された変数) 集約→フィールド コンポジション集約→フィールド 汎化関係→extends 実現関係→implements 依存関係→import ステレオタイプ→javadoc ノート→コメント 以上の事からも分かる通り、関連と集約とコンポジション集約の3つは、基本的には同じものです。じゃあ、厳密には何が違うのかというと、各変数間の意味的な関係がそれぞれ違うのです。具体的には、以下のような感じです。 (1)集約の場合 このサイトのホームページには、質問総数が、「ログアウト」ボタンのすぐ下や、「教えて! goo データ」の所などに表示されています。('05/9月現在で、やっと150万件突破ですね。)それと同時に、各質問どうしは、各質問のURLのクエリー(qやqidといった変数)や、質問No.として、区別されていますね。この質問総数と質問No.との関係は、同じ関連の中でも、「has-a」や「part-of」が成り立つので、集約になります。 (2)コンポジション集約の場合 あるショッピングサイトにて、複数の商品を購入中の時に、合計金額(例えば、変数sum)と、各商品ごとの金額(例えば、変数goods_1,goods_2,…)を別々に、注文画面にて表示したいとしましょう。その時に、sumと、goods_1やgoods_2などの間には、もちろん「集約」の関係がありますが、それと同時にライフサイクルが同じともいえます。(最初が、商品を購入中の時で、最後が購入をキャンセルしたか、もしくは、注文終了後に各商品が全て、自分の手元に届いた時。)このような時には、コンポジション集約の関係にある、といえます。 基本的に、オブジェクト指向言語であるJavaと、モデリング手法のUMLとは、1対1に対応していません。(それを言い換えると、もう既に、上記の文章内にもいくつか間違いがあるかも。)どちらが先に誕生したのかなど、詳しいことは分かりませんが、代表的な例が「protected」でしょう。これは、表記としては、Javaにおけるアクセス修飾子も、UMLにおける可視性も全く同じなのですが、意味としては若干、違う所があります。(ポイントは、同じパッケージ内のクラスからでも、アクセス可能かどうか、です。)他のオブジェクト指向言語(C++,Ruby,Smalltalk)でも同じことが言えるんじゃないかなあと…。 最後に、お勧めのサイトを記しておきます。 http://www.stackasterisk.jp/tech/engineer/uml02_05.jsp http://www.atmarkit.co.jp/fjava/devs/renew_uml04/renew_uml04.html

noname#183335
質問者

お礼

詳しい説明ありがとうございます。 やはり関連、集約、コンポジションなどにコーディング上の違いはないのが一般的ということですね。

関連するQ&A

  • オブジェクト指向で作るプログラミング

    オブジェクト指向プログラミングで作るものってどんなものですか??(たとえば、、、ゲームとか、エクセルとかですか??) あと・・・Cを勉強してから、javaにいく人がいますが、Cとjavaは似ているのですか??

  • オブジェクト指向の特徴

    プログラミングにおいて Java言語などのオブジェクト指向とは 「クラス(設計図)からインスタンス(実体)を量産できる。」がオブジェクト指向ではないプログラミング言語との決定的な違いなのでしょうか? またオブジェクト指向とオブジェクト指向ではない言語の決定的な違いや 実際に実務において経験した感覚的な違いなどがあれば教えてください。 インターネットに乗っていない些細なことでも構いません。

    • ベストアンサー
    • Java
  • オブジェクト指向、理解しやすい?

     最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)  Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)  そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、 1.わかりやすかった 2.そこでつまずいた 3.特に意識せずに通り過ぎた 4.その他 いずれでしょうか? ※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

  • オブジェクト指向の利点とは?

    汎用機でCOBOLのSEを10数年やってました。(今は自営業) COBOLはプロセス型の言語といわれているのに対して C言語はオブジェクト指向型の言語といわれています。 私はC言語やJAVAで開発したことはないのですが、 C言語、すなわちオブジェクト指向の利点ってなんでしょう? JAVA、C言語はオブジェクト指向ですよね。 私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。 ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。 「どっちでもいいんじゃないか」なんて思ってしまいます。 プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。 よろしくお願いします。

  • Javaにおけるオブジェクト指向とは?

    現在Javaを勉強しております。 以前はC言語を勉強しておたのですが、 JavaとCの違いにおいてJavaの特徴としてオブジェクト指向と習いました。 しかしいまいちこのオブジェクト指向を理解できません。 プログラムを一つのまとまりとして考えるというのはどういうことなのでしょうか? 確かにJavaはC言語とは違いいくつかのプログラムからできている (はず?見当違いだったらすみません) C言語が一つの大きなプログラムでできているとすると、 Javaは細かいプログラムの集合体であると私は考えていました。 この細かいプログラムの集合体というのがオブジェクト指向なのでしょうか? 全くの見当違いだったらすみません。 よろしくお願いします。 

    • ベストアンサー
    • Java
  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向とUMLについて

    「オブジェクト指向」と「UML」の勉強をしようと思っているのですが、お勧めの参考書またはWebサイトをお教えていただきたいです。 ※オブジェクト指向については、JavaやC++のような言語についてではなく、オブジェクト指向についてです。 ちなみに私はJavaは経験したことがありますが、正直"オブジェクト指向がなんたるか"はわかっていないです… 現在業務でJavaに携わっていてるので、オブジェクト指向という考え方をこの機にしっかりと学べればと思っています。 UMLはまったく無知です; クラス図やシーケンス図など中身にナニがあるか微妙に知っているだけです…; どちらか片方でも良いので何かございましたら、お教え願います。 …参考書だと電車で読めるので、ちょっとだけ喜びます(笑

  • なぜ「C言語」にOOPが実装されなかったの?

    1972年に開発された「C言語」(C++ではない)には「オブジェクト指向」というのがないのですが、なぜ「C言語」に「オブジェクト指向」というのが実装されなかったのですか? 「オブジェクト指向プログラミング」は1960年代後半に登場していたのですが、後発の「C言語」には「ポインタ」はあっても「オブジェクト指向」というのがありません。なぜ「オブジェクト指向」は実装されなかったのでしょうか? 当時コンピュータの性能が低かったため実装が難しかったことと、まだ当時オブジェクト指向自体が無名だった為、「C言語」の開発者自体も知らなかったということもあるのでしょうか?

  • オブジェクト指向が理解できません 教えてください

    現在Javaを勉強しているのですが、 Javaに限らず最近のプログラムの特徴であるオブジェクト指向がよくわかりません。 C言語も学んでいたので少しは知識はあります。 以下は私の解釈です。 C言語は関数の集まったものがいわゆる私たちが作るプログラムで、 作ったプログラムはそれ単体で機能する。 それに比べてオブジェクト指向を用いたプログラムでは、 オブジェクトからクラスが生成、このクラスが一つのプログラムとなる。 クラスのプログラムをいくつも集めたものが最終的なソフトとなる。 Cだとミスを一か所直すと他のところを直す羽目になるかもしれませんが、 オブジェクト指向においてはミスをオブジェクト単位で修正するので、 他のオブジェクトへの影響度は少ない。 よってオブジェクト指向の方が拡張・修正などでも優れている。 こんな感じに解釈したのですがどうでしょうか? オブジェクト指向では最終的なプログラムソフトはオブジェクトの集合体によって構成されているため、オブジェクト指向=オブジェクト中心の考えと言えるのでしょうか。

  • オブジェクト指向 集約の実装について

    例えば、 学校クラス--学年クラス--学級クラス--班クラス というクラスがあった場合、それぞれのクラスには集約といわれる関連があると思いますが、この場合の実装は一般的にどのようにされているのでしょうか。 自分の考えでは、 class Gakko { vector<Gakunen> GakunenObj; }; class Gakunen { vector<Gakkyu> GakkuObj; }; class Gakku { vector<Han> HanObj; } class Han { void ShowName(); } このように学校クラスが消えれば内包される学年クラス・学級クラス・班クラスも消える必要があるので、オブジェクトの寿命を親のクラスと同じにするため、各クラスに子クラスのインスタンスを持たせています。 この方法だと班の名前を表示したい場合、 Gakko Obj; Obj.GakunenObj[a].GakkuObj[b].HanObj[c].ShowName(); といった感じでアクセスすることになると思います。 ただ、こんな長たらしいプログラムコードを見たこともありませんし、実際は通常の関連としてクラスのポインタを持たせた方がいいでしょうか。 突っ込みどころ満載ですが、よろしくお願い致します。