オブジェクト指向ってどんなもの?

プログラミングを行う上で、作成する製品が大規模になればなるほど、ソースコードは煩雑になり、障害を含む可能性は多くなります。

そんな中でも、第三者が見ても分かりやすく、作る際も少しでも分かりやすいものにして、障害を極力少なくするのは重要な要素でしょう。

今回は、そんな状況を少しでもより良いものにするための方法の1つであるオブジェクト指向という考え方について、まとめます。

スポンサーリンク

オブジェクト指向とは

ソフトウェア開発で行う「設計」や「実装」で用いられる1つの考え方です。

定義された要素をまとめられた「ひな形」から、複数の具体化させた「モノ」を作ります。そして、「モノ」同士の関係性を構築していくようなイメージです。

前書きでも記載しましたが、大規模なソフトウェア開発であるほど、「プログラムの実装」においては以下のような問題点を発生させます。

  • ソースコードの規模が大きくなると煩雑になり、どこで何をしているか分からなくなる
  • ソースコードの引き継ぎ時・改変時などで第三者が見ても理解が難しくなる
  • 理解されないまま改変することで、予期せぬ障害を生む可能性が高くなる
  • 1つの変更をする際に、様々な箇所に手を加えなければならない
  • 修正箇所と他ソースコードとのつながりが不明確で、影響度合いが分からない

このような問題を少しでも改善(解決)するためにも、オブジェクト指向は知っておいた方が良い知識になります。

「設計」においては、ユーザー(顧客)の「要求」や「業務」を分析する際に共通項を見出せるようになるので、「ニーズの理解」「効率の良い開発」の手助けにもなります。

また、「ひな形」同士、「モノ」同士の関係性も示せるので、以下のようなメリットもあるでしょう。

  • システム設計の煩雑化を防げる
  • 特定のモジュールの役割が明確にできる
  • データの受け渡しなどを明確にでき、セキュリティ面での不備を把握できる
  • 認識の共有が容易になる

加えて、システムの構造やふるまいを表現するUML(統一モデリング言語)には、後述の「クラス」の概念も含まれます。

このことからも、オブジェクト指向の重要性が分かるでしょう。

絶対に覚えてほしい用語

ここでは、オブジェクト指向を理解するうえで絶対に必要な知識についてまとめます。

よくある例だとつまらないので、音楽をするバンドを例として、記載していきます。

クラス

クラスとは、定義された要素をまとめた「ひな形」です。どんな特徴があって、何をするものなのか?を定義していきます。

「ひな形」ですので、具体的なものではなく、抽象的なものになります。具体的なものがバンドとして存在する1組1組だとすると全てのバンドの共通事項を集めたようなものです。

そのため、共通事項である「クラス」を変更するということは、全てのバンドに影響を及ぼすということになります。

プログラムにおける「クラス」の要素で設定する代表的なものが、「コンストラクタ」「フィールド」「メソッド」「デストラクタ」の4つです。

フィールド

そのクラスが取り扱うデータ(変数)を設定する領域です。そのクラスが持つ一種の「特徴」や「性質」のようなイメージでも良いかもしれません。

バンドで言えば、「バンド名」「メンバーの人数」「演奏ジャンル」などが挙げられます。

メソッド

そのクラスが行う処理(ふるまい)を記載します。ここでは、そのクラスが「何をするものか?」を記載するイメージです。

バンドで言えば、「練習する」「ライブをする」などです。

「持っているデータをどう扱うか?」「持っているデータで何をするか?」を定義すると言ってもいいかもしれません。

コンストラクタ

後述の「インスタンス化」をされた時に、一番初めに必ず実行されるメソッドです。

基本的には、「フィールドに具体的な値を設定(データの初期化)」などの処理を記載しておくと良いでしょう。

他にも、バンドで言えば、「結成する」のような処理を記載しても良いかもしれません。

対比するものに、デストラクタがあります。

デストラクタ

後述の「オブジェクト」が破棄された時に、呼ばれるメソッドです。

共通して行う後処理(メモリの解放など)を記載すると良いでしょう。バンドで言えば、「解散する」辺りでしょうか。

対比するものに、コンストラクタがあります。

オブジェクト

オブジェクトは、具体的な値を持った「モノ」「実体」です。

何組も存在しているバンドの1組1組を指すイメージです。

そのため、オブジェクトの変更は、変更したバンド1組に大して影響を及ぼすことになります。

インスタンス化

ひな形である「クラス」に具体的な値を設定し、「オブジェクト」にすることです。

それぞれの関係性

クラス、オブジェクト、インスタンス化の関係性を以下のような図で示すことができるでしょう。

