• ベストアンサー

オブジェクト指向の教え方

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

  • Java
  • 回答数6
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • ahirururu
  • ベストアンサー率34% (11/32)
回答No.1

こんばんは。 同じ内容のプログラムで C風にかいたソースと Java風にオブジェクト指向に基づいて 書いたソースを比較してはいかがでしょうか? また、JavaでC風に書いたソースを 解説しながらJava風に書き換えていくのは いかがでしょうか? 研修の講師、頑張って下さい! 少しでも参考になればと思います。 では。

thamansa
質問者

お礼

ありがとうございます。 ちょうど昨日、それをやってみました。 なぜC風だとだめで、Java風にしたほうがいいのか、またどうすれば最初からJava風に書けるのか教えるのがなかなか難しく・・・ がんばります。

その他の回答 (5)

  • ency
  • ベストアンサー率39% (93/238)
回答No.6

私はオブジェクト指向の本質は、カプセル化でも継承でも多態性でもなくて「インスタンスをいっぱい作れること」だと思っています。 要は、スタティックな変数一個を使いまわすのではなくて、同じ型なんだけどまったく別の変数がいくつも作れてしまうことのメリットはかなり大きいと思います。 # 確かに C でも構造体を malloc() すれば、同じようなことはできますけどねぇ。。。 あと、一人で作れる程度の小さいプログラムだと、オブジェクト指向の本質的なところは見えにくいと思います。 グループを作って、それなりの規模のプログラムを作るようなことは、やる予定はあるのでしょうか。 そのときに、なっていろいろとC とは違う箇所が見えてくると思います。 UML については、実際に使わないからといって放っておくのはどうかと思います。 手続き型言語を勉強するとき、フローチャートから入った人って、言うほど少なくないはずです。 それと同じで、オブジェクト指向の場合、UML は知っていて損はないと思います。 # thamansa さんも、知っているからこそ「そんなの使わないよねぇ」というようなことを # 言えるんですよね。 # 知らなければ、そのようなことすら言えないわけですし。。。 結局のところ、いわゆる勘所のようなものは、経験からしか身につかないのではないでしょうか。 そういう意味では、UML は考え方や残すべきドキュメントのヒントとなるガイドラインとする上では、便利なツールではあると思います。 # 私もすべては使いませんが、シーケンス図くらいは描くようにしています。 # なんだかんだいっても、デバッグのときに一番役に立ったりしますし。 そうやって、経験を積んでいく中で、勘所がわかってくるのだと思います。 回答にもなっていないかもしれませんが、少なくとも私はこんな感じで仕事をしています。

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.5

開発の「分析」時に行う「クラス抽出」と、 ソースコードを書きながら(または容易にソースコードがイメージ できる状態で)行う「クラス抽出」とは (開発工程内における)性質・役割・重要度などが 異なるような気がするのですが…。 自信ありませんが。 なので、これら両者を教えるにしても、 教えかた・コツ・教える時期が 異なるような気がするのですが…。 自信アリマセンが。 ちなみに、 「ソースコード書きながら」のほうは、 新人さんにも簡単だと思います。

thamansa
質問者

お礼

なるほど! 一口で「クラス抽出」といっても、分析時と実装時では違いますね。 自分でもなんとなくやっていましたが、いわれてみると別物であることがわかります。 これまでのモヤモヤが取れてすっきりした気がします。 ありがとうございました。

回答No.4

>ユースケースの抽出とかって入門書に必ず出てきますけど、実際はあまり行わないじゃないですか ですよねぇ…(^^;A 自社で全てやるのであれば、 開発手法というか、設計手法というか… にUMLで図を作ってそこからクラスやメソッドを… というのを「ルール」として徹底させればいいんですけどね…。 客先開発だったり、2次受けだったりすると、 「その場のやり方」 にあわせないといけないので…。 前回の仕事は「UMLを使って設計する。」という現場で、「ちゃんと仕事として」は初めてでした。 現場自体も初の試みだったらしく、みんなで勉強しながらやってました。 「勘」を養うのはやっぱり「場数」を踏まないと… でも、JAVAのAPIドキュメントやソース、Jakartaプロジェクトのドキュメントやソースなどを読めばその「勘」が育つのも少しは早く…なったりしませんかね…(^^;A

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

「オブジェクト指向がわかる本」薄くてよくわかります。 前半が「オブジェクト指向」後半が「オブジェクト指向の実装」です。 JAVAを使って2種類のもぐらたたきゲームをを作ります。 入門編としてお勧めです。

参考URL:
http://bookweb.kinokuniya.co.jp/guest/cgi-bin/wshosea.cgi?W-NIPS=997129334X
thamansa
質問者

お礼

ありがとうございます。 参考URL目次を見たところ、なかなかよさそうです。 帰りに本屋へ寄ってこようと思います。

回答No.2

もしかしたら的外れかもしれませんが。 とあるサイトの掲示板で 「オブジェクト脳のつくり方」 という本が オブジェクト指向の勉強にはいい と書いてありました。 値段も3000円くらいですので、今度買おうと思ってます。 まだ読んでないので「読んだ感想」を回答できなくて申し訳ありません。 アマゾンに何件かレビューコメントが載ってますので、そちらを参考にして下さい。 クラスの抽出と設計に関しては… UML を取り入れてみてはいかがでしょうか? (自分はUMLを完全に理解してないので、↓は間違ってるかもしれないです。) ユースケースの抽出から始まって、 クラス関連図とか、シーケンス図とか… あって、どうクラス分けして、どのようにメソッド分けするかが分かります。 前の仕事で初めてUMLを設計に取り入れたのですが、そのときに読んだ本(名前を忘れてしまいました。)が分かりやすくかったです。 サイトは@ITのUMLの記事を見てました。 ってこんなこと書いてますが、自分も「勘」が多いですね。(^^;A 「今までの経験と」が付きますけど。(笑) それでは講師をがんばって下さい。

thamansa
質問者

お礼

ありがとうございます。 「オブジェクト脳のつくり方」は会社にあるので、もう一度読み直してみます。 ユースケースの抽出とかって入門書に必ず出てきますけど、実際はあまり行わないじゃないですか、それで 経験と勘だけでクラス設計できてしまうので、 その「勘」の部分を詳しく説明してある本とかがあるといいなと思いました。 (やっぱりこの考えが間違っているのかな・・・)

関連するQ&A

  • オーバーロードはオブジェクト指向プログラミングの枠組みで語られるべきか

    一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが、私はそれに疑問を感じます。 オーバーライドはクラス・継承に関わるためOOP特有のものであると思うのですが、オーバーロードはクラスとは全く切り離して考えられるからです。 確かにオーバーロードはクラスを作るときに有用な技術ではありますが、例えばC言語のような非オブジェクト指向言語でオーバーロードが使えたとしても、それなりに機能するはずです。 ひょっとしたら 「オーバーロードもオーバーライドもポリモーフィズムだろう」 ↓ 「ポリモーフィズムといえばオブジェクト指向」 のような話の展開でしょうか(いや、さすがに無理があるか…)。 皆様はどうお考えでしょうか。 ご意見お聞かせ下さい。

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

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

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

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

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

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

    • ベストアンサー
    • Java
  • Javaにおけるオブジェクト指向とは?

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

    • ベストアンサー
    • Java
  • オブジェクト指向に関して。

    Javaの解説本を読んでオブジェクト指向プログラミングという物があることをしりました。その本には「オブジェクトはデータとそのデータを扱うための機能を持っている。この機能はメソッドと呼ぶ。クラスは設計図のような物で変数とメソッドから構成されている。設計図を実際に形にした物がインスタンスである。」と書いてありました。私はオブジェクト=クラスのような感じがしたのですが、実際のところオブジェクト=クラスでいいのでしょうか?  また、友人に話したところ、オブジェクト指向はサブルーチンに似ているといっていました。私はプログラミングの知識が全くないのでサブルーチンという物が何なのかわからないのですが、サブルーチンとオブジェクト指向の考え方は違うような気がするのです。友人に説明して納得させるにはどうしたら良いのでしょうか? ぜひ、力を課してください。

  • 【オブジェクト指向について】

    【オブジェクト指向について】 こんにちは。初めて質問をさせていただきます。 さて、ただいまVBを勉強中なのですが、オブジェクト指向のところで躓いてしまいました。 質問したい事は以下の点です。 (1) オブジェクト指向の理解について   オブジェクト指向とは、プログラミングをするときに変数や機能などをクラスというものに格納しておくことで、プログラミングを円滑にすすめるための概念であると理解していますが、この理解は正しいのでしょうか? ご回答お待ちしております。よろしくお願いいたします。

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • オブジェクト指向、理解しやすい?

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

  • オブジェクト指向について

    C#でプログラミングをしているのですが、オブジェクト指向を一切使わずに作っています。 作っていくにしたがってツールが重くなってきたのですが、オブジェクト指向を使ってい書いたほうがアプリケーションは軽くなりますか?

専門家に質問してみよう