t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

オブジェクト指向でつまづく7つのポイントと処方箋

こちらの記事で伊藤先生も書かれているように、この数年でVBAのクラスモジュールに関する情報が充実してきている。

これからクラスモジュールについて学習しようと考えている方も沢山(期待を込めて)いらっしゃることと思う。

そこで今回は、オブジェクト指向を学習するにあたってつまづきやすいポイントを紹介し、その処方箋としてアドバイスを書いてみようと思う。

私がオブジェクト指向でつまづきやすいポイントは以下の7つだと考える。

  1. オブジェクト指向の目的が理解できない
  2. オブジェクト指向の悪評に惑わされる
  3. オブジェクト指向の用語がややこしすぎる
  4. オブジェクト指向の前に覚えるべきことを覚えていない
  5. オブジェクト指向の一部の特長を過大に受け止めてしまう
  6. オブジェクト指向での具体的な実装方法が分からない
  7. オブジェクト指向の活用方法が分からない

これらは私自身がつまづいたポイントでもある。こうしてみると結構ある。
では、具体的にどういうことなのか一つずつ説明していく。

オブジェクト指向の目的が理解できない

症状

初心者向けの解説でオブジェクト指向を「たい焼き」とか「動物」に例えて説明されているケースがある。
喩えを持ち出すことは悪いことではないけれど、私自身、それが業務のプログラムにどう繋がるのかサッパリ理解できなかった。
Animalクラスから継承させたDogやCatにワンニャンさせてみたところで、それが何かの役に立つとは思えないのだ。

処方箋

まずオブジェクト指向の最大の恩恵は、データや命令をセットにして扱えることであり、それによりコードをスッキリと分かりやすく記述できることである。
オブジェクト指向はコードを整理整頓する技術であり、それが根本の目的と言っても過言ではない。
何かすごいことをする技術だと思って手を出したけど今一つメリットが分からない、今までの知識でも事足りると感じているとしたら、それはある意味正しい。
散らかった部屋でも人は生きていけるように、コードは汚くても動く。
オブジェクト指向の恩恵は、コードを読んで理解し、メンテナンスする際に初めて実感できるだろう。

オブジェクト指向の悪評に惑わされる

症状

私が専門学校でJavaやVB.Netを習っている頃は、まだまだオブジェクト指向をDisる現役プログラマが沢山いた。オブジェクト指向は高度な考え方であり、そんなものを現場に持ち込んだら破綻する、と。当時の開発現場では使用する言語はJavaでも、中身はCOBOLさながらのゴリゴリの手続き型ロジックで書かれていることが多いと書かれた記事を読んだことを覚えている。
人間、一度身に着けた知識はなるべく長く使い回したいもので、ある程度年齢を重ねてから新しい手法を受け入れるのはとても勇気がいることだ。

処方箋

これは今の若手には関係ない話だと思う。VBA界隈を別としてオブジェクト指向は当たり前のように使われており、その有用性を否定する声は聞かなくなった。むしろオブジェクト指向はもう古い、これからは関数型だなどという意見も耳にするようになったけれど、これを真に受けてオブジェクト指向はもはや用済みだと考えるのは間違い。「オブジェクト指向はもう普遍化しており、今更取り立てて騒ぐようなものではない(つまりプロの開発者なら常識的に身に着けていること)、これから大きく取り上げるべきは関数型だ。」という解釈が正しいと思う。

オブジェクト指向の用語がややこしすぎる

症状

オブジェクト指向の言葉はややこしい。まず「オブジェクト」と「指向」さえもハッキリと分からないという方もいると思う。そのうえフィールドだのメソッドだのインスタンスだのと横文字が並んでいてますます混乱を増長しているようだ。さらに継承・委譲・多態性などという耳慣れない日本語まで登場する。

処方箋

これはオブジェクト指向について詳しく調べている際に陥る罠である。調べれば調べるほど、芋づる式に新しい言葉が出てきてますます混乱する。
しかし、実はVBAに限定すれば、覚えるべき言葉は限られる。例えば「継承」はVBAには存在しないので急いで覚える必要はない。
ここにVBA使いがオブジェクト指向に手を出すにあたって必ず覚えて欲しい言葉と、任意で覚えると良い言葉、覚えなくても何とかなる言葉、むしろ覚えない方が良い言葉の4つに分類しておく。

必ず覚えてほしい言葉 オブジェクト・クラス・インスタンス・プロパティ・メソッド
任意で覚えると良い言葉 メンバー・フィールド・隠蔽・アクセサ・カプセル化・コンストラクタ・デストラクタ
覚えなくてもVBAでは何とかなる言葉 継承・多態性・指向・インターフェース・デザインパターン
VBAではむしろ覚えない方が良い言葉 メッセージ

