連載:熱血VBプログラマ応援団


第2回 VBプログラマに正しいオブジェクト指向は必要か?

―― オブジェクト指向を知らないVBプログラマに贈るオブジェクト指向の学び方 ――

株式会社ピーデー 川俣 晶
2004/04/14
 

− 今回のご相談 −

 Visual Basic 6.0のメインストリーム・サポートが2005/03/31で終わってしまうらしいので、わが社でもそろそろVisual Basic .NETへの移行を考える必要がある、という意見が出始めています。この際、Javaに切り替えようとか、いやC#の方がよいという人もいますが、本当の少数です。選択肢はVisual Basic .NETしかない感じです。

 そこで、私たちも少しずつVisual Basic .NETの勉強会を始めました。そこにとても物知りの学生バイト君が参加してくれることになったのですが、事あるごとに、正しいオブジェクト指向を理解しなければVisual Basic .NETをちゃんと使うことはできない、と主張して困っています。私たちは、Visual Basic 6.0と同程度にVisual Basic .NETが使えればよいと思っているだけなのですが、彼はオブジェクト指向を身に付けないと絶対に駄目だといいます。そうしないと、問題を起こす分かりにくいプログラムしか書けないと主張するのです。

 彼がいうとおり、正しいオブジェクト指向を理解しなければ本当にVisual Basic .NETを使いこなせないのでしょうか? 仮にそうだとすると、私たちには荷が重すぎます。それを勉強するだけで何年もかかりそうです。しかし、目の前の案件は待ってくれません。しかも、学校を出て間もないならともかく、かなり時間が過ぎた私たちに、まとまった量の勉強をまたやれ、というのも無理な話です。

 もしかして、私たちはもう時代遅れだから引退しなければならないのでしょうか?

VB命のV2号 より

Visual Basic .NETはオブジェクト指向プログラム言語

 Visual Basic .NETプログラマを応援する熱血ライター川俣晶です。

 Visual Basic 6.0プログラマがVisual Basic .NETに移行するときに問題になるポイントの1つが、オブジェクト指向というキーワードですね。それに引っ掛かったり、漠然とした不安を感じたりしている人は多いと思います。オブジェクト指向にどのような意味があるか気付かないでいて、いきなり重要だといわれて面食らった人もおられると思います。

 ここでは、あくまで私の個人的な意見を書かせていただきます。オブジェクト指向に対する意見はいろいろなものがあり、違う意見をお持ちの方もいらっしゃると思います。あらかじめお断りしておきますが、以下はあくまで私の個人的な意見です。ここで書かれたお勧めは、あくまでVisual Basic .NETに取り組もうとするVisual Basic 6.0プログラマ向けのお勧めであって、ほかのプログラム言語に取り組む場合にはまた話が違うことを前置きしておきます。

 さて、まず確認しておくことは、Visual Basic .NETはオブジェクト指向プログラム言語であるということです。つまり、Visual Basic .NETの全機能を使いこなす場合には、オブジェクト指向を理解することは不可欠といえます。しかし、私は、あなたの会社にやってきたバイト君と同じ意見ではありません。バイト君ほど厳しい態度を取る必要はまったくないし、逆にバイト君の主張するとおりに行動することがかえって危険であるという可能性もあり得ると思います。その理由はいくつかあります。

  1. オブジェクト指向プログラミングを行わず、従来型プログラミングを行うという選択もあること

  2. Visual Basic 6.0プログラマが完全にオブジェクト指向に無知とはいえないこと

  3. オブジェクト指向といっても示す対象はさまざまであること

  4. 正しい唯一のオブジェクト指向なるものが実在するか疑問であること

 この後、これらの理由について説明をしていきます。

