No.3ベストアンサー
- 回答日時:
オブジェクト指向を使うメリットは、
「人間に理解しやすいようにするため」です。
プログラムの動作は、簡単に言えば、「変数があって値が代入され、それを他の変数を使って計算し…」
と言えるわけですけど、それを実際の機能と関連付けないと何をやってるかは見えないですね。
例えば、ある質問があって、「回答する」ボタンをクリックした場合、
「変数QからIDとname、contentを表示し、その下にAを表示させ、さらに下に変数OAがあればその配列から…」
何言ってるか分からないですね。でも非オブジェクト指向のプログラムはおよそこんなイメージです。
これを、
「質問オブジェクトから質問IDと質問者名、質問内容を表示し、その下に回答欄オブジェクトの内容を表示させ、
さらにその下に他の回答オブジェクトがあれば…」
と言えば分かりやすいし、当然、設計書にもこう書かれている。
それなら、その内容をそのままコード化できれば分かりやすいし、他人が見ても理解しやすい。
というわけでオブジェクト指向という考え方ができてきたのです。
ここのサイトも含め、大規模なシステムなんかだとコーディング以前に、
考えておかないといけない業務ロジックが膨大になるわけです。
いろんな制約があったり、入れないといけない機能があったり、時にはワガママも…
そんなことを考えていき、高度で緻密でかつ非常に分かりづらい「設計」が出来上がるのですが、
それをさらに分かりにくい変数やら計算処理に置き換えないといけなくなると、
そこでも分かりづらいし、何よりミスが発生しやすい。
設計書に書いてあること(人間が考えていること)を極力そのままコードに置き換えるようにすれば、
作業効率が上がる(はず)という考え方でやっているのです。
ただ、オブジェクトを作成する(設計する)コストは大変だし、コツをつかんでないと
かえって非効率なものが出来上がります。
なので、質問者さんの言うとおり、簡単なプログラムほどオブジェクト指向には向いていません。
なのでオブジェクト指向の入門書にあるコードを見てもメリットが分かりづらいのだと思います。
>・コードが読みやすくなる
およそその通りですが、「コード」という部分的な捉え方よりも、システム全体の見通しが良くなる、という考えた方が分かりやすいと思います。
>・実行速度が速くなる
これはむしろ逆です。
オブジェクト指向の考え方で実際のコードを書くと、一見すると非効率なものができます。
余計なオーバーヘッドが発生しており、非オブジェクト指向の人から見ると、「ムダなコードの塊」
になってしまいます。(ただ、詳細に説明するとちゃんと理解してもらえますが…自分の技術力がないだけかも)
ムダなコードがある分、動作速度は確実に遅くなっています。
それよりもシステム全体の理解しやすさ、メンテナンスのしやすさを取った場合にオブジェクト指向を採用するのです。
※ただし、その遅さもどれほどかは分かりません。
最近のPCだと人間の体感ではほぼ変わらない気もします。
No.5
- 回答日時:
オブジェクトを複数作る利点としては、ひとつのオブジェクトに対してひとつの役割、という形に切り分けができるという点でしょうか。
また、オブジェクト同士のカプセル化をしておいたライブラリを使うことでプログラマを縛ることができるので、好き勝手なプログラムの書き方を防ぐことができ、コードが統一感を持ってできる、という点もあると思います。このことから、ほかの人が書いたコードも読みやすくなるといえます。
なお、オブジェクト指向にすると、実行速度は遅くなるかと思います。
プログラミングをしていてオブジェクト指向になっているとやりやすいと感じる点は、うまい設計をすればコードを再利用し、似たような処理を何度も書かなくて済む上に一箇所を変更すれば全部に反映させることができる点でしょうか。
No.4
- 回答日時:
/* Stateパターンで、簡単なのを作ってみた。
もちろん、以下のソースを1つの大きなクラス内で実装することも可能。しかし、ここで以下のような機能拡張が発生した場合はどうだろう?
「質問が『締切済』となった後も、新たにコメントを追加できるようにする。」
Javaをちゃんと勉強してきた人なら何をどうすればいいか分るはず。
http://www.techscore.com/tech/DesignPattern/Stat …
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;
}
}
}
No.2
- 回答日時:
>比較的簡単なプログラムなら、変数とメソッドで表示できると思うのですが・・。
その通りです。
オブジェクト指向は大規模で複雑なプログラムの開発において、オブジェクト指向以前の方法論では複雑になりすぎで手間隙がかかりすぎる問題を解決する手段として登場していきました。
小さくて簡単なプログラムなら構造化プログラミングや手続き型プログラミングで充分です。
オブジェクト指向はオブジェクト指向プログラミングとオブジェクト指向デザインがごっちゃになって捕らえられてしまい、「オブジェクトとは《物》です」とか「哺乳類クラスから犬と猫を派生して、犬はワンで猫はニャーです」とか訳の分からん概念説明が始まってしまいます。
オブジェクト指向プログラミングにおけるオブジェクトはデータとデータを操作するプログラムのセットでしかありません。
オブジェクト指向プログラミングについては『オブジェクト指向でなぜつくるのか?』と言う本が分かりやすくてお勧めです。
オブジェクト指向プログラミングには
・プログラムの改造/流用(プログラムの部品化)がやりやすい。
・プログラムの改造に伴う影響範囲を限定しやすい。
という利点があります。
No.1
- 回答日時:
正直言ってオブジェクトとは何かだろうと思います。
オブジェクトは「もの」ですがここで言う意味は
1つのモジュールでいいのではないかと思います。
画面にデータを出力するモジュール、
印刷するモジュール、計算するモジュール、
に分けているだけで実際に使うときのみnewして
いるのだろうと思います。
オブジェクトにこだわりコーディングできないので
あればMain Methodのみコーディングしてから
新たに同じような繰り返し部分はクラスにして
オブジェクト化すればよいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でフォームのオブジェクト名...
-
時間帯判定をする。
-
Vbで通常使用するプリンターを...
-
サーブレットのクラス図について。
-
パワーポイントのVBAでテキスト...
-
LISTBOXの内容が更新されま...
-
VBAのWindowオブジェクトとWork...
-
VBは、コピペを繰り返して規...
-
Rangeオブジェクトを一時的に作...
-
0埋めについて
-
COMコンポーネントって何?
-
JSPのout.printについて
-
インタフェース Iterator<E>
-
前置と後置
-
StringBuilderのマルチスレッド
-
EXCEL VBAにて動的にCheckBOXを...
-
Excelで =EMBED("Acrobat Docu...
-
オブジェクトレベルとメタレベル
-
C++で*thisは何を指しているの...
-
ビジュアルC++でボタンの有...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
newは明示的にした方が良いのか?
-
オブジェクトレベルとメタレベル
-
0 == False はいいけど
-
ASP.net 教えてください!!(...
-
LISTBOXの内容が更新されま...
-
戻り値がクラスオブジェクト
-
時間帯判定をする。
-
Vbで通常使用するプリンターを...
-
ワードで画像をドロップすると...
おすすめ情報