映画、CG、プログラム等

2014年1月15日水曜日

VBScript の罠②「同一名称関数の二重(上書)定義が可能」


先日諸事情により、今更感ただようクラシックASPを触ることがありました。

例のごとくなんの資料もなく、わかる人も誰もいないという状況なので
とりあえず、触るにあたってどのaspファイルをインクルードすべきか
とインクルードの継承関係を調査してみると・・・

末端のファイルは、なんかわからんけど共通っぽいのとりあえずインクルードしとけって感じになってて、案の上というか、まったく整理されておらず循環参照おこしまくり。


これじゃ、グローバルな定数とかいれれんじゃんとか思ってみてみると
やっぱどこも定数つかってない・・。
あほプロジェクトの地雷その1である恐怖の区分直書を見事に踏んでます。

一応試しに、Dimやら、Const 突っ込んでみると、二重定義のエラー発生・・・・。

なんじゃこりゃーという腹立たしさもありますが
ちょっと気になったのは、関数も2重(3重、4重?)に定義されてるのに
それはOKなのかということ。

以前も書いたいけど
VBScriptって、.net以前のVbやvba知ってりゃ9割は問題ないのだけど
それゆえに先入観でいろいろと罠にはまってしまいます。

ということで前置き長かったけど、関数の二重定義を調査してみました。
下記ソースをhtaファイルとして保存して、実行するとよくわかりますが

-----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<script language="VBScript">
Sub testSub()
msgbox "aaa"
end Sub

Sub testSub()
msgbox "bbb"
end Sub
</script>
</head>

<body>
<button onClick='testSub()' >同一Sub名テスト</button>
</body>
</html>
-----------------------------------------------

「同一Sub名テスト」のボタンをクリックすると
落ちずに、呼ばれるtestSubは問題なく動作し
alertの「bbb」が表示されます。

つまりVbscriptでは、変数や定数は二重定義できませんが
関数に関しては、上書きされてしまうのです。

といことで、ASP上のVbscriptでも同様のことが言え
インクルードも含めて、最後に読み込まれた関数だけが生きているわけです。

なのでクラシックASPで、命名規約や、なんの資料もないくせいに
インクルードファイルを量産してるようなプロジェクトは十分に気をつけましょう。

ちなみに、もしやこれを逆利用して
JAVAのように同名で引数違いの関数とかできちゃったりするのかと
引数違いの関数を作成してみましたが、単なる上書きのようでやはりだめでした・・・。
(おちます。。)

ASPのインクルードの仕方によっては近いことができるかもしれませんねー。
(今更そんなことする必要はないし、うまく管理できればですけど・・)


その他のVbScriptの罠
  1. VbScriptの罠①「DoEvents」
コメントを投稿