TL;DR
色々ともてはやされる「オブジェクト指向」です。
オブジェクト指向を使うことで色々な問題が解決されることがあります。
例えば、private
によって保守性を上げることが出来ます。 継承
や ポリモーフィズム
によって、または Stateパターン
によって条件分岐の複雑性を減らしたりできます。
ただ、こういう考え方自体は、別にオブジェクト指向じゃなくても存在します。
ただオブジェクト指向の方が得意なのです。
というのも実は少しおかしな話で、というかむしろ逆で、「オブジェクト指向」と呼ばれるものがなかった時代のスーパーエンジニア達が考え作りだしてきたスーパーテクニックを、一般大衆が使えるようにまとめあげたものが「オブジェクト指向」なのです。
なので!!
すごくて当然です。
以上
実例
C言語でのスコープの妙技
C言語では、public
やprivate
という言語的な概念はありませんでした。
ただ、C言語時代のエンジニアは、2つのグローバルスコープを使って、それを実現していました。
・ファイルを1オブジェクトと考える
・ファイル内のグローバル変数 … ファイル内からはアクセス可能、他ファイルからはアクセス不可 ≒ Privateなメンバ的な使い方
・ファイルをまたがったグローバル変数 … どのファイルからでもアクセス可能 ≒ Publicなメンバ的な使い方
です。
これによって実装のしやすさを維持しつつ保守性をあげてました。
関数ポインタによるポリモーフィズム
これも黄金パターンですが、C言語では関数ポイントとして関数のポインタを変数で持つことが出来ます。
なので構造体に関数ポインタを持たせることで、変数と関数≒メンバとメソッドをひとまとめにすることは普通に行われていました。
また、関数ポインタを、配列にいれて、イベントが発生するたびに配列の添え字を操作して、処理を切り替えていくというのもドライバ界隈では普通に行われていたことです。関数ポインタの型さえ一緒であれば呼び出しが可能なので、アドレスを入れ替えることで、呼び出し元には手を加えずに、別の処理を呼び出すことができました、
インタフェースが一緒であれば、リンクする .so
を変えることで処理を変えるということもできました。
これはいわゆるポリモーフィズムです。
つまり
ただ、これらはC言語の本来の使い方ではなく(わけではないですが……)、その有効性が明らかであるのにかかわらず、初学者からみるとかなりトリッキーで難易度が高いものでした。
こういう過去の偉人たちのノウハウをまとめて、それを「新たな言語」のレベルまで「新たなパラダイム」にまで持っていったものが「オブジェクト指向」です。
それは、すごくて当然なのです。
実際わたしのまわりの、こういうのを普通にやっていた先輩エンジニア達は、オブジェクト指向が出てきたときにも「別にいままでやってたことだよね?」という涼しい顔をしていました。。。そこまでの道のりを、ぎゅっと縮めてくれたのがオブジェクト指向だと思って、十分にそのメリットを活用していただければと思います。