中堅エンジニアを相手に、オブジェクト指向プログラミングの指導をするようになって、早いもので10年ぐらいになります。指導を始めたばかりの頃は、かなりひどい評価だったのですが、最近になってようやく受講者を満足させられるようになりました。どのように指導しているかをお教えしましょう。

オブジェクト指向プログラミングとは何か

 最初のテーマは、オブジェクト指向プログラミング(以下OOPと略します)とは何かです。これは、図1に示した例で説明しています。OOPでないスタイルと、OOPのスタイルを比較するのです。

図1 OOPとは何か
(1)OOPでないスタイル(2)OOPのスタイル

 モジュールAが持つ処理が、モジュールBが持つデータを処理するならOOPではありません。それに対して、モジュールAがモジュールBが持つ処理を呼び出し、その処理が自分が持つデータを処理するならOOPです。データと処理をまとめたモジュールをオブジェクトと呼びます。

 OOPでないスタイルと比べて、OOPが一方的に優れているわけではありません。データと処理を別のモジュールにすることを好むプログラマもいれば、一緒にすることを好むプログラマもいます。両者は、プログラムに対するイメージが違うのです。

クラスとオブジェクト

 OOPでは、オブジェクトの定義としてクラスを記述します。オブジェクトとクラスの違いは、データベースに例えるとわかりやすいでしょう。データベースの定義がクラス、レコードがオブジェクトに相当します。

 たとえば、「氏名」と「住所」というデータをまとめて「顧客」というデータベースを定義したなら、「顧客」がクラスに相当します。「山田太郎、東京都」や「鈴木二郎、埼玉県」といったレコードが、オブジェクトに相当します(図2)。

図2 クラスとオブジェクトの違い

継承、カプセル化、多態性

 継承とは、既存のクラスに機能を追加することです。既存のクラスを引き継ぐようなイメージなので、継承と呼ぶのです。OOP言語のメーカーは、WindowsアプリケーションやWebアプリケーションの土台となる基本機能を持ったクラスを数多く提供しています。それらのクラスに機能を追加すれば、短時間でプログラムを作れます。

 カプセル化とは、データと処理を1つのモジュールにまとめることです。カプセルの中に、一緒に入れるイメージです。OOP言語には、データと処理をまとめる構文があります。「データを保護することや、データを隠蔽することがカプセル化だ」と言う人もいます。「それは違う」と言う人もいます。いろいろな人の考えを聞いて、自分の考えに磨きをかけましょう。

 オブジェクトが持つ処理を呼び出すと何が起きるかは、オブジェクト次第です。なぜなら、データも処理内容もオブジェクトが持っているからです。これを多態性と呼びます。「多態性は、分岐処理のようなものだ」と言う人もいます。分岐という言葉を聞くと、多態というイメージが見えてくるでしょう。

自分の言葉でまとめさせ、仲間の考えにも耳を傾ける

 講師が何かを説明するときは、実例を示したり、例え話をしたりします。ただし、筆者の実例や例え話が、すべての受講者にピッタリ合うとは限りません。そこで、ひととおりの説明が終わった後で、受講者に「OOPとは何か」「クラスとオブジェクトの違い」「継承、カプセル化、多態性の意味」を自分の言葉でまとめさせ、全員に発表させています。

 これには、とても効果があります。多くの人の説明を聞くことで、理解が深まるからです。講師は、受講者の理解度を確認することができます。理解が不十分だとわかったら、同じことを違う実例や例え話で説明しています。その場合には、受講者に再度まとめと発表をさせます。最近実施したOOP講座では、まとめの時間が3回ありました。

 このごろ筆者のOOP講座の評価が上がったのは、説明が上手になったからではなく、講座の進め方が上手になったからかもしれません。受講者に自分の言葉でまとめさせることは、OOP講座に限らず、他の講座でも使える指導テクニックです。ぜひ、ためしてみてください。