オブジェクト指向の教え方

自分も研修などで教える立場にたった事がありますが、ただの手続きからオブジェクト指向的な考え方へシフトさせるにはどうしたらいいか?という話題です。

どうしてオブジェクト指向にするのかの1つの理由は、面倒だからっていうのが挙げられると思います。main関数が持つ責任を減らして、自己責任で動いてもらう。細かい指示をしないでも動いてもらう。そういうことが、オブジェクト指向をすることで出来ます。

そしてこれは、大規模プログラムだとか、再利用性を意識したプログラムとか関係無しに、利益があります。何でも自分でやった方が楽だというのも1つの考え方ではありますが、それだけだと限界が訪れますし、なにより疲れます。

http://d.hatena.ne.jp/tek_koc/20090612/1244818231

コメントやブクマでメンドクサイ指摘がされていますが、自分はこれでOKだと思います。

いきなりオブジェクト指向を語る意味がない

初学者に対して最初から「オブジェクト指向とは・・・」と語り出す人がいますが、教える気ないだろ?と思うわけです。やれポリモーフィズムだとか、やれ継承だとか・・・そんな機能を説明しても、まったくパソコンを触ったことがない人にCPUのクロックアップの話を語り出すのと変わりません。
初学者に多いのは、『手続きまでは理解したけどそこから抽象化ができないで躓いている』パターンです*1。最初の壁である変数は理解できた、ifとかforとか配列とかはなんとか解った、でも、そこで2つ目の壁があるわけです。驚くことに場末の開発者だとこの壁を越えられず経験が3年とか5年とかってのがゴロゴロしているわけですが…。

データの抽象を行う

自分が行う最初のステップはデータの抽象化です。
課題としては身長の平均を求めるようなプログラムを作成させた段階で、体重の平均も求めてみようと流れをつくります。元の課題では人数分の配列などを用意しておき、for文で合計させるようなプログラムが出来ているでしょう。ここで同じ人の体重も管理しなくてはならない状況が発生します。
データクラスの概念がない場合、体重用配列を用意し、同じようにfor文で平均を求めます。ところが、このパラメータが増えていくと面倒だよね?というのがデータクラスを投入するトリガーになるわけです。Cでやっているならば構造体の出番ですね。

無駄なことは教えない

ここで注意したいのはいきなりprivate fieldやgetter/setterのようなテクニックを教えてはいけません。次のようなシンプルなクラスを作らせます。

class Person {
  // 身長
  double height;
  // 体重
  double weight;
}

細かいことは後から教えるのがポイントです。ここではPersonクラスというデータのカタマリを用意し、身長と体重をセットで管理していることだけを教えたいので無駄なものは書いてはいけません。

楽をするための機能であること

エントリーにもありますが、オブジェクト指向の機能も関数などの機能もすべて「楽にプログラムを作るための機能」です。ムズカシイ定義や宗教論争は不要です。
データをまとめて扱いたいからクラスを使用する、同じような処理をまとめたいからクラスを作る、データだけど簡単な処理はそのクラスにつけてしまう、共通データを持ったクラスがあるから共通クラスを抽出する、共通の処理と共通の処理パターンがあるから共通処理クラスを作る、もっと抽象度を高めたいのでインターフェイスを導入する・・・と「どうしたら楽に作れるか?」が重要です。
教える場合には厳密な定義なんていらんとです。

*1:個人的には最初からJavaなどのオブジェクト指向言語を使うからなのかな、とも思いますがここで割愛