質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • オブジェクト指向

    332questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

オブジェクト指向とは何ですか?

受付中

回答 9

投稿 編集

  • 評価
  • クリップ 6
  • VIEW 1,345

kaito_fl

score 30

オブジェクト指向をサイト等を参考に自分なりに解釈した結果、

車だったら、車内部のプログラムや構造は知らないけど運転はできる、
鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる

となったのですが、このような考え方でいいのでしょうか?
(これも具体的ではないのでいまいちわかってはいないのですが…)


出来ればプログラミングを全く知らない人でもわかるような具体的な回答お願いします

追記
グローバル変数というのもわからないのでよろしければ一緒に教えてください。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 9

+4

こんにちは。

たぶん、オブジェクト思考ではなく、オブジェクト指向のこうとをお尋ねになっていると思います。

車だったら、車内部のプログラムや構造は知らないけど運転はできる、
鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる 
これもオブジェクト指向プログラミングで得れる特長(情報の隠蔽)ですが、オブジェクト指向はもう1つ大きな特長があります。抽象化/具体化の仕組みです。

例えば、「生命→動物→脊椎動物→哺乳類→犬→ポチ」みたいにだんだん具体化していく流れがあると思います。(逆に辿ればだんだん抽象化しています。)
そして、犬が「おすわり()」って関数を持っているなら、ポチだけでなく近所の犬のジョンも「おすわり()」できます。今、目の前にたくさんの犬がいた時、全部「おすわり()」できます。しかし、猫のタマに「おすわり()」と命令するとエラーが返ってきます。(言語によってエラーが返ってくるタイミングは異なります。コンバイル時だったり実行時だったり。)
例えば、脊椎動物が「bool 卵から生まれる()」関数を持っている場合、哺乳類では「bool 卵から生まれる()」関数を{return false;}と実装するでしょう。そして、そこで実装しておけば、一々犬や猫では「bool 卵から生まれる()」関数を実装する必要がありません。
これが、継承やポリモーフィズムの機能です。
大きな違いだけ把握しておけば、細かい違いを一々気にしないで一緒くたに取り扱えるって本当に便利です。

グローバル変数は、全ての関数からアクセスできる変数です。プログラムの開始~終了まで有効です。
対して、言語によって異なりますが、概ねローカル変数はそれを定義している{}ブロック内だけで有効な変数です。またメンバ変数はそれを定義しているクラスのインスタンスの一部です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こんにちは,
端的に言えば,オブジェクト指向とはプログラムを構成する要素を
オブジェクトという部品としてとらえ その部品同士の協調動作によって 
機能を実現するという プログラミングの考え方です .

グローバル変数とは,どこからでもアクセスすることができる変数のことです.
グローバル変数として宣言されている場合,
変数に代入されている値を,どこからでも得ることができ,値の更新をすることができます.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

とてつもなくざっくりした回答をしてみます.


オブジェクト指向とは,
全ての機能をひとまとめにした物です.(すごくざっくり)
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


例えば,ミュージックプレイヤーの処理の流れを見てみましょう.

オブジェクト指向の対の手続き型処理(関数型処理とも)だと,
/* 音楽を再生 */
function play(ファイル名){
    処理内容
}

/* 音楽を停止 */
function stop(){
    処理内容
}

/* 音楽を一時停止 */
function suspend(){
    処理内容
}

/* 再生時間の移動 */
function seek(再生する時間){
    処理内容
}
………

のように定義し,それぞれをplay()stop()seek(15)のように指定します.



では,オブジェクト指向ではどうなるか?
class 音楽の操作{      //クラス名(オブジェクト指向!!)
    //音楽を再生
    void play(ファイル名){
        処理内容
    }

    //音楽を停止
    void stop(){
        処理内容
    }

    //音楽の再生場所の移動
    void seek(時間){
        処理内容
    }
}
などのように書きます.

このクラス(class)オブジェクトと呼ばれるものを作成する大元で,処理をまとめられます.
例えば,
music = new 音楽の操作
といった形でオブジェクトをmusicという変数に指定してやると,
music.play("ongaku.mp3") や music.stop(), music.seek(12)
のように管理できます.


オブジェクト指向の何が便利か?
それは,オブジェクトを作れば作った分だけすっきり管理できます.
例えば,
music1.play("file1.mp3")
music2.play("file2.mp3")
music3.play("file3.mp3")

music1.seek(12)
music3.stop()
などのように簡単に管理できます.
手続き型言語ではこうはいきません.
面倒です.



次にグローバル変数とは,
どこからでも呼び出すことのできる変数です.
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

普通,変数は定義したカッコの中でしか使えません.
function func(){
    変数A = 3   //変数Aに3を代入します
}

print 変数A   //「変数Aは存在しません」というエラーが出ます

ですが,グローバル変数だと

変数G =10    //グローバル変数

function func(){
    変数A = 10   //変数Aに10を代入します
    変数G = 3    //変数Gに3を代入します(エラーは出ません)
}

print 変数A    //「変数Aは存在しません」というエラーが出ます
print 変数G    //「3」と表示されます

という風に,どこからでも参照できるのです.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

一応、質問のものも当たっていると思います。

私が読んだサイト (どこだったか忘れた... 確か、オブジェクト指向の説明を批判して、オブジェクト指向とは何か。というのをC++で説明していたサイトだったはず。) では、

大雑把に言えば、

従来 ( オブジェクト指向以前 ): 処理できればいい

オブジェクト指向以降: 処理とデータを一まとめにし、タスク分散をはかる

みたいです。

たとえば、

Cでint data を処理する場合、
関数 abc は たまたま int data を処理することになっただけ。
という感じですが、

