対象読者
- オブジェクト指向がなぜ必要か分からない方
結論
手続き型プログラミングとオブジェクト指向の違いは以下である。
- 手続き型プログラミングは中央集権であり、
- オブジェクト指向は地方分権である。
手続き型プログラミングでは、クライアント(main文などの関数の呼び出し側)が全てを管理しなければならず、責任が重すぎる。故に、柔軟性や可読性が下がってしまう。この問題を解決する手段の1つがオブジェクト指向だ。
オープンソースのライブラリやフレームワークを避けて通れない時代が来ている。それらはオブジェクト指向に則って作られており、オブジェクト指向の理解は前提だ。
書籍やネット上の情報をあたると、
- 単純化し過ぎた解説(犬クラス、猫クラスみたいな比喩)と、
- 抽象的で難しい解説(SOLIDの原則、デザインパターン等)
に二極化していて、痒いところに手が届いていない印象を受ける。
手続き型とオブジェクト指向のアプローチを対比する良いという例をある本で見つけたので、以下で紹介する。
例
あなたはとある大学の先生だとする。講義が終わり、
- 教室にいる学生に次の教室に移動してもらわなければならないが、
- 学生毎に行先が異なる。
彼らを移動させるにはどうすればよいか、という問題である。
手続き型アプローチ
まずは聴講学生のリスト(グローバル変数)を取得し、リストの学生毎に以下を繰り返し処理を行う。
- その学生のスケジュールを取得する
- 次の講義を調べる
- その講義の場所を調べる
- この教室からの移動方法を調べる
- その学生に移動方法を教える
先生(制御プログラム)は全てを把握しなければならず大変だし、現実ではこのようなアプローチはなかなかお目にかかれない。まるで子供の世話をしているみたいだ。
オブジェクト指向アプローチ
- 次の教室への行き方一覧のポスターを貼る
- 「ポスターを参考に各自移動してください」、と言うだけ
学生は各自が次のスケジュールについて知っており(プロパティに値を保持)、それを元に先生の指示に従うだけで問題は解決する。
オブジェクト指向アプローチの優れた点
ここで重要なことは、先生は学生について具体的なことを把握する必要がなく、抽象的な指示を出すだけ、という点だ。
「TAの学生は移動する前にプリントの配布を手伝ってもらいたい」、という追加要求が出たとする(システム開発では必ず起こる)。
手続き型アプローチの場合、先生は学生一人ずつをいちいち確認して、そいつがTAだった場合、「移動する前にちょっと手伝ってね、テヘペロ」、などといちいち言わなければならない。main文が条件分岐で汚れるのが目に見えるようだ。
オブジェクト指向アプローチの場合、TAは「移動の前に手伝うことあったよな~」、と知っており、先生の「移動しろ」、という指示を聞いた時に自発的に動いてくれる。先生は楽できる。つまり、main文を修正する必要はない。
先生が学生について知らなくても、学生が勝手に仕事してくれる仕組み(地方分権)だからこそ、追加要求に簡単に対応できる柔軟性を獲得することができるのだ。
手続き型プログラミングによる表現の限界
手続き型プログラミングはmain文が各種関数を呼び出し、組み合わせることによってプログラムを表現する。そのためには、以下の構成要素が必要となる。
- グローバル変数
- 関数(サブルーチン、プロシージャとも言う)
- 条件分岐(if文など)
- 繰り返し文(for文、while文など)
これら全てをmain文が把握しなくてはならない(中央集権)。当然、一度に把握しなければならない情報が多く、コードは複雑になる。
故に、機能追加や変更が難しくなる。変更の影響が他の部分に及んで、思わぬバグが発生したりする。
影響範囲を分離(地方分権)し、処理の制御を細かく分割することで、柔軟なプログラムを作り出せる。
手続き型でも、関数を適切に使うことで、影響範囲の分離はある程度行うことができる。しかし、関数間での値のやり取りにはグローバル変数が必要であり、main文の複雑さを抑えるには限界がある。
このような手続き型プログラミングの限界そのための技術の1つがオブジェクト指向のクラスなのだ。
コメント