プログラミング研修講師として避けては通れない大きな課題が、プログラミングをやったことがない方に「オブジェクト指向」が何であるかを伝えることです。オブジェクトという概念自体が非常に抽象化された概念ですので、抽象化されたものをそのまま伝えても、利用イメージが全く喚起されません。
「そもそも、オブジェクトとは?」はNG
この説明を始めてしまうと、ほとんどの物事がオブジェクトになりえるため、オブジェクトとはについての定義付けをしていません。「オブジェクト指向が目指すソフトウエアの世界とは」という哲学論に倒れてしまうと、初心者は全くイメージがつかなくなります。
その為、「オブジェクト指向はプログラムをどう作るかの方法論の1つで、クラス(Class)という単位を最小単位としてプログラムを作るやり方」という前提を置きます。オブジェクト指向を方法論の一つであると割り切れば、「そーゆーやり方があるのか」と割り切って理解してくれます。方法論であるという前提が重要です。
もう1つ重要なのが、変数だけを定義するとか、関数だけを定義することを許容せずに、必ず「クラスXXの変数」「クラスYYの関数」という形で、持ち主を明記する必要があるという決め事を伝えることです。実際のコードを見た時に、確かにそういった性質があるなという所をまずわかってもらいます。
クラス(Class)とは何か
オブジェクト指向の世界では、「全てのデータや関数は何かしらのクラスに属する」必要があると伝えるようにしています。
例えば「name」という変数を宣言した場合、このnameは何の名前なのかを定義する必要があります。個人の名前なのか、建物の名前なのか。関数でも同じです。get_total()という関数がある場合は、何の合計なのかを明確にする必要があります。人数合計なのか売上合計なのか、そういったことです。
持っている属性を変数として行える処理を機能として切り出して、それらの持ち主は一体誰なのかという名前をつけたものが、クラスとなります。
まず、この関係性を理解してもらうことが先です。
どうやってクラスを作るのか
クラスを作るということは、共通している属性を持っている対象を抽象化するということです。抽象化というのは、さまざまな特徴や属性を持つ事象のなかから、他のものと共通の特徴を抜き出してひとまとめにして取り扱うことを指します。
非常に単純に言えば、野球とサッカーに共通している特徴を抜き出すとスポーツです。マグロとイワシに共通している特徴は魚です。こんなイメージでクラスを捉えてもらえれば充分です。
下記に色んな人のイラストがあります。性別も年齢も名前も各々違いますが、共通の特徴を最も大きなレベルでくくると、「人間」という切り口が考えられます。その為、イラストで表現されているものは人間であるということで、抽象化してクラスとして定義しています。共通している属性をまとめてグルーピングして、そのグルーピングに対して名称をつけます。
各々が人間なので人間として持っている共通属性を全て保有しています。OL風の女性もサラリーマン風の男性は、人間ではありますが各々が別の個人です。クラスの情報を全部持っている独立した個体のことをオブジェクトと言います。
人間と分かりにくいかもしれませんので、車で例えます。「プリウス」という車種は1つしかありません。ですが、プリウスの車そのものは、何万台も実在しています。クラスとオブジェクトの関係は、この関係と同じです。
クラスの継承と抽象化
オブジェクト指向3大要素の「カプセル化」「継承」「ポリモーフィズム(多態性)」の説明は、継承だけ理解してもらえれば良いと考えています。継承によってプログラムで表現できる世界が広がることをイメージしてもらうことに重きを置きます。
先程の抽象化をもうすこし噛み砕くと、抽象化による大きな恩恵は、階層構造にすることができる点です。先程の例ですと、「魚」が一般的に持っている特徴はマグロもイワシも同じです。
こういうグルーピングができるようになると、上位のコンセプトを変えると色んなくくり方が出来ます。青魚や白身魚というくくりも可能でしょうし、生息地や旬の時期で括ることも出来なくはありません。共通の属性をどこに見いだすかによって、様々な表現が可能になります。
こういった抽象化を行い色んなモデルを作ることができるのが、オブジェクト指向における継承です。オブジェクトはあくまで個体であり、個体をひとくくりにして抽象化したものがクラスになるというイメージが、鮮明になるはずです。ここまで来ると理屈はなんとなくわかってもらえますので、後は実践(色んなクラスを使ってコードを書く)のみです。
メリットを伝えようと「しすぎない」こと
プログラミングの開発手法や方法論は、やってみてだけでは「なんとなく」で終わってしまいます。写経するなどして型を学び、その型の良し悪しを実践を通じて感じて学び取り、「このデメリットを解消するのであれば、ここを変えよう」という形でより良いものを取り入れる。このステージに来るまでには、当然時間がかかりますので、オブジェクト指向の意味やメリットなどを経験者が初心者に対して「これでもか〜」と前面に出すのは逆効果であると考えています。
オブジェクト指向が道標としてあるべき所は、プログラミングの面白さや奥深さを、具体と抽象を行ったり来たりすることで感じてもらうことではないでしょうか。
プログラミング教育で学んだことを、まとめました
BPStudy#122での発表資料
BPStudy#122〜いかにプログラミングを学ぶか?プログラミング教育を考えるというイベント(勉強会)での、発表資料です。
プログラミングを学ぶ時に「ここがなかなか伝わらなかった」という点をまとめています。