- ベストアンサー
オブジェクト指向
Javaプログラミングを少し勉強し始めました。 そこで、オブジェクト指向という言葉が出てきました。 オブジェクトを作る利点というか意味はどのようなところにあるのでしょうか? 比較的簡単なプログラムなら、変数とメソッドで表示できると思うのですが・・。 ・コードが読みやすくなる ・実行速度が速くなる などの利点があるのでしょうか? なるべく分かりやすく解説してもらえればと思います。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
オブジェクト指向を使うメリットは、 「人間に理解しやすいようにするため」です。 プログラムの動作は、簡単に言えば、「変数があって値が代入され、それを他の変数を使って計算し…」 と言えるわけですけど、それを実際の機能と関連付けないと何をやってるかは見えないですね。 例えば、ある質問があって、「回答する」ボタンをクリックした場合、 「変数QからIDとname、contentを表示し、その下にAを表示させ、さらに下に変数OAがあればその配列から…」 何言ってるか分からないですね。でも非オブジェクト指向のプログラムはおよそこんなイメージです。 これを、 「質問オブジェクトから質問IDと質問者名、質問内容を表示し、その下に回答欄オブジェクトの内容を表示させ、 さらにその下に他の回答オブジェクトがあれば…」 と言えば分かりやすいし、当然、設計書にもこう書かれている。 それなら、その内容をそのままコード化できれば分かりやすいし、他人が見ても理解しやすい。 というわけでオブジェクト指向という考え方ができてきたのです。 ここのサイトも含め、大規模なシステムなんかだとコーディング以前に、 考えておかないといけない業務ロジックが膨大になるわけです。 いろんな制約があったり、入れないといけない機能があったり、時にはワガママも… そんなことを考えていき、高度で緻密でかつ非常に分かりづらい「設計」が出来上がるのですが、 それをさらに分かりにくい変数やら計算処理に置き換えないといけなくなると、 そこでも分かりづらいし、何よりミスが発生しやすい。 設計書に書いてあること(人間が考えていること)を極力そのままコードに置き換えるようにすれば、 作業効率が上がる(はず)という考え方でやっているのです。 ただ、オブジェクトを作成する(設計する)コストは大変だし、コツをつかんでないと かえって非効率なものが出来上がります。 なので、質問者さんの言うとおり、簡単なプログラムほどオブジェクト指向には向いていません。 なのでオブジェクト指向の入門書にあるコードを見てもメリットが分かりづらいのだと思います。 >・コードが読みやすくなる およそその通りですが、「コード」という部分的な捉え方よりも、システム全体の見通しが良くなる、という考えた方が分かりやすいと思います。 >・実行速度が速くなる これはむしろ逆です。 オブジェクト指向の考え方で実際のコードを書くと、一見すると非効率なものができます。 余計なオーバーヘッドが発生しており、非オブジェクト指向の人から見ると、「ムダなコードの塊」 になってしまいます。(ただ、詳細に説明するとちゃんと理解してもらえますが…自分の技術力がないだけかも) ムダなコードがある分、動作速度は確実に遅くなっています。 それよりもシステム全体の理解しやすさ、メンテナンスのしやすさを取った場合にオブジェクト指向を採用するのです。 ※ただし、その遅さもどれほどかは分かりません。 最近のPCだと人間の体感ではほぼ変わらない気もします。
その他の回答 (4)
- visualgraf
- ベストアンサー率50% (1/2)
オブジェクトを複数作る利点としては、ひとつのオブジェクトに対してひとつの役割、という形に切り分けができるという点でしょうか。 また、オブジェクト同士のカプセル化をしておいたライブラリを使うことでプログラマを縛ることができるので、好き勝手なプログラムの書き方を防ぐことができ、コードが統一感を持ってできる、という点もあると思います。このことから、ほかの人が書いたコードも読みやすくなるといえます。 なお、オブジェクト指向にすると、実行速度は遅くなるかと思います。 プログラミングをしていてオブジェクト指向になっているとやりやすいと感じる点は、うまい設計をすればコードを再利用し、似たような処理を何度も書かなくて済む上に一箇所を変更すれば全部に反映させることができる点でしょうか。
- choconamacream
- ベストアンサー率44% (152/338)
/* Stateパターンで、簡単なのを作ってみた。 もちろん、以下のソースを1つの大きなクラス内で実装することも可能。しかし、ここで以下のような機能拡張が発生した場合はどうだろう? 「質問が『締切済』となった後も、新たにコメントを追加できるようにする。」 Javaをちゃんと勉強してきた人なら何をどうすればいいか分るはず。 http://www.techscore.com/tech/DesignPattern/State.html#dp19-3 http://www.hellohiro.com/pattern/state.htm */ import java.util.*; interface State{ public String explain(); public void change(Q_and_A q_and_a); } class ShitsumonState implements State{ public String explain(){ return "「新しい質問をする」"; } public void change(Q_and_A q_and_a){ // ここに、質問用の処理を追加する。 } } class UketsukeState implements State{ public String explain(){ return "「受付中」"; } public void change(Q_and_A q_and_a){ // ここに、回答や補足などの処理を追加する。 } } class Q_and_A{ private State state; public Q_and_A(State state){ this.state = state; } public State getState(){ return state; } public void setState(State state){ this.state = state; } public void message() { System.out.println(state.explain()); state.change(this); } } public class Kakunin{ static public void main(String... pattern){ Q_and_A site = null; boolean boo = false; Scanner scan = new Scanner(System.in); while(true){ System.out.println("質問→1"); System.out.println("回答→2"); System.out.println("終了→9"); switch(scan.nextInt()){ case 1: site = new Q_and_A(new ShitsumonState());site.message();break; case 2: site = new Q_and_A(new UketsukeState());site.message();break; case 9: boo = true;break; } if(boo == true) break; } } }
- buriburi3
- ベストアンサー率44% (353/792)
>比較的簡単なプログラムなら、変数とメソッドで表示できると思うのですが・・。 その通りです。 オブジェクト指向は大規模で複雑なプログラムの開発において、オブジェクト指向以前の方法論では複雑になりすぎで手間隙がかかりすぎる問題を解決する手段として登場していきました。 小さくて簡単なプログラムなら構造化プログラミングや手続き型プログラミングで充分です。 オブジェクト指向はオブジェクト指向プログラミングとオブジェクト指向デザインがごっちゃになって捕らえられてしまい、「オブジェクトとは《物》です」とか「哺乳類クラスから犬と猫を派生して、犬はワンで猫はニャーです」とか訳の分からん概念説明が始まってしまいます。 オブジェクト指向プログラミングにおけるオブジェクトはデータとデータを操作するプログラムのセットでしかありません。 オブジェクト指向プログラミングについては『オブジェクト指向でなぜつくるのか?』と言う本が分かりやすくてお勧めです。 オブジェクト指向プログラミングには ・プログラムの改造/流用(プログラムの部品化)がやりやすい。 ・プログラムの改造に伴う影響範囲を限定しやすい。 という利点があります。
- fortranxp
- ベストアンサー率26% (181/684)
正直言ってオブジェクトとは何かだろうと思います。 オブジェクトは「もの」ですがここで言う意味は 1つのモジュールでいいのではないかと思います。 画面にデータを出力するモジュール、 印刷するモジュール、計算するモジュール、 に分けているだけで実際に使うときのみnewして いるのだろうと思います。 オブジェクトにこだわりコーディングできないので あればMain Methodのみコーディングしてから 新たに同じような繰り返し部分はクラスにして オブジェクト化すればよいと思います。