C++等のオブジェクト指向だと、

class ClassA というクラス の担当を int data関連として処理させる。
そして、役割分担。

また、
クラス:レシピ
オブジェクト: レシピをもとに作った実際のもの
みたいなもの。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

車だったら、車内部のプログラムや構造は知らないけど運転はできる、

この理解はあってます。

例えば、Javaで文字列を扱うとしてStrngを使いますが、
Stringの中身がどう動いているかは知らなくても、
https://docs.oracle.com/javase/jp/6/api/java/lang/String.html
のようなリファレンスを見れば、Stringを使いこなすことは可能です。

鈴木さん(人)だったら、年齢や所在地は知らないけど話すことはできる 

逆にこれは仕様であって、オブジェクト指向であるかないかの論点からは外れていると思います。

「グローバル変数」という用語は、オブジェクト指向から少しずれていると思うので、
考えなくていいです。「変数のスコープ」を勉強してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんばんは。

オブジェクト指向についてということでしたので、少々雑多にはなりますが、説明させていただきます。

まず、オブジェクト指向というのは、現実世界で起こるようなことを抽象的なモデルに落とし込み、プログラム上で実現するための技法です。
これだけでは少々分かりにくいので、具体的な例をあげながら説明しますね。

例えば、「動物」という概念がありますよね。これは非常に抽象度の高いものです。
そして、動物という集合の中には、「犬」だったり「猫」だったりがいるわけです。

しかし、「犬」と「猫」では、鳴き方ですとか、走るスピードですとか、その他にも色々違いますよね。
そういったことをオブジェクト指向では、うまくモデル化していくわけです。

モデル化の仕方を見ていきますね。

まず、動物ができることとして

「動物」→ 「走る」 「鳴く」

があるとしましょう。
これらのことは当然「犬」も「猫」もできます。しかし、それぞれの行動の結果は異なりますので、以下のようになるでしょう。

「犬」→ 「70km/h」 「わんわん」
「猫」→ 「110km/h」 「にゃー」

このように同じ行動でも、振る舞い方が違うわけです。つまり、

「動物」が「走る」と「??」

に対して、動物のところを「犬」や「猫」にしたときに

「犬」が「走る」と「70km/h」
「猫」が「走る」と「110km/h」

となる。
そして、プログラムとして実現するときには、最初の

「動物」が「走る」と「??」

というのを呼び出すときに、「動物」の部分を「犬」や「猫」に入れ替えるだけで、実行の振る舞いを変えることができるわけですね。

これがオブジェクト指向の基本的な考え方です(多層性)。

さて、次はグローバル変数についてですね。
グローバル変数というのは、どこからでも参照できる変数だと思ってください。

int a = 1;

void func() {
  int b = 1;
}

a++; // グローバル変数は参照できる
b++; // エラー

こんなコードだったときに、一番外に書いてあるのがグローバル変数ですね。これはどこからでも参照できます。
しかし、bは関数の中に定義されているので、外からは見れません(ローカル変数)。

これがグローバル変数の説明になります。この辺りは、スコープの話ですので検索してみると色々出てくるかと思います。

以上です。参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

結局のところ、オブジェクト志向とは、「主語」があるプログラミングをしましょうという事だと思います。
オブジェクト志向以前の言語は「Aする。」とか、「BにCする。」といった感じで「主語」のない命令しか出来ませんでした。
これに対して、オブジェクト志向言語は「AがBする。」とか「AがCをBする。」といった、「主語」のある命令ができます。
我々、日本人は「主語」のない文を使い慣れているためこの差は大したことがないように感じますが、欧米人は違います。英語などの欧米の諸言語は「主語」のない文がほとんど出てこないからです。そのため、彼らの場合、「主語」のない命令よりある命令の方が自然に感じます。
この「主語」のある命令がしたいという考えからできたのがオブジェクト志向言語です。
これらのことから、オブジェクト志向とは、「主語」のあるプログラミングをしましょうという事であると言えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

なんか古いのがあがってますね。:-)

出来ればプログラミングを全く知らない人でもわかるような具体的な回答お願いします

プログラミングはコンピューターの黎明期から綿々と研究されてきて
その時々においていろんなアイデアが供されてきました。
で、進化の延長上に現れたのが「オブジェクト指向」です。
これを理解するためには、過去の歴史を紐解くのが分かりやすいのですが…

ということで、上記のリクエストは(ぶっちゃけ)難しいです。
体裁上の特徴を紹介することはできますが、オブジェクト指向の
何がうれしいか? という肝心なところを理解するためには
こちら側へ来てもらうしかないかなあ、と。:-P

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

>>プログラミングを全く知らない人でもわかるような具体的な回答お願いします

電池の具体的な構造とか素材とか知ってますか?私はそれらは知りませんが、目覚まし時計が遅れてきたら電池を交換すれば、改善することを知っています。電池は電力を提供し、それらは使用するとともに衰えていくという概念を知っているからです。

「電池」というという物体が「電力を提供するもの」という概念はまさにオブジェクト指向です。
「いろいろ書いてあるプログラム」を物体としたとき、それは「何かしらを提供するもの」という概念で扱うことができます。まったく「いろいろ書いてあるプログラム」の内容を読まずとも問題はなく、それが何を提供する「もの」なのかを考えればいいわけです。

電池の入れ替えと同様に「問題を扱いやすい抽象的なレベル」で考えられるのがオブジェクト指向のメリットです。

さて、プログラミングのオブジェクトやオブジェクト指向のあり方は実は言語により異なっています。ただ、今書いたような「プログラムを概念ごとにまとめて扱う」というところは共通していると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • オブジェクト指向

    332questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。