クラスってなに? ドラえもんで説明するとこういうこと!
VBAでの「クラス」とは、何なんでしょうか。
一言で言うと、「データを預かり、そのデータを処理することが出来る箱」です。
ドラえもんで説明すると以下のようになります。
のび太「ドラえもーん! どこか遠いところに行きたいよ!」
ドラえもん「仕方ないなあ。どこでもドアー!」
これを「ドラえもんクラス」で説明すると、
ドラえもんクラス(Doraemon)の「道具出して(get_tool)」関数に、引数で「遠くに行く」を渡して呼び出すと、ひみつ道具+遠くに行く→どこでもドア、を返す、という流れになります。
このとき、ドラえもんクラスに「(どこでもドアなどの)ひみつ道具」という「データ」があることは、のび太君は知らなくても構いません。知らなくてもドラえもんクラスの「道具出して」関数の内部処理で引数の「遠くに行く」と「ひみつ道具」データの中から適切に回答を返してくれます。
● クラス名:Doraemon
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'// クラスモジュール名: Doraemon.cls Public Function get_tool(request As String) As String Select Case request Case "遠くに行く" get_tool = "どこでもドア" Case "小さくなりたい" get_tool = "スモールライト" Case "空を飛びたい" get_tool = "タケコプター" Case Else get_tool = "対応する道具は見つかりません" End Select End Function |
● メソッド:get_tool(request)
のび太くんのセリフ:
「ドラえもーん! どこか遠いところに行きたいよ!」
→ 呼び出しコード:
1 2 3 4 5 6 |
Dim tool As Variant Dim dora As Doraemon Set dora = New Doraemon tool = dora.get_tool("遠くに行く") MsgBox tool '// →"どこでもドア"が表示 |
例えば「遠くに行く」なら「どこでもドア」、「小さくなりたい」なら「スモールライト」といった具合に、ドラえもんクラスの中でリクエストに応じたひみつ道具を選んで返してくれます。
→ 結果:
=> “どこでもドア”
これがクラスの考え方です。このように「データ」を保持し、その「データ」をどう扱うのかを決めて、その扱い方を関数にしたものが、クラスです。
クラスを使う理由は?
クラスを使う理由は、「あるデータ」を扱う際に、そのデータの「保存先」と「扱い方」を1か所(クラスの中)で管理できることで、そのデータを使いたいときのプログラミングが「ラク」になるからです。
では、どうしてクラスを使うと「ラク」になるのかを説明します。
上のドラえもんクラスを例にします。
のび太君はなぜドラえもんにひみつ道具を出してくれるようにお願いをしているのでしょうか? それは、ドラえもんがひみつ道具を持っていること、そしてお願いするとそれを出してくれることをのび太君が知っているからです。
もし、のび太君がひみつ道具をドラえもんが持っていることを知らなかった場合は、ドラえもん以外の人にも「道具を出して」と要望しなければなりません。また、ひみつ道具をドラえもん以外にも、別の登場人物が持っていた場合、のび太君は誰がひみつ道具を持っているのか知らない状態になり、誰に要望すればいいのか分かりません。
しかし、ドラえもんがひみつ道具を一元管理していることと、それをのび太君が知っていることが組み合わされば、のび太君はドラえもんにだけ要望を伝えればいいことになります。
「データの一元管理とデータ取り出し方法を提供する側(ドラえもんクラス側)」に対して、「クラスを使う側(のび太君)」が呼び出す処理(”道具を出して”という要望)が1回で済みます。これがクラスを使うことでプログラミングが「ラク」になる点です。
大事なのは「データ」です。「データ」を一元管理して、それを取り出す方法を決めておくことが出来るのが「クラス」の役割です。
クラスの説明で、「メソッドとプロパティでどうのこうの」みたいなことを書いてる本やサイトが結構ありますが、メソッドとプロパティはクラスの仕組みの話なだけで、クラスの役割を知る上では重要な点ではありません。
のび太君がドラえもんに要望するのは、「ジャイアンをやっつけて!」でも、「テストの点がよくなるように成績を良くして!」でもありません。「道具を出して!」です。なのでドラえもんクラスは「道具出して」関数を用意していますが、「ジャイアンをやっつける」関数は用意されていないのです。使う側の要望がないので。使う側の要望があればそのときにクラスに関数を用意します。
次回はこのドラえもんクラスを実際にVBAで書くとどのようになるのか? を説明します。
おまけ:たまに見る間違ったクラスの説明
VBAのクラス記事書いてて初心者向けの参考にといくつかサイトを見ましたが、「これでは初心者には伝わりにくいのでは」と思うものが少なくありませんでした。
なんかふわっとして「使ってたら分かります」のような説明放棄をしているものも結構あります。コード書いて慣れるってのは確かにあるんですが、概念の説明はコーディングに慣れることとは別の話です。慣れろという前に「何を理解して慣れればいいのか」を説明してほしいなあと感じました。
以下はなんか違うなーと思った内容です。
×良くない説明1.「クラスはメソッドとプロパティの設計図です」
→この「設計図」というのはクラスの説明でよく見ますが、初心者にそれで伝わるわけないでしょ、と、毎度見る度に思います。クラスとインスタンスの違いが理解できてない段階の人に言う内容ではないです。なお、初心者の方で「インスタンス」って何?となるかもですが、ここでは知らなくてOKです。次回以降の記事で説明します。
×良くない説明2.「クラスは機能をまとめたものです」
→これは雑すぎます。「機能」って何を指してるのか分からないですし、もしメソッドのことを機能って言ってるのならクラスの用途を勘違いしてます。関数を集めたらクラスになるわけではありません。クラスとは「データをどう扱うか」を関数で示す構造であって、単なる機能の寄せ集めではありません。
×良くない説明3.「クラスとはオブジェクトのプロパティとメソッドを定義するものです。オブジェクトがオブジェクトでオブジェクトのオブジェクトは・・・」
→「オブジェクト」という言葉が説明もなく繰り返されると読み手はどんどん混乱します。説明されていない言葉を連呼されても初心者には何も伝わりません。
×良くない説明4.「犬クラスと猫クラスが”鳴く”と、ワンとニャーで・・・」
→Java出始めのオブジェクト指向の悲惨な例の代表です。未だにこれ書いてるんですね・・・これ、何がダメなのかというと、犬や猫は活用できるデータを持っているわけではないからです。生年月日や性別はデータとして持っているかもしれませんが、それを確認するためのメソッドを用意できません。「生年月日は?」と生年月日確認関数で犬猫クラスに聞いても「ワン」「ニャー」が返ってきます。決して「2025年1月2日ですニャー」とはなりません。これではデータを扱えているとは言えません。なので犬クラスはクラスの説明例としてふさわしくありません。
×良くない説明5.「クラスは実際に使ってみると分かります」
→ちゃんと説明しましょう。初心者は分からないから説明を探しているのではないでしょうか。
クラスで重要なのは、データです。メソッドもプロパティも、データをどう扱うのか、という点があってから決まります。これを書かずにメソッドやプロパティのことを説明しても、クラスの目的がデータ主体であることが読み取れません。
クラスは「データの扱い方をひとまとまりで定義する構造」です。この視点が抜けていると、初心者にはなかなかクラスの利点が伝わらないと思います。