覚えない方が良い言葉というのは少々言い過ぎかもしれないが、VBAにおけるオブジェクト指向において、メッセージという言葉は不要な混乱を招く。
実はオブジェクト指向には2系統の思想があり、メッセージを扱うのはVBAとは別のオブジェクト指向体系である。従ってメッセージという言葉が登場する解説はVBA使いにはオススメしない。

オブジェクト指向の前に覚えるべきことを覚えていない

症状

なんとなくクラスモジュールに手を出してみたものの、プロシージャ?モジュールレベル変数?引数?戻り値?何それ状態。

処方箋

クラスモジュールを使用するにはプロシージャの分割やモジュールレベル変数、プロシージャ間の値の引き渡し等の前提知識が必要となる。それらの知識が無い場合はまずそこから学習が必要である。VBAも最近は良書が揃っているので自分が理解できるレベルの本で少しずつレベルアップすると良いと思う。
VBAと比べると他の言語は文法の解説書が充実しているので、VBAの書籍で今一つ理解できない場合は、プログラミングの基礎を身に着けるために一旦他の言語に手を出してみるというのも良い経験になると思う。

オブジェクト指向の一部の特長を過大に受け止めてしまう

症状

手続き型しか知らないプログラマがオブジェクト指向を獲得すると、まるで人類の英知に触れたかのような気持ちになり、オブジェクト指向のすばらしさについて語り歩くようになる。特に、オブジェクト指向の3大要素「カプセル化、継承、ポリモーフィズム」と、「いくらでもインスタンスが作れる」というオブジェクト指向の特長が強力なメリットとして強く語られる。また、カプセル化 = 隠蔽という認識が広まっており、オブジェクト指向本来のメリットである「データや命令をセットで扱う」という特長(本来のカプセル化)が霞んでしまっているのはとても残念だ。
結果的にオブジェクト指向は「難しくて大層なモノ」と誤解され、初心者から敬遠されているように思える。

処方箋

オブジェクト指向は単にデータや命令をセットにしてひと塊で扱うための整理整頓の技術である。だからその目的で気軽に使って良い。
なんならデータだけしか使わずにユーザー定義型と同じような使い方だってアリだし、インスタンスを一つしか使わなくても構わない。現にインスタンスが一つであることを保証するテクニック(シングルトン)まで登場しているくらいだ。
私は長らく、「たい焼き」のせいで、「複製しなければオブジェクト指向を採用する意味はない」と誤解していた。オブジェクト指向はもっと気軽に使って良い。

参考記事

thom.hateblo.jp

オブジェクト指向での具体的な実装方法が分からない

症状

私がVBAでオブジェクト指向を採用しようと思ったとき、クラスモジュールの使い方に関する説明は殆ど無かった。よって実際にクラスを作成する段階での記述方法について、思考錯誤しながらとても苦労した覚えがある。

処方箋

今は良書が揃っていてWebサイトでの解説も色々出そろっているのでそちらを参照すると良い。

参考記事

thom.hateblo.jp

オブジェクト指向の活用方法が分からない

症状

クラスモジュールの作り方は分かったが、それを活用する具体的なアイデアが思い浮かばない。

処方箋

これについては当ブログでも色々と記事を書いたので参照していただけると幸いである。
代表的なものは以下。
thom.hateblo.jp

それと、技術が無いとアイデアはなかなか湧いてこない。活用方法の前に、そもそもクラスモジュールの使い方をマスターしているかもう一度学習してみるのも良いと思う。
これは道具が先か、それを使うシチュエーションが先かという問題である。先に道具を知っているからこそ、適切なシチュエーションに遭遇した際に、「ここで使うと良いんじゃないか」と分かる。道具を知らないと、非効率なシチュエーションに何度出くわしても、それが普通のことだと思って見過ごしてしまう。
だからまずは道具であるクラスモジュールについてきちんと学習しておくことが大事。
使いどころは、強引にでも使っているうちに、だんだんわかってくる。

まとめ

オブジェクト指向は分かってしまえばそんな大層な技術ではないのだが、いかんせん学習における罠が多い。オブジェクト指向の学習の成否はいかにワナにハマらないかにかかっていると言っても過言ではない。
これから学習される方は、この7つの罠を注意深く避けて学習を進めるようにしていただけるとスムーズにオブジェクト指向に入門できると思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。