📗

オブジェクト指向とは

2023/12/28に公開

学びのアウトプットです。

オブジェクト指向とは

一連の処理に使う「変数」や「関数」をひとまとめにして再利用できるように名前をつけてテンプレ化しておく考え方です。

そもそもオブジェクト指向はなぜ必要?

同じ処理を何度も書くことが面倒なため、1つの処理を「テンプレ化」して再利用できるようにしています。
再利用することで、次から書く時はより少ないコードで実現できるというメリットがあります。

関数とはなにが違うのか?

関数とは、再利用できそうな処理を関数として定義しておくことで、次からはその関数を呼び出すだけで処理を行なってくれる便利な仕組みです。
しかし、関数はあくまで決められた1つの処理を行ってくれるものでしかないです。
実際のプログラムでは、1つの処理だけでなく色んなデータを準備したり、いくつもの処理手順を行うことがあり、一連の処理セットが色んな場所で再利用されるような場合があります。

例:メール送信処理

単純なメール処理の場合、関数を1つ呼び出すだけでいいです。
しかし、HTMLメールの送信やファイル添付といった、より高度なメール送信処理を行おうとすると

  • データの準備
  • 内容のチェック
  • ヘッダーやボディの情報の設定
  • 送信処理
  • 送信後のチェック処理
    など様々な処理手順が必要になります。

メールの送信処理は、アプリの色々な場所で行われるので、これら一連の処理を毎回書くのは面倒になります。
そこで、一連の処理に使う「変数」や「関数」群をひとまとめにしてテンプレ化しておこうと考えます。
ある役割を行う「物(=オブジェクト)」として名前を付けて定義しておこうというものです。
今回の場合は、「メール送信を行うオブジェクト」として定義しておこうとなります。

クラスとインスタンス

上記のように「メール送信を行うオブジェクト」として定義されたテンプレートのことを「クラス」といいます。
クラスには、処理に必要な「データ(変数)群」と「処理(関数)群」が含まれます。
クラスの中では、それぞれ「プロパティ」「メソッド」と呼ばれます。

  • データ(変数)群 →プロパティ

    • 宛先
    • 送信元
    • 件名
    • 本文
  • 処理(関数)群 →メソッド

    • チェック処理
    • ヘッダ設定
    • 送信処理
    • 送信後チェック

    実際にメールを送る際は、メールの宛先や、件名、本文などは毎回異なるので、このテンプレを元にして、実際のデータをセットしたものを作成する形になります。
    実際のデータをセットしたものは「インスタンス」といいます。
    金型(クラス)をもとに、製品(インスタンス)を作るようなイメージです。

    オブジェクト指向のメリット

    継承(クラスを継承できる)

    継承とは「能力を引き継ぐこと」です。
    あるクラスの能力を引き継いだ、別のクラスを作ることができます。
    例えば、先ほどの例の「Mailクラス」には、基本的なメール送信処理が実装されていますが、絵文字を送る機能がないため、絵文字を送ることができる新しいメール送信クラスを作りたいとなったとします。
    そこで、新しく「EmojiMailクラス」を作るとします。
    その時、先ほどの「Mailクラス」に書いた様々な処理をまた書くのは面倒くさいです。
    そこで便利なのが継承です。
    「EmojiMailクラス」を作る時に、親クラスとして「Mailクラス」を指定すると、「Mailクラス」の持っている能力(プロパティやメソッド)をそのまま引き継ぐことができます。
    そのため、「EmojiMailクラス」に書くのは、親クラスが持っていない「絵文字を送る」という処理だけでOKです。
    また、親クラスが持っている機能を上書きして書き換えることもできます。

    ポリモーフィズム(使う側は呼び出し方を統一できる)

    呼び出し側は何も考えずにsend()というメソッドを呼ぶだけで、インスタンス化したのがMailクラスなら「通常のメール」、EmojiMailクラスなら「絵文字メール」を送ってくれます。
    send()という統一した命令を行えば、それぞれのクラスに応じた動きをしてくれるというわけです。
    仮に、クラスの機能に追加や修正があった場合にも、呼び出し側のsend()をいちいち修正する必要はありません。

    カプセル化(外部に触れられる必要にないデータは隠すことができる)

    変数を煩雑に管理していると、何かの間違いで変数の内容が書き換えられてしまったりして、バグの元になってしまいます。
    しかし、クラスの中に定義された変数(プロパティ)はクラスの外部に見せるか見せないかというスコープを設定することができます。
    外部に見せない設定を行えば、そのプロパティはクラスの中だけで書き換えることができます。
    外から書き換える場合も、クラスのメソッド経由で書き換える形になるため、より安全になります。

Discussion