対象読者
- オブジェクト指向は単に考え方の1つだと考えている方
- オブジェクト指向に何のメリットがあるのか分からない方
結論
オブジェクト指向は手続き型プログラミングの後継であり、手続き型プログラミングの弱点を補強するための技術である。
根拠
本記事執筆の動機
本記事は、オブジェクト指向信者だった私に対しての職場の先輩の以下のような発言に対する反論として書いた。
オブジェクト指向は考え方の1つに過ぎないよね。
確かに考え方の1つには違いないが、みんな違ってみんないいよね、みたいな話では片づけられない。有用だからこそ、オブジェクト指向が生まれたのだから。
オブジェクト指向が哲学と勘違いされる理由[1]
この勘違いはオブジェクト指向入門にある説明がよろしくないことに起因する。
その説明では、世界の”モノ”に着目し、それを模倣したクラス群を作成し、それらを組み合わせることでプログラミングを行うのがオブジェクト指向だとされる。しかし、実際のプログラミングはそんな定型的な手順で作れるほど単純ではない。初学者はその欺瞞に気づくので、オブジェクト指向を知っても、使うメリットを感じないし、単なるプログラミングに対する哲学の1つであると誤認してしまう。
悪い例
Animalクラスがあり、その具象クラスとして犬クラスや猫クラスがある。それぞれがbark(吠える)メソッドを持っており、犬クラスなら「ワン」、猫クラスなら「ニャー」と吠える。犬と猫に共通の性質は抽象クラスAnimalで定義する。個別の違いは具象クラスで定義する。そうすることで重複を排除できる。「ヒヒーン」と鳴く馬クラスを追加することも容易であり、変更にも強い素敵なコードを作成できる。めでたしめでたし。
悪い例に対する反論
なるほど、そういう考え方もあるのか。でも、敢えてクラスなんて余分なモノを作らなくても、従来通り、グローバル変数を用意して、関数群をまとめたモジュールを呼び出して、組み合わせれば、プログラミングできるよね。重複の排除に関しても、関数を使うことで実現できている。今までも従来の手法で開発できたし、オブジェクト指向を取り入れたい人は勝手にそうすればいいんじゃね?。とどのつまり、考え方の1つに過ぎないよね。
オブジェクト指向は手続き型プログラミングの上位互換
従来の素朴なスタイル(パラダイム)である手続き型プログラミングには限界がある。その限界を補うのに有用なスタイルがオブジェクト指向だ。
上記の反論の通り、クラスなんて余分なものは導入せずに済むならそれに越したことはない。しかし、クラスを導入することにより、プログラミングの表現力は向上し、手続き型プログラミングで実現するには煩瑣な処理を簡単に表現できる。
オブジェクト指向は万能ではないが…
勿論、オブジェクト指向が全てにおいて手続き型プログラミングよりも優れている訳ではない。小規模なプログラムの場合、クラスを作る方が煩わしいこともある。関数型プログラミングというパラダイムもある。問題に応じて、適したパラダイムを使用すべきだ。
使い捨てのコードだと想定して作ったものでも、思いのほか使用され続けることもあるし、流用したいこともある。そういった場面では、グローバル変数と関数をまとめた粒度であるクラスの方が再利用という観点からは有利だ。再利用可能なコードは資産となり、今後のプログラミングを容易にしてくれる。手続き型プログラミングよりも、オブジェクト指向を採用した方がこのメリットを享受しやすいだろう。
コメント