VB:「VB 再考 VB はオブジェクト指向言語か?」
いまさらですが。
今朝はおきてからこの内容が頭を離れません。(どんなだよ・・)
ずーっと悶々と脳内議論していたのですが、ちょっと書いてみます。
■ 何でそんなことを考えていたかの背景
なんで、いまさらオブジェクト指向かどうかなんて話題なのかというと
今やっている仕事やフリーソフトを公開する場合のデメリットとして、
.NETじゃないこと、移行しづらいことに原因があります。
VB6 や その技術を使ったVBA(非.net) のような技術を
シュウカツ中も含め散見しましたし、現在そんな仕事をしています。
でも、なんだかVB6ってバカにされてませんか?
Webの人たちからするとVB6 ?ぷふー。
移行できなかった人たち???
的な目線で見られている気がしてなりません。
が、フリーソフトでは、環境が千差万別といえるほどなので、
はっきり言って、.NETは向いていない。と、思っています。
広く環境を制限しない開発がフリーウェアでは
結構、重要だったりするわけです。
そういうネイティブExeが作成できる言語。
VC、VB、デルファイ などがあります。
Javaも比較的軽いランタイムだけで動くと思えば、候補のように
思えますが、クライアントアプリを作る上で、何がよいかにおいて
ネイティブに勝てるわけではなく選択肢にJavaは入れません。
というより、Webに強いだけでクライアント用のGUI機能が
貧弱なものについては、正直却下なのが心情かもしれないし、
私が嫌いなだけかもしれない。
が、時代はJava ですよね。
UI だってJava + αであればなんでもよいわけです。
けど+αを最初から考えるならWFPで充分なわけで・・。
やはりあえて、特別にJava を選ぶ理由はない気がします。
なので、結果、レガシーでもお客さんがそれでよいならそれで。
と、なることもあるわけです。
そこに参加している人は多いわけで、少しでもバカにされない理由を
考えてみたいなぁ・・と、妄想してました。(w
移行できなかった人々。。ぷっふー。
って、思われてそうな理由のひとつに
VB6技術者は、.NETに移行しにくいなんて迷信があるけど、
どちらかというと本当はJava技術者のほうが来ない気がしています。
C#ですら、Noな感じでした。
この迷信の裏には、VB6 = 非オブジェクト指向言語。
という定着が進んでしまったというのもあるかもしれない。
2001年ごろ、確かにそんな話題が持ちきりで、.NETはガンガンに違いない!
って、私も思ってました。
蓋を開けてみると手続き型でも書けてしまう・・。(← 書くなってほどじゃない。
なんだこれ・・??(← こっちのほうが衝撃的だったわ。w
というより、根本が間違っていたわけで。
VB6は、オブジェクト指向言語じゃない!。では、ない。w
というのが、自分の中の答え。
正確には、色々加味してこれなんですが、少なくともVb6技術者は、
.NETにチェンジできる知識しかない。
ではなく、意図して使いこなしていないだけ。ということが最大の理由。
Set objA = new myClass()
これのどこが新しかったのでしょう?
つまり、そういうことだと思う。(厳密にはもっと。)
なので、少しでも自分がバカにされている気分を晴らすために書いてみます。
というより、自分で納得したいだけ?
■ そもそもオブジェクト指向 ってなに?
まずはこの話に決着しないとダメですよね。
存亡危機のウィキペを使って読んでもらうと、こんな感じ。
そう重要なのは、オブジェクト指向 と呼ばれる条件(構成概念の項)です。
本などを読むと、オブジェクト指向と呼ばれる条件として毎回出てきます。
聞き飽きましたよね。
・カプセル化
・継承
・多様性多態性(ポリモー なんとかw
・動的束縛?????
(失礼・・。なんか、多様性って書いちゃったw@2011.11.01)
そう・・・なんだこれ!!??
4つ?3つじゃねぇのかよ!?
(ときどき、多重継承が4つめだったりしますね。)
と、思う人とそうでない人。いるはず。
説明にも書いてあります。
この特性を備えていないオブジェクト指向言語もある。
と。
ここ一番重要です。
そんで、説明がスゴイわかりにくい(とうか、なってない!)ので
書いてみると、
オブジェクト指向言語 と呼ばれるための条件、それは
カプセル化できるかどうか。
だけです。
ってことは・・・ぉい!
VB6はオブジェクト指向言語ですか?
ってなります。
まぁ、話のネタ元はこういうことです。
頭の中で考えた妄想。(いや、よく言われるんだけど)
誰か:「VB6って、オブジェクト指向言語じゃないジャン!」
私:「厳密な意味ではね。」
誰か:「厳密って・・負け惜しみするなよwwwwwww」
てなのをよくやられるわけです。
で、上の話を言うわけです。
すると、
誰か:「でも、最近はこの3つでオブジェクト指向が一般的だよねww」
と、当然なる。
それは、このwikiを読んで疑問に思った人ほとんどそれかな。
なので、こう答える。
私:「主流がそれであれば、厳密な意味では、Javaも違いますよねw」
誰か:「?」
そう。多重継承はどうしましたか?
いつからJavaは厳密な意味でのオブジェクト指向言語に進化したの??
バージョンを教えてくれ。
(ぃや本当に・・いつ対応したの??してないの??どっち?)
記憶では、Java は多重継承できなかった。
今時点2010年の何かを読んでもダメとある。
というより、オブジェクト指向言語の条件と書いたけど、これらは
正確にはオブジェクト指向言語の要素でしかない。
全部を実現すると無駄が増えるので結局のところ
2011年11月時点では完全なるオブジェクト指向言語は存在しない。
というのが個人的な認識。(この発言を読んだのは数年前ですが。)
なので、
「オブジェクト指向じゃない言語VB6ぷっふーっwww」
は、
「ばっかじゃねぇーのぷっふーwww」
と、今でも思っている。
それと、wikiではわかりにくいですが
・オブジェクト指向
と
・オブジェクト指向言語
と
・オブジェクト指向開発
は、ばらばらで別のものである。という、認識。
特に、オブジェクト指向開発は、その言葉自体が後発で、
Win95以降の世代には、あたかもこの頃に流行りだしたのが
オブジェクト指向のように感じる節がある。(と思っている)
オブジェクト指向は、80年代だっけ?
オブジェクト指向開発と同義のオブジェクト指向プログラミングは、
その近辺だったように思うけど、最近じゃない。
当然、オブジェクト指向言語もそう。
つまり、概念的なものと同義、そうでないものをごっちゃにして
一緒くたに覚えてしまったのが問題なのかもしれないけど、別もの。
なので、
「だって、VB6ってオブジェクト指向開発できないじゃんww」
という、ヤツには
フォームにボタンでも貼り付けさせてやれば良いと思うよ♪(シンジ風味
やり方は、VB IDE開いてフォーム追加して、ボタンをその上に作るんだよ。
ほらできた。
これ君の言う「オブジェクト指向の継承と生成動作ね。」
wikiにもちゃんとオブジェクト指向の方式として書いてあるけどわかりにくい。
クラスを継承するか、インスタンスを引き継ぐか。の違い。
VB6 は、Com なわけ。
コンポーネント
オブジェクト
モジュール(モデルは、概念だったはず・・・)
いわゆる部品をオブジェクトと呼ぶし、相手がクラスであるかどうかはどうでもよいの。
オブジェクトって意味あいがいつも食い違うのはココ。
あんたらが知らないだけだよ。
最初のフォームをマウスで作る作業をコードで書くと
dim objFrm as formA ' ← いわゆるformA.frmね。
Set objFrm = new formA()
なわけ。(ごめん、formをNewするメソッドが浮かばない 苦笑)
型として使ってるからわかりにくいけど何処が継承なわけ?
タダのクラスのインスタンス生成じゃん。とは、思う。
ところが、このFrmA内には、新しくメソッド追加もプロパティ追加も出来ちゃうわけだな。
たとえば、このフォームモジュール内に
public sub tuikaMeth()
なんてものを書いたりできる。
この作業だけ見るとわからないけど、これって実際には
Application.Form から FormA を定義して、そのFormAにメソッドを追加した。
ということ。
さて、コレは継承でしょうか?それとも継承ではない何かですか?
というか継承ってなに?
VBはコンポーネント指向言語ですからそもそも継承(という、クラスベース方式の考え)が
できるわけがない。
なのに、継承がオブジェクト指向の条件みたいに言われちゃうから、
○○っぽい。ことをできる。といわざるを得ない感じなのでしょうか。
再利用に必要なもの=継承という発想もMSにはあるらしく、
それでいくと、まさにこれなんだよね。
一応、MCSDのVBの本には、VB6はオブジェクト指向開発に必要な要件を
満たすと書いてある。
ようするに発想と実現方法の違いで継承と同じく再利用できることで
要件を満たしたといってるんですね。
いつからオブジェクト指向の開発要素が
・再利用
・多様性
・カプセル化
になったんだ・・・orz
ちなみにその本にもどんな本にもきちんと
VB6は継承をサポートしません。
とある。
そして、但し書きとしてそれを実現するためにActiveX(Comのことね。)を
使った継承動作(つまり今書いたプログラム)が行えることになっている。
まぁ、確かに継承の使い道ってそういうことだよね。
とある定義(Com内の定義)を元にクラス(Form)が作れて、中身(メソッドの数)をいじれる。
無茶苦茶言っているようだけど、そういうことだと思う。
MSのよくいうActiveX技術を使った継承とはまさにこれなんだと思う。
でも、それはJavaやC++からみたら継承wwwって呼ばれるかもしれないけど、
クラスベースかComベースかの違いに過ぎない。
継承できないじゃん!=オブジェクト指向じゃないじゃん!
っていわれるのが嫌でこだわってるなら、そもそもオブジェクト指向の原点が違うってことに
気づいてない可能性が高い。
最初に書いたように
・カプセル化
ができるかどうか。がオブジェクト指向言語の唯一の定義ならVB6は、
カプセル化できる言語です。としか、答えようがない・・。
(ただし、プロパティの隠蔽方法が他と違う。)
でも、
・カプセル化
・継承
・多様性多態性
といわれてしまうと、VB自身継承はできない。と、書いている通り違うとなる。
が、それらしきことができますよ。
というのもまた事実。
コンポーネント化しなくちゃ、要素満たせないし、そもそも部品化して出すとか、
どんだけDLL地獄!!!って、笑われちゃうよね。
(いや、Java技術者はそこまで詳しくしらないからいわないか・・。)
でも、部品化=ばかじゃねぇの?
ってなったら、Beansはなんのマネか?
と問えばよいと思うよ。
あれこそCox(コンポーネントオブジェクト ほにゃらら)のJava版でしかないわけで。
わかるよ、VisualEditor(Eclipseに付属するVB IDEのRADみたいなやつ)を
一時期でもはずしちゃうわけだ・・。
まぁ、書き直せるかどうかでDLL地獄かどうかの違いは絶対的にあると思うけどね。
・・・やべぇ・・長文になってしまった・・。
多少、Java=オブジェクト指向!!最高!みたいな発想の人に
苦しめられているVB&VBA技術者に心安心していただけたでしょうか??
実は、次が本題で・・・やっぱVB6って・・・開発効率上げるための
オブジェクト指向プログラミング要素足りなすぎwww
って、話だったのですが・・疲れました。
またこんど。
でも、まぁ・・VBにしろJavaにしろ効率よければ何でもよいと思うのですがね。
私は。
保守的な意味では、
「動いているものを替えたくない」
という力の方が遥かに強く働くわけですから・・。
そして、それと同レベルに思うのが、
いいから開発効率上げるための要素は満たそうぜ・・。
とも思う。
FWでも自作してみれば良いと思うよ・・(ふ・・ふるい。






最近のコメント