従来型プログラミングができないわけじゃない

 Visual Basic .NETに、Visual Basic 6.0のような従来型のやり方を持ち込んでプログラミングすることは可能です。確かに、同じように記述できない機能もいろいろありますが、それは私の連載などを活用して、個別に確認してその都度変更していけばよいでしょう。その方法で、お客さんが納得するプログラムが作成できるとすれば、それでダメな理由はありません。

 ただ、そのようなやり方を選択した場合、別の問題が発生する可能性が考えられます。例えば、Visual Basic .NETからは.NET Frameworkの膨大なクラス・ライブラリが使えますが、これらはオブジェクト指向プログラミングを前提にしたものです。これらを完全活用するには、ある程度のオブジェクト指向プログラミングの知識が必要になります。

 また、Visual Basic .NETをオブジェクト指向プログラム言語として活用しているプログラマとチームを組んで仕事をする機会が発生した場合、そこで仕事のやり方がかみ合わず、作業が立ち往生する可能性も考えられます。この場合、Visual Basic .NETがオブジェクト指向プログラム言語である以上、どちらかといえば、オブジェクト指向プログラム言語として活用している側が正しいという結論になる可能性は少なくないと思われます。

 しかし、そういうリスクをきちんと理解したうえで、従来型プログラミングを行うという選択は、十分にあり得るものだと思います。それが間違いとまではいい切れません。

Visual Basic 6.0プログラマだって無知ではないはず

 Visual Basic 6.0プログラマは、オブジェクト指向プログラミングに関して、まったくの無知とはいえません。むしろ、無知であると決めつける風潮の方が、無知を露呈しているだけ、といえるでしょう。

 例えば、(FileSystemObjectを使うかどうかは別として)以下のようなNewキーワードを使うコードを書いたことのあるVBプログラマも多いと思います。

Set fso = New FileSystemObject

 これは、オブジェクト指向プログラミングでいうところの「インスタンスの生成」という手順にほかなりません。現実問題として、Visual Basic 6.0には「継承」と呼ばれる機能を除けば、そのほかのほとんどすべてのオブジェクト指向プログラミング機能が含まれていたといえます。それでも、例えばクラスの作成機能など、オブジェクト指向プログラミング機能の大半は使われていないともいわれていますが、まったく使われていないというわけではありません。

 ですから、Visual Basic 6.0プログラマはオブジェクト指向を恐れる必要はないと思います。Visual Basic 6.0プログラマがオブジェクト指向プログラミングを学ぶ場合、最初の1歩からすべてをやり直す必要はないのです。最初の1歩は、すでにVisual Basic 6.0プログラミングの中で踏み出していると思います。

オブジェクト指向といっても示す対象はさまざまであること

 ここで、私が「オブジェクト指向」という言葉と、「オブジェクト指向プログラミング」を使い分けていることに注意してください。この2つはイコールではありません。

 オブジェクト指向と付く言葉は、オブジェクト指向プログラミングだけではありません。開発する対象をオブジェクトという考え方で分析していく「オブジェクト指向分析」、対象をオブジェクトとして設計していく「オブジェクト指向設計」、プログラム開発の方法論である「オブジェクト指向開発プロセス」などの言葉もあります。これらの言葉の総称として、オブジェクト指向という言葉があると考えればよいでしょう。

 では、Visual Basic .NETを学ぼうとするプログラマが知るべき対象は何かといえば、それはオブジェクト指向プログラミングです。Visual Basic .NETがオブジェクト指向プログラミングを行うために作られたプログラム言語である以上、それを完全活用するにはオブジェクト指向プログラミングを学ぶ必要があります。しかし、それ以外のオブジェクト指向設計などは、必ず学ばねばならない、というものではありません。むしろ、それらに手を出すと理解不能の迷宮に迷い込む危険性すらあります。

 なぜ迷宮になってしまうのでしょうか。その理由は簡単です。例えば、オブジェクト指向設計はその名のとおり「設計」を行うための技術であって、プログラミングを行うための技術ではないからです。プログラマの基礎的な素養の一環として、オブジェクト指向設計の概要を学ぶことには価値があるでしょう。しかし、それをすべて理解しなければプログラミングできないと思うのは間違いです。それはプログラミングの技術ではなく設計の技術だからです。

 このような点からいえば、プログラマに対して、オブジェクト指向プログラミングに限定されないすべてのオブジェクト指向技術の知識を厳密に要求するバイト君の言葉は、少々うかつでありすぎるように思います。

