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

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

ただいまの
回答率

87.93%

オブジェクト指向のイメージが湧きにくいです。

受付中

回答 12

投稿

  • 評価
  • クリップ 5
  • VIEW 2,193

score 18

最近rubyの勉強を始めたのですが、オブジェクト指向のイメージがよくわかりません。クラスとインスタンスを作ることで具体的に何が便利になるのでしょうか?

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 12

+5

最初のうちはそれほど気にする必要はないと思います。
自分でプログラムを書いて、いろいろ工夫するうちに利点が分かってくるはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+3

私もオブジェクト指向を勉強していて「クラスという金型でたい焼きというインスタンスを作る」とか「犬クラスと猫クラスがあり、それらは動物クラスを継承していて」とか言われても分からない人間でした汗

いろいろ解説記事を読んだ中で、一番しっくり来たのがドラクエでの例えですね(ドラクエ知らなかったらすみませんm(_ _)m

「スライムAがあらわれた。 スライムBがあらわれた。 スライムCがあらわれた」

ここでいう「スライム」がクラスに、「スライムA〜C」がインスタンスにあたります。

スライムというクラスは、スライムのパラメータ(データ)(ex. 攻撃力、防御力、経験値、ゴールド...etc)と行動(メソッド)(ex. 攻撃、仲間を呼ぶ、逃げる)という情報を持っています。クラス自体に実体はありません。

スライムクラスから生成されたインスタンスであるスライムA〜Cは、スライムクラスが持つデータとメソッドを持った実体です。実際に勇者と戦うのはインスタンスです。スライムA〜Cはそれぞれが独立しており、スライムAを倒してもB、Cは健在です。経験値もゴールドも各々のインスタンスからもらうことが出来ます。

他にも、カプセル化やポリモーフィズムなどの概念もドラクエを例に説明していた記事があったのですが失念してしまったので、見つかり次第貼ります。。。中途半端で申し訳ございませんm(_ _)m

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/29 19:25

    ドラクエすごい!
    https://prezi.com/n4amfabz0_rq/

    キャンセル

  • 2016/06/30 10:54

    おぉ、このスライドよくまとまってますね。ありがとうございます!

    キャンセル

+2

古い記事ですが、次の一連の記事を読むとよいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

オブジェクト指向という考え方は突然ぽっと出てきたものではなく、
今まで連綿となされてきたプログラミング開発への改良の延長
と考えてます。なので、オブジェクト指向を単独でみた場合に
「なにがいいのか?」と言われても分かりにくいかも。

あと、大規模な開発をなんとかしたいという流れで
登場したものなので、小さなものを作ってるうちは
なかなか実感がつかめないかもしれませんね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/29 05:04

    Wikipediaより引用
    ---
    オブジェクト指向という言葉は失敗だったと語っている。
    これは、本来オブジェクト指向が重視すべきは「オブジェクト」ではなく
    「メッセージング」であるにもかかわらず「メッセージング」が
    おろそかにされているためである。特に言語の進歩において
    「オブジェクト」や「クラス」の側面ばかり強調される傾向にあり

    キャンセル

+1

こちらがわかりやすいかもです。

http://javalove.hatenablog.com/entry/object-oriented

classは部品みたいなもので
車で例えると

車体
右後輪タイヤ
左後輪タイヤ
右前輪タイヤ
左前輪タイヤ

で成り立っていた場合、

車体ごとに毎回4つのタイヤを定義するのは手間です。

なので、4つのタイヤを部品として作っておき、
インスタンス化することで
プリウスやキューブのタイヤとして実装できます。

classにすることで効率がいいのだと思います。

SE8 Silver落ちた者の回答ですが、こんなところだと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

例えば「ツイート」というクラスがあり、そのクラスはツイートの文章、ツイートのID、ツイートをした人といった情報を持ち、そのツイートに対していいねしたり、リツイートしたり、返信したりという操作ができる、のような設計になっています。

あくまでクラスはそういった設計だけなので、実際に「@hogeさんの2016年何月何日何時何分の『眠い』というツイート」のように特定の実体を指すものではありません。「ツイート」という概念とは何か を表したものがクラスです。

それに対して、インスタンスはそのクラスを基にした実体です。
インスタンスは上述したようなツイートIDやツイートした人などの情報を持っているので、そしていいねするなどの操作も定義されているので、そのインスタンス(ツイート)に対して簡単にいいねしたりリツイートしたりすることが出来ます。

重要なのは、そのインスタンスを利用する側は具体的に いいね はどのような方法で行うのかなど知らなくて良い点です。
具体的に「どうTwitterにプログラムからアクセスしていいねをするのか」を知っている必要があるのはクラスだけです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

オブジェクト指向の良さとしてあがるのは,たくさんありますが簡単に上げますと,

  • (意識すれば)疎結合になる
  • (多態性などをもたせれば) 機能拡張や,機能の再利用がしやすい
  • (カプセル化を正しく行えば)意図しない状態の書き換えを防止でき,安全である

というものだと思います.(他にもメリットはたくさんあると思います)

そして,これらの恩知を受けるような状況というのは,大規模プロジェクトなどです.
なので,趣味プログラミングでは,オブジェクト指向によって得られるメリットがわかりづらい事が多いです.

なぜ,いちいちクラスを分けて書かなくちゃいけないのだ.なぜプライベートにしないといけないのだ.どこからも見えたほうが便利だろ.と思いがちですが,

サービスが大きくなればなるほど,余計な情報が混じっていたりしており,混乱を招きます.
長期運用するような,サービスであれば,機能の増減もあります.
そういった時に真価を発揮します.

  • 疎結合になると何が嬉しいのか
    http://blog.codebook-10000.com/entry/20131108/1383907001

  • カプセル化の重要性
    http://qiita.com/rf141/items/859116606a35152bf715

  • オブジェクト指向という考え方が生まれた背景
    http://qiita.com/hirokidaichi/items/591ad96ab12938878fe1

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

適切な例は出ているので、参考になるかどうか解りませんが。
通信の例
httpの標準ポートは、80ですが
これを、ポート80とポート8080でサービスする場合に、
関数では、80用と8080用の変数を別々で持つ部分(配列など)が出てきます。
これが、2個位では大した事はありませんが、ポートを任意設定などとすると、
変数を幾つ持つか?、仕様上増えたら変数を増やすのか?という事になります。
ダイナミックなクラスでは、雛形のクラスを一つ用意して、new:実体化 する事で、
メモリーが許す範囲で、80、8080、任意のポートへの対応を済ますことが可能です。
COM / TCP / UDB / HTTP だけでなく、1:N、N:Nに相当する事をプログラミングすると、
オブジェクト、クラスの有難味を感じます。

関数呼出の例
関数型処理系では、パラメータ違いで、
同一関数名を使うことは出来ませんが、
関数ABC で、パラメータ Integer
関数ABC で、パラメータ IntegerA、SingleB
関数ABC で、パラメータDouble
と云う事はできず、
関数名を変える必要があります。
(その為、便利機能的付け焼刃が有る場合も。)
オブジェクトでは、多態性をサポートしていれば
同一の呼出名で、パラメータ数違い、
パラメータ種別の違いを扱う事ができます。
⇒作る方、使う方としては、
同一呼出名で、パラメータ違いを許容できる。
似たような機能を同一呼出名で呼出可能
オブジェクト型以前の処理系では、
使用するデータ型毎に、別名の関数が用意されていたりしました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

過去に似たような質問があって、そこで自分のイメージを記載したのでよかったら見てみてください!(ちなみに妖精がーって書いてあるところですw)
https://teratail.com/questions/15207

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

具体的なコードを読むのが一番です。
オブジェクト指向でも、汚く書くことができますので、特に良いコードを読むことをお勧めします。

ほかにも良い本があると思いますし、そこそこ古い本ですが、私は結城浩さんのデザインパターンの本で勉強しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

本来のオブジェクト指向以前の状態だと思うので、クラスとインスタンスについてですが、

文字型って分かりますか。 もうとっくに便利に使いこなしていると思いますよ。
分かんなかったら C言語の文字列操作をやるといいですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-2

javaを4年やってますが、オブジェクト指向なにそれです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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