今回も、「オブジェクト指向」の概念について、解説していきたいと思います。
エンジニア初級の方でも分かるように、頑張って解説していきたいと思います、もしわからない箇所があればコメントで教えていただければと思います。

オブジェクト指向を理解するための3つのステップ
- オブジェクト指向がなぜ必要になったかを知る
- オブジェクト指向の概念を知る
- オブジェクト指向でプログラムを作ろう
オブジェクト指向が必要なった背景、Javaの誕生については以下の記事をご覧ください。
【技術知識】絶対に分かるオブジェクト指向の概念-①Javaの誕生
オブジェクト指向の概念をふんわり知ろう
今回は、オブジェクト指向の概念を何となくでも良いので理解しましょう。
前回は、手続き型プログラミングの課題について説明しました。
課題としては、データに関する操作が各手続きに入ってしまい処理の重複が発生してしまうというものでした。

例えば、上記の図だと、顧データの取得・更新箇所が随所に入っており、顧客データの構造が変わったときの改修が大変になってしまうという課題がありましたね。
もしオブジェクト指向で開発する場合は、どのように問題が解決されるのでしょうか?
それは、一つ、顧客情報というクラスを作成し顧客に関する操作を顧客情報クラスに閉じ込めることで、変更箇所を集約できます。

このようにデータに関する処理を一つのクラスに集約することで、手続き部分とデータ部分が分離されました。
この時に、顧客情報のデータ構造が変わる場合、回収が大きくかかるのは以下のクラスのみになります。

カプセル化
上記の図のように、顧客情報というクラスを作成し顧客に関する操作を顧客情報クラスに閉じ込めることで、変更箇所を集約できました。
そしてオブジェクト指向の考えでは、顧客情報のクラスの持っている情報を、呼び出し側が直接取り出すことはできず、顧客情報クラスが外のクラスに公開したメソッドを通してのみ情報を取得・更新するように作ります。
この、「顧客に関する操作を顧客情報クラスに閉じ込め」、「顧客情報クラスの持つ情報を、呼び出し側が直接取り出せない」という考え方を「カプセル化」と言います。

継承(extend)
分かりやすくするために、少し例を変えます。
自動車というクラスを用意した場合を考えてみましょう。
自動車には、「道路を走る」、「止まる」、「曲がる」などの処理があります。

ここまでは何も問題がありません。
しかし、あなたは次の仕事で自動車以外に、「バス」、「タクシー」、「トラック」というクラスを用意することになりました、そうするとクラスは4つに増えます。

そうすると、同じ処理が重複し始めました。
- 道路を走る
- 止まる
- 曲がる
上記処理は、全部同じ処理にも関わらず各クラスに重複しており、もし止まる処理が変更になった場合に、4つのクラスを改修することになります。

このような時に、「継承」を利用します。
タクシー、バス、トラック、どれも自動車の一部なので、自動車クラスを継承させて、以下の処理は自動車クラスに集約させます。
- 道路を走る
- 止まる
- 曲がる

これで「自動車」クラスを継承したクラスは全て、以下の機能を持つことになります。
- 道路を走る
- 止まる
- 曲がる
また、もしあなたが、電気自動車も作って欲しいと言われた場合、1つ困ることが出てきます。
それは自動車クラスと、「走る方法」が異なるからです。
自動車クラスを継承すると、ガソリンで車を動かす処理になりますが、電気自動車の場合、電力で車を動かします。
このように、継承したクラスの持つ処理の中身を書き換えたいときは、「Override(オーバーライド)」と言って、処理を上書きする事ができます。

実装(Implements)
最後に実装(Implements)の考え方を理解しましょう。
今まで、自動車を例にしてクラス設計を考えてきました。
次にあなたが、水陸両用車のクラスを作ってほしいと言われたらどうしますか?
そんな面倒なものは作れないと思うかもしれませんが、実装(Implements)の考え方を取り込むことで保守性高く開発可能です。
具体的には、「自動車クラス」を継承して、基本的な自動車としての処理を持たせて、そこに水上で走る処理を実装することで水陸両用車のクラスが作れます。

上記の図では水上運転インターフェースを実装して、「水陸両用車」に水上を走る処理を追加しています。
実装(Implements)の良いところは複数の実装クラスを付与可能という点です。
継承は1つのクラスしか継承できませんが、実装(Implements)は何個でも可能ですし、継承と違って、実装を取り外せばその機能の取り外しが可能です。
そのため、パーツのように、色々な自動車にオプションのようにつけたい機能は、実装(Implements)を利用して取り付けしやすいように設計しておくと保守性が高まります。
今回は、オブジェクト指向の概念について説明しました。
次回は、実際にオブジェクト指向でプログラムを書く記事を投稿予定です。
===============
この情報が皆さんの人生のお役に立てれば幸いです。
エンジニアとして日本のITリテラシーを高めていきたいと共感して頂いた人は、是非このブログの拡散とyoutubeの方も見ていただけると嬉しいです。
記事を最後まで見ていただきありがとうございました。
執筆者: hiroエンジニア