正しいオブジェクト指向はどこにある?

 このバイト君の発言について、私が最大の問題だと思う点は、「正しいオブジェクト指向」という言葉にあります。そもそも、「正しい」オブジェクト指向とは何でしょうか? 私が見る限り、オブジェクト指向の正しさの定義は、時代によって、人によって違うように見えます。もちろん、明らかにオブジェクト指向として間違っていると、時代や人を問わずにいわれるものもあります。例えば、たった1つのクラスにあらゆる機能を詰め込んだプログラムは、誰に見せてもオブジェクト指向ではないというでしょう。その間違った状態から離れるために、オブジェクト指向プログラミングについて学ぶ価値があります。しかし、学んだ結果到達すべき特定のたった1つの終着点があるとは思えません。

 どうして「特定のたった1つの終着点」があるとは思えないのかを簡単に説明しましょう。以下は、オブジェクト指向関係の用語が分からないと理解できない部分があると思いますが、分からなくても読み流してください。例えば、10年前には、クラスのメンバに別クラスのインスタンスを持たせることは正しくなく、すべて継承で行うべきといわれていました。しかし、現在のオブジェクト指向プログラム言語では、すべてを継承のみで行うようなプログラミングができないように、多重継承という機能を持たせないことが多くなっています。現在では多重継承を多用したプログラミングは間違いだということになっているからです。つまり、10年前といまでは正しいことの定義が変わってしまったのです。逆に未来に目を向けると、オブジェクト指向でうまく表現できないものを扱うために、アスペクト指向という新しい技術も出てきており、10年後も現在の正しさの常識が通用するか、予断を許さない状況になっているように思えます。このような変化を見ている限り、現在正しいオブジェクト指向といわれているものが、10年後にもやはり正しいかどうか、確信を持つことができません。例えば、5年かけて現在正しいとされるオブジェクト指向プログラミングを学んだとしても、そのころには正しさの基準がずれ始めているかもしれません。そして、10年後には正しさが変わってしまっていて、また勉強のやり直しになるかもしれません。

 もう1つ、人による違いの問題があります。人によっていうことが違う、という現象はオブジェクト指向に限らず、どの世界にもあります。実際、その道のエキスパートですら、相いれない主張を互いに譲らないケースがあるのですから、いかに学生バイト君が物知りだとしても、不勉強や誤解、思い込みのレベルによる知識のズレはあり得ます。そのようなことから考えると、仮にこのバイト君が「正しい」とするオブジェクト指向を完璧にマスターしたとしても、その知識が常に通用するとは限りません。例えば、オブジェクト指向のエキスパートとして実績のあるプロジェクト・マネージャの下で仕事をするようになった瞬間に、何年もかけて苦労して学んだことが、「邪道」の一言で切り捨てられる可能性もあり得ます。

 そのようなことから考えれば、「特定のたった1つの終着点」などというものは存在しないと思った方がよいでしょう。ですから、正しいゴールに達するまではVisual Basic .NETをちゃんと使うことはできない、と思い込んで尻込みする必要はありません。たぶん、その終着点には行こうとしても誰も行けないでしょう。

オブジェクト指向に取り組む方法

 そこで私のお勧めです。オブジェクト指向プログラミングを学ぶ場合、完璧な100%のゴールを目指すよりも、だれもが納得して意見が分かれたりしない80%ぐらいの水準を目指しましょう。それで足りないところは、必要に応じて仕事をしつつ知識を増やせばよいと思います。基礎ができていれば、少しぐらい知識を増やすのは容易なことです。

 はい。ここで80%でもハードルが高いと思った人がいらっしゃるでしょう。しかし、心配する必要はありません。私のお勧めは、最初から80%を目指さないことです。オブジェクト指向プログラミングは、それが1つの知識というわけではなく、実際にはいくつかの要素に分割することができます。カプセル化や、ポリモーフィズムといったそれらの要素に、1つ1つゆっくりと取り組んでいけばよいのです。このようなやり方をお勧めできるのは、Visual Basic .NETが従来型のプログラミングも受け付けるためです。慌てず急がず少しずつオブジェクト指向プログラミングを学びながら、それを従来型のプログラミングに少しずつ取り入れていきましょう。

 そして、オブジェクト指向プログラミングの知識がある水準に達すると、自然と、システム全体の構造をオブジェクト指向にした方がよい、という気持ちがわき上がってくるはずです。その時点で、本格的にオブジェクト指向プログラミングに全面移行すればよいのです。無理をして移行する必要はありません。そういう気持ちがわき上がってきてからで十分だと思います。

 頑張れVBプログラマ、君たちが使うVisual Basic .NETは使うに値する価値あるプログラム言語だ!End of Article

インデックス・ページヘ  「熱血VBプログラマ応援団」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH