当文章は筆者が受け持つ授業の副読教材として書くものです。基本的なプログラミングをメソッド(関数)まで履修し、これからクラスを学ぼうとする人に、クラスの構文に固執せずオブジェクト指向プログラミングの本質に触れてもらおうと試みるものです。
オブジェクト指向とは情報制御です
これまで学んできたプログラミングが「情報をどう処理するか」という点を中心に、入出力まで、隅から隅まで考えてきました。一方、オブジェクト指向プログラミングでは「誰が何を知っていて、どの様な処理をするか」という観点に重きを置きます。
プログラミングではない実社会での例を考えてみましょう。
これまで学んできた「情報をどう処理するか」という手法はマニュアル書き・レシピ書きです。豆腐の味噌汁を作るのに、昆布は水から入れて沸騰の前に取り出せだとか豆腐を何cm角に切れだとか味噌を溶いたら沸き立たせるなだとか、そういう手順を事細かに順番に書いたものです。
このマニュアルは非常に便利ですが、では焼き魚定食のためのマニュアルを書くためにはどうすれば良いでしょうか?昨日はサバでしたが、今日は鮭です。お浸しがほうれん草から菜の花に変わりました。きんぴらごぼうの代わりにひじきの煮物にします。このような状況の厨房を預かるあなたはひとつの焼き魚定食マニュアルに固執することはできません。
そこで「誰が何を知っていて、どの様な処理をするか」という手法です。厨房を預かるあなたはそれぞれに担当者を決めます。焼き魚担当、お浸し担当、副菜担当、味噌汁担当、ご飯担当、それぞれに今日作るものを決めさせて、あなたは全体を取りまとめて注文数を管理すれば良いだけです。それぞれの担当者も自分の担当にだけ集中して、必要なら下処理などは部下に命令すれば良いわけです。それぞれの担当者の手元には細かなレシピや材料の在庫状況などの情報があると思います。しかし、取りまとめのあなたに必要なのは今日の献立が何食、どのくらいの時間で出来上がるのかだけです。
情報とそれに対する処理の組み合わせは意外と多くはありません。またそれぞれの情報を保持している担当者間で受け渡す必要がある情報も、システム全体の複雑性と比べれば意外なほど単純で小さなものです。膨大な情報を伝えなければならない時も、情報そのものではなく情報の置き場の情報のみ渡せば良いことがほとんどだからです。この担当者間での情報交換の手法が整っていることが一番重要なのです。
この様に「誰が何を知っていて、どの様な処理をするか」を考えるオブジェクト指向プログラミングでは、それぞれの担当が担う処理と必要な情報を考え、また担当者間の関係性を考えます。この処理と情報を持つ担当者がオブジェクトであり、プログラミング言語上の記法ではその担当者の規格がクラスであり個々の担当者がインスタンスと呼ばれます。しかし、プログラミング言語上の記法など些細なことです。重要なのは組み上げるシステムの構造を抽象的に把握・設計することです。つまり、情報の保持と処理を俯瞰し、各所の共通性と特色を理解し、出来るだけ共通化されかつ独立したパーツの組み合わせにより目的達成する全体像を組み上げることが重要です。オブジェクト指向に慣れるとこの絵のような感覚で各所を構築していく感じになります。
この様なシステムをより効率的に構築するために「継承」などの概念もあります。そして、汎用的な構造は「デザインパターン」と呼ばれます。オブジェクト指向に慣れてきたら調べてみてください。
当文章は CC-BY: Akito D. Kawamura (@aDAVISk)
として公開します。ご自由にお使いください。