オブジェクト指向とは?(Java復習②)

IT

こんにちは、もちきなこです。今日は、前回に引き続きJavaの復習を行っていこうと思います。今回は、基本概念である「オブジェクト指向」について、まとめてみました。まだまだ理解の浅い部分が多いですが、これからまたプログラムを書きながらより理解を深めていこうと思います。この部分は、javaではなくとも、今後ちゃんと理解しておいた方がいいところであるため、随時修正・追記をしながら更新していく予定です。

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

オブジェクト指向とは、効率よくシステム開発をするための設計の基本概念です。Javaはこの概念にそった開発が行える言語仕様があります。

オブジェクト指向の三大要素は、以下の三つが挙げられます。

  • カプセル化
  • 継承
  • 多様性(ポリモーフィズム)

これらはそれぞれ、保守性や再利用性、直観性があり、長く運用できるシステムを作るための考え方が詰まっています。それぞれの詳細を後述して考えながらまとめていきます。

カプセル化

カプセル化とは、オブジェクトの情報を隠蔽した状態で、データの不整合を起こす操作を防ぐ仕組みのことです。フィールドにprivateやprotected修飾子を付け、メソッドにpublic修飾子を付けることによって、決められた範囲外からのアクセスを制限します。指定されたgetterメソッドやsetterメソッドを介してのみデータにアクセスが可能となり、保守性の向上やバグに強いシステムを作ることができます

最初のこの『カプセル化』を学んだ時に、疑問点が2点ほど出ました。

  1. なぜオブジェクトの情報を隠蔽する必要があるのか?(保守性の向上?)
  2. なぜカプセル化することによってデータの不整合が防げるのか?(バグに強くなる?)

1点目の疑問に関しては、フィールドの内容がわかっていなくても、引数のデータを渡す(メソッドはわかっている状態)だけで、どのように値が設定されるかが決まるというのがみそです。処理として、メソッド内部に判定条件があり、条件を満たすと設定されるが、満たさないと設定されないことによって、システムの根幹であるビジネスロジックを隠蔽することができます。

それに加えて、別のオブジェクトが全く同じ名前の変数などを使用しており、直接変数内容を変更してしまうということがなくなります。それによって、別の変数を編集した際に、処理に影響するという可能性をなくすことができるようになります。

2点目の疑問に関しては、例えば、データの限界値が決まっていた場合に、既定の処理を通す(メソッドを通す)ことによって、その限界値を超えないように処理を設定することができます。これによって、データとしておかしい不整合なデータの作成を防ぐことができます。(下限値などに関しても同様です。)

継承

継承とは、共通定義部分を抜き出し、まとめた抽象クラスを、共通部分を使用している具体クラスに使用することです。

例えば、代表的な例だとRPGの冒険者は、【1,戦う 2, アイテム 3, 逃げる】などの行動を共通して持っているとします。そのうえで、それぞれジョブ特有の行動、魔法使いなら【魔法】、シーフなら【盗む】といいった行動が追加されます。すべてのジョブは、『is aの原則』が成り立ち、魔法使いもシーフもすべて冒険者であるという共通の性質は変わりません。

抽象クラスを親クラス、具体クラスを子クラスとも呼んだりしますが、親クラスの内容を子クラスで書き換えることもあり(オーバーライド)、それによってよりコードの再利用性や拡張性が高まります

多様性(ポリモーフィズム)

多様性(ポリモーフィズム)とは、同一の命令を実行時に、それぞれが独立した固有の処理を行うことを言います。プログラミングをしたことがある人はわかりやすいと思いますが、配列をループで処理した際に、引数が違っていても、命令はそれぞれの引数を用いて実行され、固有の処理(それぞれの引数で実行された命令の処理)が行われます。

そして、継承のところでも紹介したオーバーライドについても、この概念がつながっています。

まとめ

色々と調べながらまとめてみましたが、まだまだ理解が浅い部分が多く(特に多様性)もう少し勉強を重ねていこうと思います。オブジェクト指向を復習するきっかけになったアーキテクチャについても、調べながら記事として出していきたいと考えているので、少しずつ知識と理解を深めていきます。

コメント