オブジェクト指向入門以前 ~手続き型の限界と違い~

スポンサーリンク

対象読者

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

結論

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

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

根拠

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

ネット上にはオブジェクト指向についての解説が数多くあるが、表面的過ぎる内容(構文の説明,犬クラス,猫クラスとか)と抽象的で難しい内容(interfaceが本質とかSOLIDの原則とか)に二極化していて、痒いところに手が届いていない印象を受ける。

本記事では、これだ!という内容をある本で見つけたので、以下で紹介する。

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

手続き型プログラミングは制御プログラムが各種関数を呼び出し、組み合わせることによってプログラムを表現する。

  1. 関数の呼び出し順序
  2. 関数の引数に何を与えるか
  3. 条件分岐
  4. グローバル変数の管理

これら全てを制御プログラムが把握しなくてはならない。当然、一度に把握しなければならない情報が多く、コードは複雑になる。

また、関数の呼び出し順序や条件分岐等を全て制御プログラムが管理している(中央集権)ため、一部分だけ処理を変えようとすると、条件分岐が気持ち悪くなったりするので、柔軟な処理を行うことが難しい。

以下の具体的な問題で手続き型とオブジェクト指向のアプローチを対比することで、その違いを浮き彫りにする。

問題

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

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

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

手続き型アプローチ

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

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

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

オブジェクト指向アプローチ
  1. 次の教室への行き方一覧のポスターを貼る
  2. 「ポスターを参考に各自移動してください」、と言うだけ

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

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

ここで重要なことは、先生は学生について具体的なことを把握する必要がなく抽象的な指示を出すだけ、という点だ。抽象的な指示(メッセージパッシング)に従って、オブジェクト各自が勝手に仕事をしてくれることをポリモーフィズムという。

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

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

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

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

参考

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

コメント

タイトルとURLをコピーしました