- ベストアンサー
オブジェクト志向の基礎的理解をする方法
お世話になっております。 表題のとおりなのですが、何かよい方法、もしくは理解の助けになるアドバイスをいただけないでしょうか? 現状の私の理解 ・クラス javaプログラミングを扱う上で一番大きな単位 ・メソッド クラスの中にある動作を示すもの #動作を示すという部分がよく分かっていない。 動詞として捕らえれば良いと言われたのですが… ・インスタンス AAA aaa = new AAA(); で設定する。 ・引数 データを渡す。 ()の中に入れる。()中が同じじゃないとダメ。 ・戻り値 メソッドが返す値の種類の設定? Int型やStr型など設定する。 かなり理解不足ですが、アドバイスをお願いします。 webサイトはgoogle上位サイトを検索してみましたがよく理解できなかったので、お勧めの書籍などがあればよろしくお願いします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
> 理解できない原因は基礎的知識と能力不足かなと思っています。 最初は誰でもこのような状態に入り、苦しみます。 気にしないでください。 > 特に、私自信理解が遅い方で、他の方が一発で分かることも何回か試行錯誤 > を行ってやっと理解できるタイプだと理解しております。 ほとんどの人はあなたと同じです。特にわが国は、ソフトウェアの輸入大国ですから、ソフトウェア開発に精通している人は多くありません。 > オブジェクト指向というのは他の方がおっしゃられましたように、大きなプログラ > ムでないと利が少ないということでしょうか。 一概には言えません。たとえば、Windowsなどのユーザ環境(シェル)はオブジェクト指向に精通していれば、ほぼすべての機能をプログラミング可能です。同じように、.NETというものもオブジェクト指向から効率的に学べます。Javaも同じです。しかし、それらの便利な環境は"仕立てられたもの"であり、環境を利用することは"ユーザ"や"ビジネスマン"になることであり、基本的に開発者になることではありません。バージョンが上がるとまた、新しい環境の購入を余儀なくされます。 ソフトウェアとどのようにかかわるのか。この点を考えてみてください。 書籍を読む場合には、自分を失わず、批判的にページからページに移動してください。オブジェクト指向の説明に哺乳類や猫の話が出てくる書籍は、ソフトウェア開発と関係ありません。ソフトウェアを開発することはたいへん難しいことです。
その他の回答 (10)
オブジェクト指向について。 参考URLの書籍を一読してみては如何でしょうか。 ずばり「オブジェクト脳の作り方」です。 評価もまずまずのようです。 Javaを基本にしてますので、Javaを勉強しながらオブジェクト指向を学べます。 私は、オブジェクト指向を完全に理解するのに2年かかりました。 最初は質問者様のように、何がなんだかという感じでしたが業務で開発をするにつれて少しずつ悩みが解決していきました。 なので、そう焦って習得しようとは思わずじっくり学んでいってみてはどうでしょうか。 私のコツは、とにかく多くのコードを書いて試行錯誤してみることです。
- 参考URL:
- http://www.amazon.co.jp/exec/obidos/ASIN/4798104183/tsundoku-22/ref%3Dnosim/250-2641034-3464255
お礼
アドバイスありがとうございます。 じっくり色々やれることを着実にやって行こうと思います。 ご紹介いただきました本ですが、非常にさんこうになりそうですね。今週末、休みが平常になりそうですので、購入してみようと思います。 また、まとめてのお礼になってしまいますが、色々アドバイスを下さった皆様にお礼申し上げます。
- ency
- ベストアンサー率39% (93/238)
No7 ency です。 > ですが、やはりオブジェクト指向は他の方のアドバイスにもありましたが、 > 哲学をやっているような気がします。 それは仕方のないことだと思います。 今回は Java という言語をベースに話をしましたが、オブジェクト指向というのは考え方であり、実際はもっと抽象的なものなんです。 その抽象的なところが「哲学」のように感じられるのでしょう。 オブジェクト指向は、プログラミングの前に行う設計のための道具の一つです。 そのオブジェクト指向の考え方で設計したものを、そのままの形でプログラミングできるように作られた言語が、Java等のオブジェクト指向言語です。 本来の順番はこのように「オブジェクト指向による設計」→「プログラミング」のはずなのですが、いきなり「オブジェクト指向言語でプログラミング」に行こうとするのも、わかりにくくさせる要因の一つなのかもしれませんね。 この順番を知りたい場合には、UML なんかがよくまとまっていると思います。 お時間があれば、勉強してみるのも良いと思います。 あ、UML は言語に依存しないオブジェクト指向による設計の指針の一つですので、Java 等の特定の言語とのつがなりはありません。 …と、ちょっと補足してみました。
お礼
アドバイスありがとうございます。 語弊はあるかもしれませんが、オブジェクト指向という考え方?ということですね。 頭に入れた物を1つ1つ理解できるように地道にやってみます。 UMLについて今検索して見ましたが、時間がある時に読んでみようと思います。
- suseimei
- ベストアンサー率35% (17/48)
> webサイトはgoogle上位サイトを検索してみましたがよく理解できなかった ということですが、その原因をどのように分析していらっしゃいますか? 文面から察すると、あなたはプログラミングが学びたいのでしょう。なら、1000行を越えるプログラムをまず自分なりに作ってみてください。そして、1週間後、そのプログラムを自分で眺めてください。おそらく、どの機能がどこにあるのか分からないと思います。オブジェクト指向を学ぶのはその後でよいと思います。 書籍を読んでも分からない。それは当然です。書籍を書かれた人々は、"オブジェクト指向を知っていると何かと便利だ"、"オブジェクト指向を知っていると利益が出る"、"オブジェクト指向を知っているとプロジェクトがスムーズに進行する"というメリットを認識し、それを(おそらく)実践しているからです。 しかし、オブジェクト指向は万能ではありません。次に紹介するページに目を通してみるとよいでしょう。C++の設計者のStroustrup氏やJavaの設計者のGosling氏に強い影響を与えたSimulaと「オブジェクト」の関係などが紹介されています。 このような歴史の背景に触れておくと、あなたは自分を取り戻せるかもしれません。 http://www.ttoyota.com/personalityofbs/sample00.htm
補足
ご回答ありがとうございます。 理解できない原因は基礎的知識と能力不足かなと思っています。 特に、私自信理解が遅い方で、他の方が一発で分かることも何回か試行錯誤を行ってやっと理解できるタイプだと理解しております。 オブジェクト指向というのは他の方がおっしゃられましたように、大きなプログラムでないと利が少ないということでしょうか。 まずは、URLを読んでみようかと思います。
- ency
- ベストアンサー率39% (93/238)
オブジェクト指向の各用語について、私はこんな理解です。 【オブジェクト】 どちらかというと、要求定義や基本設計の段階で使用する言葉。 「クラスオブジェクト」と「インスタンスオブジェクト」があり、通常単に「オブジェクト」というと「インスタンスオブジェクト」を指すことが多いですね。 実装に依存しない、より抽象的な概念かも。。。 【クラス】 どちらかというと、詳細設計やコーディングの段階で使用する言葉。 クラスオブジェクトの実装という理解で良いと思います。 いわゆる「型」のことで、フィールドと呼ばれるデータとメソッドと呼ばれる振る舞いを持っています。 ちなみに、クラスオブジェクトとクラスは完全に一致します。 このため、基本設計段階でも「クラスオブジェクト」を「クラス」と言ったりします。 【インスタンス】 どちらかというと、詳細設計やコーディングの段階で使用する言葉。 インスタンスオブジェクトの実装という理解でよいと思います。 クラスが「型」なら、インスタンスはその型の変数になります。 インスタンスを new することを「生成する」とか言いますが、要するに複数のインスタンスを動的にいつでもどこでもいくつでも確保できることがオブジェクト指向の本質的なところだと、私は思っています。 ちなみに、インスタンスオブジェクトとインスタンスは必ずしも一致しません。 > AAA aaa = new AAA(); とした場合、aaa は「インスタンス」であり、aaa が参照する実体というかメモリ上に確保された領域が「インスタンスオブジェクト」に相当します。 【メッセージ】 「インスタンスにメッセージを送る」などという言い方で使います。 たとえば、 aaa.message(); の場合、呼び側から見ると「aaa に対して message というメッセージを送信した」と言います。 【メソッド】 メッセージに対する応答。 Java の場合、「メッセージを送る」ことは「メソッドをコールする」ことです。 たとえば、 aaa.message(); の場合、AAA::message(){ ... } という実装があるわけで、これをメソッドと呼んでいます。 このように、メッセージとメソッドは裏表の関係で、呼び元から見ればメッセージ、呼ばれる側から見ればメソッド、ということなんです。 # 少なくとも Java に関しては、この理解で問題ないはず。。。 【蛇足】 メッセージを送信するとかいうと、「スレッドが変わるのか?」と思う人も少なくないようです。 つまり、あるクラスで別のクラスのインスタンスにメッセージを送信する場合の話ですが、そんな重い実装になっているわけがありません。 上記のとおり、メソッドがコールされるだけです。 # そもそも、クラスとスレッドは独立しているというか、無関係な概念ですし。。。 …と、まあ、後半はかなり Java べったりな説明をしてみました。 その他、いわゆるオブジェクト指向の3種の神器(?)と呼ばれる「カプセル化」「継承」「多態」については…入門段階で必ずしも必要な概念だとは思わないので、省略します。 # それなりに大きな規模のプログラムを作ってみないと、これらのありがたみは # 理解しにくいと思うんです。 # というか、そもそもオブジェクト指向って、そういう場で一番威力を発揮する # ものですよね。。。 とりあえず、オブジェクト指向の入り口の理解としては、これで十分だと思います。 あ、引数と戻り値…。 引数はメソッドに入力する必要のある情報 (なくても構いません) のことで、戻り値はメソッドで処理した結果 (こちらもなくても構いません) のことです。 数学で関数 f(x) = 2x + 1 なんてのをやったことがあると思います。 この f(x) の「x」を引数と呼びます。 で、x = 2 を代入すると f(2) = 5 となりますよね。 この「5」を「戻り値」と呼びます。 そして、これら一連の流れを「関数 f(x) に 2 を渡したら 5 を返した (戻した)」と言います。 この「関数」の部分を「メソッド」で置き換えてあげれば引数と戻り値のイメージがつかめるのではないでしょうか。 長々と書いてみましたが、こんな感じでいかがでしょうか。
補足
非常にご丁寧な回答ありがとうございます。 引数については、何となくですがもやっとしていたものが掴めた気がします。 引数、戻り値は関数だと聞き及んだ経験があるんですが、そういうことだったのかと、ぱっと目が覚めました。 ですが、やはりオブジェクト指向は他の方のアドバイスにもありましたが、哲学をやっているような気がします。 多分、私の能力不足なんでしょう、お教えいただきました概念を参考に、書籍、サイトを読み漁ってプログラムを動かしてみようと思います。
- nfonfonfo
- ベストアンサー率63% (12/19)
すでに沢山の人が回答されているので、私はちょっと違った切り口を… 「オブジェクト指向」という言葉で注意していただきたいのは、言葉の意味が文脈によって変わる言葉だということです。(同音異義語と思ってください) よって ・オブジェクト指向分析 ( OOA: Object-Oriented Analysis ) ・オブジェクト指向設計 ( OOD: Object-Oriented Design ) ・オブジェクト指向言語 ( OOL: Object-Oriented Language ) ・オブジェクト指向プログラミング ( OOP: Object-Oriented Programing ) ・上記4つを総称とした言葉。 のどれをその文脈で対象にしているのかを、 注意して内容を吟味してください。
お礼
日本語訳は1つでも言葉の意味が文脈で変わると言うことですね。 ありがとうございます。もしかしたらそういったことが原因で理解を妨げていたかもしれませんので。
今なぜJAVAの勉強をされていますか? ・趣味で使う ・JAVAの仕事につく かでアドバイスがかわってきますが。 その辺の状況をおしえていただけますか。 入門サイト http://www.atmarkit.co.jp/channel/javaentry/javaentry.html http://www.stackasterisk.jp/tech/java/java01_01.jsp 書籍 オブジェクト指向でなぜつくるのか http://item.rakuten.co.jp/book/1678621/ JAVAでなぜつくるのか http://item.rakuten.co.jp/book/1782514/ 資格 SJC-A http://suned.sun.co.jp/JPN/certification/javamain.html
補足
お手数をおかけ致します。 仕事で使うことになりましたので、勉強しております。 以前は簡単なJavaScriptとHTMLコンテンツを作っておりました。
質問にあげられているのは、オブジェクト指向というよりも、言語使用に近いと感じます。 オブジェクト指向とは概念で、オブジェクト指向にはクラスやメソッドという言葉はありません。 JavaでのOOPを理解されたいのか、それともオブジェクト指向の考え方を理解されたいのかどちらでしょうか? オブジェクト指向とは哲学のようなもので、これといった答えがありません。 書籍にあるようなものは、基本的な概念だけでそれを理解するには個人の思想が入ってきます。 ですので、一朝一夕で身につくようなものではありません。 長い時間を掛けて思考錯誤を繰り返して理解していってください。 簡単にですが補足をします。 クラスとは、あるオブジェクトの定義です。メタクラスともいいます。 インスタンスとは、クラスを具象化したものです。 個体です。オブジェクトともいいます。 例えば、「猫」がクラスとすると、サザエさんが飼ってる「タマ」がインスタンスです。 「猫」とは、「タマ」や「ミケ」のような個体の集合を指すもので、「猫」という定義をもってます。 メソッドとは、振る舞いのことで動作と思えばいいでしょう。 それとは別に、プロパティというのがあります。 これは、インスタンスの情報です。 クラスには、振る舞い(メソッド)と属性(プロパティ)を持ってます。 引数や戻り値というのは、一般的なプログラミング言語に共通して言えることなので、オブジェクト指向とは無関係です。
補足
ご回答ありがとうございます。 私と致しましては、オブジェクト指向そのものを理解できればなと思っております。 メソッドなんかもなんとなくは理解できているのですが、いざ説明しようとするとまったく説明になっていなかったので。 よく、メソッドは振舞いと言われているんですが、クラスねこのメソッド食べるをインスタンスのタマが実行するという解釈でおかしくないでしょうか? まだまだ学習不足ですので色々と試行錯誤をして見ようと思います。
- dekopa-
- ベストアンサー率42% (161/378)
最終的には、デザインパターンやUMLといったものも覚える必要があるのですが、もっと基礎から覚えられた方が良いと思います。 一般的なオブジェクト指向入門書は、言語に依存しない概念的な図や説明が多いので、できれば最初は特定の言語に絞った具体例が書いてある書籍を薦めます。 その上で、他の入門書をよめば「ああ、これか」と自分の中の具体例と照らし合わせて覚えることができるようになります。 知人の著作で恐縮ですが、参考URLの「Javaプログラマガ知ツテオクベキコト」をお勧めします。内容はできるだけ平易な表現で、クラスやメソッドの概念から説明しよう、と試みた書籍です。
補足
非常に具体的なご回答ありがとうございます。 こちらは比較的大きな書店に行けばありますでしょうか? 予算が限られて居ますので、できれば現物が見ないカナなどと思っております。
- kazsharp
- ベストアンサー率37% (16/43)
まず、オブジェクト「志向」でなく「指向」です。 そして、質問者さんにぜひ心がけてほしいのは「簡単に身につけようとしない」ことです。 巷には手軽にオブジェクト指向が身につけられそうなタイトルの本がたくさんありますが、本を1冊さっと読んだだけで身につくようなものではありません。 実際に設計やプログラミングを行う試行錯誤の過程で身についてくるものだと思います。 参考URLのサイトでは日本のオブジェクト指向第一人者と言ってもいいSRAの青木さんの本が丸々1冊分読むことができます。 (上のリンクの中の「Books and Papers」をクリックして表示されるページで2冊の本の画像があらわれますが、下の本の「Introduction to Object-Oriented System Analysis and Design」というのをクリックしてください。サイトは英語ですが本の中身は日本語です) この内容を読んでぜひ「本物」のオブジェクト指向を身につけてください。 個人的には雑誌「Java World」に過去連載されていた「オブジェクト指向プログラミングのツボ」という記事を勧めておきます。 手に入れられるならバックナンバーを購入して読んでみてはいかがでしょうか。
お礼
ありがとうございます。 早速ページは全て保存致しました。 発行元に乗っていた時期を問い合わせて、雑誌の方もアマゾンドットコムで購入を検討して見ます。
- teuu
- ベストアンサー率26% (116/443)
もう本屋に行けばその手の本は無限にあると思います… ちなみに私が思うに、 オブジェクト指向というものと、 単なるjavaの文法と、 両方わかってないと思われます。 本来、プログラミングというものは、 ひとつのファイルに延々と書くものでした。 でも読みにくいですよね? しかも、似たようなプログラムを書くときに、 この辺の処理使いまわしたい! ということも当然出てきます。 そんなとき、ある程度の処理を書いておいて、 それをきったり張ったりして、作っていくのがオブジェクト指向言語です。 ~ ~ ここはクラスAを参照して。 ~ ~ ここはクラスBを参照して。 という感じです。 メソッドは、クラスの中の動くものです。 関数と思ってもいいです。 スレッドとほぼ同じ意味かと。 引数と戻り値は、いわゆる数学の関数と同じです。 y=f(x)ってのありましたよね? 実際はy=3x+2みたいな。 xが引数、yが戻り値です。 fというファンクションに、10という引数をいれれば、 32が返ってくる。 で、プログラムは、インスタンスがあってないとダメなのです。 IntだったりStrだったりdoubleだったり。 Int型の変数に小数は入れられないのです。 なんか非常に乱文かつ、あやふやでしかも間違ってる予感もしますが、 簡単に言えば参考になれば幸いです。
お礼
ご返答遅くなりまして申し訳ございません。 なんとなく概念?みないな物は分かるんですが… ちなみに書籍はJAVA言語プログラミングレッスンを使いました。 >>それをきったり張ったりして、作っていくのがオブジェクト指向言語です。 JavaScript(非java)でもJSファイルってのを作りますがそれと同じでしょうか?
お礼
アドバイスありがとうございます。 今日も時間があったので色々目を通してみました。 1つ1つ、頭の中で解釈して、何が必要なのか考えながら勉強して行こうと思います。 まずは書籍との向き合い方を検討しなおして見ます。