ここから本文です

オブジェクト志向について簡単に教えてください。

yuu********さん

2017/5/2715:57:03

オブジェクト志向について簡単に教えてください。

大雑把でいいので

閲覧数:
91
回答数:
8

違反報告

ベストアンサーに選ばれた回答

itw********さん

2017/5/2721:59:54

オブジェクト指向は色々な面でのメリット・デメリットを持っているので一概には言えませんが、基本的にはデータと関数がセットになっているものと思ってください。
手続き型言語は
「関数にデータを渡して結果のデータを得る」
「関数にデータを渡してデータを書き換える。」
という形が基本ですが、オブジェクト指向は
「データから関数を呼び出して結果のデータを得る」
「データから関数を呼び出して書き換える。」
という形になります。

これによってソースの書き方が異なってきます。

こんな事を考えて見ましょう。
食材A~Eの5つの食材と、フライパンと鍋の2つの調理器具があります。
これを使って
・AとBとCをフライパンに入れていためて料理を作る。
・DとEを鍋に入れて煮込んで料理を作る。
という事を擬似コードで考えて見ましょう。
手続き型の場合は
------------------
struct 食材{
___食材のデータ構造
}
struct 調理器具{
___調理器具のデータ構造
}
function 料理 炒める(調理器具 _ware,食材[] _foods){
___炒めるコード
___return 料理;
}
function 料理 煮込む(調理器具 _ware,食材[] _foods){
___煮込むコード
___return 料理;
}
/*ここまで定義*/
/*ここから実装*/

食材[] forFryPan = {A,B,C};
食材[] forPot = {E,F};
調理器具 fryPan = {フライパンのデータ};
調理器具 pot = {鍋のデータ};
料理 meal1,meal2;

meal1 = 炒める(fryPan , forFryPan);
meal2 = 炒める(pot , forPot );
------------------

となります。
ではこれをオブジェクト指向で書くとどうなるのかというと、こうなります。
(いろんな考え方がありますので、これは一例です)
------------------
class 食材{
___食材のデータ構造
}
class 調理器具{
___食材[] stock;
public:
___void 加える(食材 _food){
______stock += _food; //stockに_foodを追加
___}
___virtual 料理 調理(){return 無;}
}
class フライパン : 調理器具{
public:
___料理 調理(){
______stock内の食材を炒めるコード
______return 料理;
___}
}
class 鍋 : 調理器具{
public:
___料理 調理(){
______stock内の食材を煮込むコード
______return 料理;
___}
}
/*ここまで定義*/
/*ここから実装*/

フライパン frypan;
鍋 pot;
料理 meal1,meal2;

frypan.加える(食材 A);
frypan.加える(食材 B);
frypan.加える(食材 C);
meal1 =frypan.調理();

pot.加える(食材 D);
pot.加える(食材 E);
meal2 =pot.調理();
------------------
となります。
実装部分を見てもらえばわかりますが、「食材を加えて調理する」という考えがそのままコードに記述されています。
これがオブジェクト指向の基本です。

オブジェクトというのは物体という意味です。
ただのデータがあたかも物体のように振舞って見えますよね。
これがオブジェクト指向の基本です。

ほかにも二つオブジェクト指向で一般的な考えが入っていて、その一つが継承という考え方です。(名称は言語により異なります)

フライパンと鍋は、ともに調理器具というオブジェクトを継承しています。
この調理器具は、調理器具として最低限必要であろう、つまり調理器具であれば「共通して持っている機能」をまとめています。
そしてフライパンと鍋は、この調理器具を継承して(受け継いで)いますので、ともに「食材を加える」という機能を定義していなくても使用できます。
この様に似ている機能であればいちいち記述しなくても継承することで、オブジェクトを再利用できます。
車で考えれば、「走る」「曲がる」「止まる」機能を持つ、タイヤ・変速機・シャーシ・エンジンからできた裸の車の上に外装を乗っけるようなものです。
外装を複数用意して車を継承すれば、外装を作る人は車としての基本機能には目をつぶることができます。

残りは再定義という考え方です。
調理するときはフライパンと鍋とで調理手段が違いますので、継承したオブジェクトの調理という動作を上書きしています。
ほとんど同じ機能を有しているものでも、同じ事をしたら必ず同じ結果が返るとは限りません。
こういうときに、すべてを一度継承してから、違うところだけを上書きする。
これが再定義です。

もしこのコードにフードプロセッサーを追加したいときは
class フードプロセッサー : 調理器具{
public:
___料理 調理(){
______stock内の食材を砕くコード
______return 料理;
___}
}
とするだけです。
見た目にも頭にもわかりやすいです。

この様に、オブジェクト指向を利用すると、手続き型ではややこしかった事が、比較的簡単に、また人の考え方に近く表現できたりします。
プログラミングというのは、実行時の高速性も大事ですが、

見やすさ、わかりやすさ、無駄のなさ

もとても大事です。
同じ事を繰り返さないために継承し、データを物体として考えることで人が理解しやすくする。

上の擬似コードでわかるとおり、もともと短い・簡単なコードをオブジェクト指向にすると逆に長くなったりしますが、これが大規模な・多人数な開発になってくると強力な道具になります。

