対象読者

  • オブジェクト指向がなぜ必要か分からない方

結論

手続き型プログラミングとオブジェクト指向の違いは以下である。

  • 手続き型プログラミングは中央集権であり、
  • オブジェクト指向は地方分権である。

手続き型プログラミングでは、クライアント(main文などの関数の呼び出し側)が全てを管理しなければならず、 責任が重すぎる。 故に、柔軟性や可読性が下がってしまう。この問題を解決する手段の1つがオブジェクト指向だ。

オープンソースのライブラリやフレームワークを避けて通れない時代が来ている。 それらはオブジェクト指向に則って作られており、オブジェクト指向の理解は前提だ。

書籍やネット上の情報をあたると、

  • 単純化し過ぎた解説(犬クラス、猫クラスみたいな比喩)と、
  • 抽象的で難しい解説(SOLIDの原則、デザインパターン等)

に二極化していて、痒いところに手が届いていない印象を受ける。

手続き型とオブジェクト指向のアプローチを対比する良いという例をある本で見つけたので、以下で紹介する。

例

あなたはとある大学の先生だとする。講義が終わり、

  1. 教室にいる学生に次の教室に移動してもらわなければならないが、
  2. 学生毎に行先が異なる。

彼らを移動させるにはどうすればよいか、という問題である。

手続き型アプローチ

まずは聴講学生のリスト(グローバル変数)を取得し、リストの学生毎に以下を繰り返し処理を行う。

  1. その学生のスケジュールを取得する
  2. 次の講義を調べる
  3. その講義の場所を調べる
  4. この教室からの移動方法を調べる
  5. その学生に移動方法を教える

先生(制御プログラム)は全てを把握しなければならず大変だし、 現実ではこのようなアプローチはなかなかお目にかかれない。 まるで子供の世話をしているみたいだ。

オブジェクト指向アプローチ

  1. 次の教室への行き方一覧のポスターを貼る
  2. 「ポスターを参考に各自移動してください」、と言うだけ

学生は各自が次のスケジュールについて知っており(プロパティに値を保持)、 それを元に先生の指示に従うだけで問題は解決する。

オブジェクト指向アプローチの優れた点

ここで重要なことは、先生は学生について具体的なことを把握する必要がなく、 抽象的な指示を出すだけ、という点だ。

「TAの学生は移動する前にプリントの配布を手伝ってもらいたい」、 という追加要求が出たとする(システム開発では必ず起こる)。

手続き型アプローチの場合、先生は学生一人ずつをいちいち確認して、 そいつがTAだった場合、「移動する前にちょっと手伝ってね、テヘペロ」、 などといちいち言わなければならない。main文が条件分岐で汚れるのが目に見えるようだ。

オブジェクト指向アプローチの場合、TAは「移動の前に手伝うことあったよな~」、 と知っており、先生の「移動しろ」、という指示を聞いた時に自発的に動いてくれる。 先生は楽できる。つまり、main文を修正する必要はない。

先生が学生について知らなくても、学生が勝手に仕事してくれる仕組み(地方分権)だからこそ、 追加要求に簡単に対応できる柔軟性を獲得することができるのだ。

手続き型プログラミングによる表現の限界

手続き型プログラミングはmain文が各種関数を呼び出し、 組み合わせることによってプログラムを表現する。 そのためには、以下の構成要素が必要となる。

  • グローバル変数
  • 関数(サブルーチン、プロシージャとも言う)
  • 条件分岐(if文など)
  • 繰り返し文(for文、while文など)

これら全てをmain文が把握しなくてはならない(中央集権)。 当然、一度に把握しなければならない情報が多く、コードは複雑になる。

故に、機能追加や変更が難しくなる。 変更の影響が他の部分に及んで、思わぬバグが発生したりする。

影響範囲を分離(地方分権)し、処理の制御を細かく分割することで柔軟なプログラムを作り出せる。

手続き型でも、関数を適切に使うことで、 影響範囲の分離はある程度行うことができる。 しかし、関数間での値のやり取りにはグローバル変数が必要であり、main文の複雑さを抑えるには限界がある。

このような手続き型プログラミングの限界そのための技術の1つが オブジェクト指向のクラスなのだ。

参考

  1. オブジェクト指向のこころ [アラン・シャロウェイ]