オブジェクト指向の3大要素

オブジェクト指向には、「カプセル化」、「継承」、「ポリモーフィズム(多態性)」という3要素が存在します。

これらは、オブジェクト指向には欠かせない極めて重要な概念になります。いずれも先述の「クラス」に深くかかわってくる内容です。

スポンサーリンク

カプセル化

使用するデータを使用する処理と共に隠蔽し、他の処理に影響を及ぼさないような作りにする仕組みのことです。言い換えれば、使用するデータ・処理をまとめて、他からはアクセスできないようにするということになります。

具体的には、「クラス」を用いることで「カプセル化」を実現しています。クラス外との影響を最小限にしています。

これにより、ソースコードを変更する影響を最小限に抑えることができます。また、予期せぬ障害の発生を防止することに繋がります。

なお、使用するプログラム言語(Javaなど)によっては、アクセスできる範囲を「修飾子」で指定することもできます。

継承

「クラス」の処理を引き継ぎ、再利用を可能にする仕組みのことです。これにより、既存の「クラス」をベースとした別の新しい「クラス」を作成することができます。

規模が大きければ大きいほど、似たような「クラス」が必要になることが想定できるでしょう。その場合に、同じ部分の処理を二重三重に記載しなくて良くなります。

また、二重三重に記載した同じ処理が記載された 1つの「クラス」を継承することで、ソースコードの変更も1箇所だけで済むようになります。これにより、メンテナンスは非常に楽なものになるでしょう。

なお、継承される既存のクラスを「スーパークラス(親)」、継承した新しく作ったクラスを「サブクラス(子)」と呼びます。

データ・処理を継承するので、サブクラスはスーパークラスのフィールド・メソッドを利用できます。そして、サブクラスは、スーパークラスとは別の全く新しいメソッドやデータを追加することもできます。

基本的なもの(スーパークラス)から専門的なもの(サブクラス)にすると考えることもできると思います。

ポリモーフィズム

同じメソッド名で、異なる処理を行う仕組みのことです。これは、「同じ機能だけど、細かい処理を変えたい」という時に役立ちます。

実際は、引数の種類や数によって細かい処理を設定する場合(後述の「オーバーロード」)や、継承したクラスのオブジェクトがそれぞれ違った振る舞いをさせることが多いでしょう。

そのため、「ポリモーフィズム」を実現する方法の1つが「継承」があるというイメージです。「継承」の延長線上に「ポリモーフィズム」があると言っても良いかもしれません。

継承とポリモーフィズムの違い

継承は「同じ処理をまとめて共通化し、引き継ぐことで拡張させよう」という方法で、ポリモーフィズムは「同じ処理(機能・メソッド)はまとめつつも、まとられた機能(メソッド)を活かして異なる処理をさせよう」という方法です。

「継承」と「ポリモーフィズム」は似てはいますが、利用する際の「目的」が異なってくるのです。

混同しやすいかもしれませんが、この点を覚えておきましょう。

オーバーライド(再定義)

「継承」と「ポリモーフィズム」に併せて覚えてほしい用語に「オーバーライド」があります。ポリモーフィズムを実施する方法の1つです。

「オーバーライド」なので、「上書き」です。スーパークラスで存在しているメソッドの内容を上書きして、別のものにすることができます。

この時、メソッドを宣言した時の「引数」「型」などは変更してはいけません。あくまで、メソッドで行う処理を書き換えることになります。

例えば、スーパークラスで「演奏する」というメソッドがあれば、サブクラスでは「○○を演奏する」という処理に書き換えるようなイメージです。

この場合、スーパークラスとサブクラスで所有するメソッドの数に増減はありません。

オーバーロード(多重定義)

 「継承」と「ポリモーフィズム」に併せて覚えてほしい用語に「オーバーロード」というものもあります。こちらも、ポリモーフィズムを実施する方法の1つです。

「オーバーロード」では、スーパークラスに存在している元々のメソッドを残しつつ、同名のメソッドを複数定義する方法です。この場合、スーパークラスよりもサブクラスで扱えるメソッドの数は増えることになります。

実装するための条件としては、メソッド名以外の要素で差別化を行います。具体的には、宣言した時の「引数の数」「引数の型」を変更することで実現が可能になります。

そのため、多重定義されたメソッドを呼び出す際の選別は、引数の数で判断されます。

オーバーロードでは、通常のメソッドの他に、コンストラクタを対象にすることもできます。

まとめ

今回は、オブジェクト指向について記載しました。

オブジェクト指向は、PythonやJava、C#など様々な言語で通用する考え方なので、ぜひ参考にしてみて下さい。

スポンサーリンク