質問した人からのコメント

2017/6/2 23:49:11

みなさんありがとうございます
じっくり考えていきたいです

ベストアンサー以外の回答

1〜5件/7件中

並び替え:回答日時の
新しい順
|古い順

nee********さん

2017/6/219:33:46

オブジェクト指向(object-oriented)から一意に決定できる内容はありません。従い宗教論争なのでそんなもんだと解釈してください。
真面目に考えるだけ馬鹿馬鹿しいです。


さて考現学的に説明します。

■アランケイの日記
「全てを再帰により実現することに現実的な意味があるだろうか?」こんな意味の事を述べています。
つまり、こういう仕事を与えられ、最初のオブジェクト指向言語(環境?)SmallTalkが誕生します。そして初めてobject-orientedという言葉が出てきます。

■アセンブラ技術者の視線
アセンブラで良く使ったサブルーチンをアドレステーブルで管理してこれをクラスって呼んでいるのね。でこれをオブジェクト指向って言っているね。
※オーバライド良く言う、関数の書き換えはテーブル化しているから簡単にできる。オーバライドしたいためにテーブル化したと推論できる。再帰で自分自身を書き換えるために使われなくなったふるい技術を引っ張りだしたようだ。

■実際にC++を多様する視線
クラスライブラリを使うことがオブジェクト志向あるな。
オブジェクト指向の特徴であるライブラリの機能の部分変更ってのはある主の分野では非常に便利。GUIライブラリなんかとくにそう。

■実際にC++を多様する視線その2
オブジェクト指向で開発するとなんか、プログラムが幕の内弁当みたいになるなあ。
なんでもかんでもワンパックにして一箇所に集めるようにある。さしずめ以前のソフト開発はカフェテリア形式かな。なんか一箇所にまとめるのがオブジェクト指向の特長みたいな。

----------------------------


アランケイの日記がオブジェクト指向の本質でしょう。
従来再帰を禁止する方向で発展していたプログラミングを180度回頭し、再帰の可能性を可能な限り追求する。その実現手段で生まれたのがオブジェクト指向しょうね。

とはいえアランケイの日記なんか読んでいる人はいないんで軽くつきあうのが一番です。

bas********さん

2017/5/3017:36:33

私のBlogですが。

http://blog.livedoor.jp/crackstars/archives/391240.html

大体こんな感じかと。

khurataさん

2017/5/3006:32:22

実はオブジェクト指向という言葉が含む意味はたくさんありまして、簡単に書き表すのが難しいのですが…。

最初期のオブジェクト指向プログラミング言語といえば Smalltalk(アラン・ケイ作)と C++(ビャーン・ストゥロフストゥループ作)が挙げられますが、この両者の言っていることからして、違いがあります。

Smalltalk 系のオブジェクト指向は(と、単純に言えるような事ではなく、実際の歴史はかなり複雑であるらしいが、ここではこう言っておく)、
「独立して存在するオブジェクトがメッセージを送り合うことによって実現される」、
「分散並列な協調動作」
というイメージです。
いわゆる C/S システム(クライアント/サーバシステム)が様相としては近いでしょうか。 現在は単一の PC の中でも、多数の機能が C/S として実装・実現されています。

対して C++ 系のオブジェクト指向は(これはその後 Java などに受け継がれ、特に「クラス・ベース・オブジェクト指向」と呼ばれる)、
「動作とデータをクラス構造体として定義し」、
「クラスからまた別の発展クラスを作ることが出来るようして」、
「大規模なシステムを記述しやすくする」
というイメージです。
クラスベース・オブジェクト指向では、実行時にクラスからインスタンスというメモリ・イメージを作ることがよくあり、このインスタンスとクラスのことを「オブジェクト」と総称しています。

また LISP から超発展を遂げた JavaScript のような言語では「プロトタイプ・ベース・オブジェクト指向」と呼ばれる概念が使われており、これはクラスベースとは、また異なる考え方です。

以上を私なりに適当に総括しますと、オブジェクト指向(プログラミング)とは、

「プログラムを『オブジェクトの集合』として設計することにより、設計と実装における『その都度の手間』を著しく軽減することを目指す流儀」

となるでしょうか。

プロフィール画像

カテゴリマスター

原沢信道さん

2017/5/2719:16:14

オブジェクト指向プログラミングは鋳物の型をクラスとして作り、それを使って、いくつかの鋳物をインスタンスとして作り、プログラムを完成させる物です。

tar********さん

2017/5/2717:52:02

プログラムあるいはその設計図を
人間世界におけるマニュアル・手順書
のようなものだとみるとき

オブジェクト(データの固まり)ごとに
あるいは、その種類ごとに担当者を用意して
それぞれの担当者用のマニュアルを書いていく。
それがオブジェクト指向的なやり方。

そんな感じですかね
大雑把にいうと。

そうやって役割分担すると
担当外のことは別の担当者に依頼すればいいから
ある担当者は自分の担当範囲のことに集中できる。
全体として複雑なソフトも
比較的単純な機能の組み合わせに分割して考えられるようになる。
そういうメリットがある。
そんな感じですかね。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる