【初心者必見】わかりやすい!オブジェクト指向のイメージが感覚的に掴める解説 〜概念編〜
はじめに
プログラミングを学ぶといずれ出会うオブジェクト指向。なかなか理解し難く習得に時間がかかる人も多くいるでしょう。
そこでオブジェクト指向初心者向けに、わかりやすく解説していきます。
解説の対象は概念や考え方です。特定言語での書き方などには触れませんので、言語の壁はありません。また難しい専門用語も使いません。
特に勉強中あるいは解釈に自信がない方、これから勉強を始めたい方にはお勧めします。
他とは違った角度から解説してるので、なんとなーく理解してる方も何か発見があるかもしれません。
※オブジェクト指向は人によって解釈に幅が出やすい分野です。あくまで筆者の解釈であることを予めご理解ください。
オブジェクト指向の考え方
オブジェクト指向とは?
まずいきなり結論です。
オブジェクト指向とは、オブジェクトの相互作用によってシステムを表現するプログラムの一種の書き方です。
この説明で理解できた人はおそらくここから下の説明は読まなくて大丈夫なレベルでオブジェクトを指向を理解していると思います。
ここで「?」となっている方が、読み終えた後には「なるほど!」となれるように説明していきます。
まず、先の結論から分かるように、オブジェクト指向はプログラムの書き方の一つです。
ですから、オブジェクト指向以外にも特徴によって様々な書き方が存在します。(プロセス指向など)
そしてこの書き方の最大の特徴が、オブジェクトの相互作用によってシステムを表現する事です。
この意味がきちんと理解できれば、ある程度オブジェクト指向を使いこなせるはずです。
と言ってもオブジェクトの相互作用ってなかなかイメージが湧かないと思うので、まずはオブジェクト指向がどんなものであるか、その感覚を掴んでいきましょう。
オブジェクト指向のイメージ
オブジェクト指向に最も近いイメージは演劇の台本だと思っています。特に一人芝居の演劇です。
通常、台本には「どの役が」「何をするか」が順序立てて書いてあります。
そして一人芝居の場合、1人の役者が全ての役を演じます。
プログラムは通常「何をするか」"だけ"を順序立てて書きます。
演劇と違い命令の相手は常にCPUなので、役を指定する必要がないからです。
しかし、オブジェクト指向の場合、「どの役で」「何をするか」を順序立てて書きます。つまり、役を指定するのです。
対してオブジェクト指向では無い場合、役を意識せず単純にCPUに対してタスクを命令します。
え、何で役の指定とか面倒くさいことするの?と思ったでしょうか?
答えは単純に"その方が面倒くさく無い場合がある"からです。
例えば「ここのセリフの言い回しを変えて」となった場合、台本を上書きする必要があります。
役があればまず「誰のセリフか」がはっきりするので役名で探せます。そして、「どの辺のシーンか」もセリフから推測できます。
一方、役がなければ「どの辺のシーンか」しかヒントがありません。10ページぐらいの台本ならいいかもしれませんが、300ページぐらいあるとゾッとしますね。
システムも同じで、開発規模が巨大になると「役」を作った方が後々修正や機能追加の際、場所を特定しやすくなります。
他にもメリットはありますが、こう言った理由からプログラムのタスクにも「役」を指定します。
この役に当たるのが「オブジェクト」です。
さらにオブジェクト指向においては、それらオブジェクト同士が相互に作用するようにシステムを作ります。
では、オブジェクト指向の結論でもある「オブジェクトの相互作用」について理解していきましょう。
オブジェクトの相互作用とは?
一旦「オブジェクト」と「相互作用」それぞれに分けて説明します。
オブジェクトとは?
まずオブジェクトとは、上の図にもあるように動作や処理の実行者です。
例えば、「ユーザーに見せる」という処理を担う「画面オブジェクト」、「データベースにアクセスする」という処理を担う「データベースオブジェクト」など他にも色々ありますし、オリジナルでも作れます。
構造が「属性」を表すプロパティと、「動作」であるメソッドの集合ならそれはオブジェクトです。
仮にデータベースオブジェクトなら、プロパティはデータベースのホスト名、ID、パスワードなど、メソッドは「DBと接続する」とか、「クエリを実行する」などでしょう。
相互作用とは?
次に相互作用とは、あるもの同士が互いに影響を及ぼすことを意味します。
つまり、オブジェクト指向とはオブジェクト同士が互いに影響を及ぼすような書き方ということです。
てはどのようにオブジェクトに影響を及ぼすのか、ユーザーのログイン認証を例に見ていきましょう。
どうやって他のオブジェクトに作用するか?
IDとパスワードで認証し、クリアすればホーム画面に、失敗すれば再度ログイン画面に戻すというシステムを想定します。
まず、役や相互作用を意識せず書くとこんな感じになります。
ログイン画面からIDとパスワードを取得
DBからIDに一致するユーザー情報を取得
パスワードに一致するか判定
単純に処理を羅列するだけです。
一方オブジェクト指向の場合はこんな感じになります。
ログイン画面オブジェクトがリクエストデータオブジェクトを生成
DBオブジェクトがID検索メソッドを実行して、ユーザーオブジェクトを生成
ユーザーオブジェクトがパスワード認証メソッドを実行
まず、システムの中に登場する役がオブジェクトとして定義されています。
画面オブジェクト
リクエストデータオブジェクト
DBオブジェクト
ユーザーオブジェクト
それらがメソッドとしてタスクを実行しています。
そして、あるオブジェクトは別のオブジェクトのメソッドによって生成されたり、プロパティを受け取ったり、メソッドの戻り値を受け取ることで影響を受けています。
これがオブジェクトの相互作用でシステムを表現するということであり、オブジェクト指向の本質です。
まとめ
簡単に振り返ります。
オブジェクト指向はプログラムの書き方の一種
オブジェクトという「役」がタスクを担うように書く
オブジェクト同士はメソッドやプロパティを通じて相互に影響を与える
さいごに
今回はオブジェクト指向の概念に焦点を当て説明しました。
なんとなくイメージは掴めましたか?
かなり主観的な解釈ですが、なるべく初心者の方が理解しやすいことを目指しました。
わかりにくいあるいはもっとここ解説してほしいなどあれば、ぜひコメントで教えていただけるとありがたいです。
ただイメージだけでは実装できないので、次回はクラスについて解説しようと思います。
ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?