どうして必要?オブジェクト指向で開発するただ1つの理由
オブジェクト指向でプログラミングする最大の理由は「仕様変更に強くなるから」です。開発現場では、開発が終わった後に保守運用というフェーズが続きますが、その際に新しい機能の追加や既存の機能の変更などが起こります。オブジェクト指向でプログラミングすることで、この機能変更に強いシステムを作ることができます。
なぜ変更に強くなるのか?その仕組みは一体どうなっているのか?本記事ではオブジェクト指向の触り部分を説明します。
目次
1.オブジェクト指向って何?
オブジェクト指向とはプログラミング言語の開発方法の「考え方」の一つです。Java、C++、C#、ruby、Python、PHPなどの言語で使えます。主に大規模な開発に向いており、従来の「手続き型」はただ上から順に処理をしていく手法なのに対し、オブジェクト指向は「モノ」と「モノ同士の関係の線」と「モノに動作を指示するマネージャー」を「オブジェクト(物体)」として一個ずつ作っていくのが特徴です。
すごく分かりにくいですね。この難しさは初心者の方はもちろん中級者でも苦戦するレベルです。なので簡単な具体例を挙げてみます。
(1)オブジェクト指向の考え方
例えば、今あなたの目の前にはこのページを見るための端末がありますよね?それがスマホかタブレットかパソコンかは分かりませんが、何らかの端末を使って見ているはずです。この端末は「モノ」です。さらにこの端末は色々な部品が中に入っています。分かりやすくパソコンで例えると、「電源」「マザーボード」「CPU」「GPU」「メインメモリ」「SSDやHDD」「ディスクドライブ」などの部品で構成されています。これらの部品も「モノ」です。
それぞれの部品はケーブルで繋がれています。このケーブルは「モノ同士の関係の線」です。ケーブルをつなげることでモノ同士に関係性が生まれます。
パソコンはスイッチを入れると、全てのモノがケーブルを通じて連携して動き出します。この動きを指示するのが「モノに動作を指示するマネージャー」です。
これらすべての物体を「オブジェクト」として捉え、一つずつ設計していこうとする考え方のことを「オブジェクト指向」と呼びます。
2.どうしてオブジェクト指向は必要なの?
オブジェクト指向は「仕様変更に強くする」ために必要なことは冒頭でもお話ししました。手続き型言語より現実とマッチしていて分かりやすいという部分が大きいと筆者は考えています。ここではオブジェクト指向の考え方をさらに広げていきます。
(1)汎化と特化とは
オブジェクト指向を理解するためには「汎化(はんか)と特化」を触りだけでも理解する必要があります。
- 汎化…異なるモノの共通する状態や動作を見つけて抽象化すること。
- 特化…モノの状態や動作に違いを持たせ、具体化すること。
これまた難しいですね。例によって具体例を挙げます。
(2)汎化と特化の具体例
2度目になりますが、あなたは今スマホかタブレットかパソコンか、またはそれ以外の端末のどれかを使ってこのページを見ているはずです。それぞれの端末には、色々な角度から見ると同じ要素が沢山あります。
- ディスプレイがある
- CPU、メインメモリ、SSDなどの部品が入っている
- OSが入っている
- インターネットが使える
- 写真の加工・保存ができる
- 動画を見られる
- 音楽が聴ける
- ゲームができる
- etc…
上記で挙げた同じ要素の中で、上3つが「同じ状態」で、下5つが「同じ動作」です。オブジェクト指向ではこのように同じ要素を抽象化することを「汎化」と言います。
ただ、同じ要素と言っても実際は違いがありますよね?スマホとパソコンではディスプレイの大きさは全く異なるし、OSもWindowsなのかMacなのか、もしかしたらLinuxかもしれません。写真の加工もそれぞれの端末で違うアプリを使っている可能性があるでしょう。似た要素を具体的にすることを、汎化とは逆に「特化」と言います。
(3)「継承」を使うことで仕様変更に強くなる
オブジェクト指向では、汎化したモノを「親」、特化したモノを「子」としてプログラミングし、仕様変更への柔軟性を生みます。「ブラウザ」を例に考えてみましょう。
スマホとタブレットとパソコンを持っていて、スマホでは「Google Chrome」、タブレットでは「Firefox」、パソコンでは「Opera」を使ってwebサイトを見ているとしましょう。この場合「ブラウザ」は親で「Google Chrome」や「Firefox」は子です。
なぜ異なるブラウザで同じようにwebサイトが閲覧できるのか?それぞれのブラウザに違いはあれど、基本的な「webサイトを閲覧する」機能は有しているからです。子は親が持つwebサイト閲覧機能を受け継いでいます。
さて、ここでブラウザに新たな新機能を追加したいとします。子のブラウザたちにも使わせたい機能です。この場合、親のブラウザに新機能を追加するだけで、ChromeやFirefoxでも同じ機能が使えるようになります。子が親の機能を自動的に受け継ぐので、親を正すだけですべての子の振る舞いが正されるからです。つまり、わざわざ子一つ一つに新機能を追加する必要がないので、「修正箇所が減る」んですね。これが「継承」と呼ばれているオブジェクト指向の特徴の一つです。オブジェクト指向は「継承」を使うことで仕様変更に強いプログラムを組むことができます。
3.まとめ
オブジェクト指向のメリットを具体的に解説しましたが、これはほんの一部でしかありません。例えば、Operaには新機能を追加したくない場合はどうするのか?各ブラウザの特徴の違いはどう吸収するのか?等々…。
疑問は学習を進めていくことで解消されます。オブジェクト指向は概念なので理解するのが難しいですが、このページの内容で少しでも分かっていただけていれば幸いです。