読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

クラシックASP to Rasor (2)

間が空きましたが、また少しずつ、フォローアップを書いてきたいと思います。

1.ファイルの粒度と構成は?

A.割とそのままいけると思います

「素直なASPの構成」をしていれば、おそらくはほぼ、そのままに近い粒度で移行できると思います。HTMLのFORMやJavascriptが許容する大抵の挙動と、フレームワークの思想がバッティングしません。WebFormのようにPOSTBACKを半ば強要*1されるようなこともありません。
.cshtml/vbhtml以外のファイルにすべきものについては、『3.サブルーチンをどうするか』『4.includeをどうするか?』あたりを参考にしてください。


重ねてになりますが、もともとのクラシックASPのファイル構成があまり良くない場合は、やはりある程度再構成をする方が良いという判断になるかもしれません。

2.コードの置き換えは?

A.注意点はあるものの、素直に書き換えできる部分が多そう

そもそも元がVBScriptですから*2、そんなにややこしいことはできません。VB.NETC#で実現に困るようなことは、そうそうできないと思います。

また言語ですが、元がVBScriptであるなら、VB.NETを選択する方が無難だと思います。文法もそうですが、StrConvやCInt等そのまま利用できます。これらのMicrosoft.VisualBasic名前空間の各種機能を「移植時の互換性維持のために使う」のは真っ当な使い方だと思います。


ただし、いくつか注意すべき点があるので、その点については補足しておきます。

(1) Response.Writeの置き換え

クラシックASPでResponse.Writeを利用している場合、ここは書き換える必要があります。一度、Response.Writeをそのまま実行してみると分かるのですが、恐らくは意図した場所に出力されていないはずです。HTML中に記述した行付近ではなく、ファイルの先頭付近に書き出されていることと思います。理由の詳細はここでは割愛しますが(Web FormsでのResponse.Writeと同じ挙動ですので)、クラシックASPと同じ目的ではResponse.Writeは大抵の場合、使えないと思います。

代わりに利用することになるのがWriteもしくはWriteLiteralメソッドになります。コード中からであれば、これで書き換えるのが自然だともいます。また、@やで書くのが見やすいようでしたら、そちらで書くのも良いと思います。

(2) VB6 → VB.NET移植時と同様の注意点

VB6からVB.NETの移植時にもよく問題になった点は、やはりここでも問題になってくる可能性があります。
代表的なものに、

  • 変数宣言の省略
  • Variant型の扱い
  • 引数の値渡しと参照渡し

があります。

前二つについては、資料での触れていますのでここでは割愛します。

『引数の値私と参照渡し』については資料で触れるのを忘れていましたので、ここで改めて補足させてください。

プロシージャを自分で定義する際、VBScriptでは、明示的に宣言しない限り、引数は参照私になります。つまり、VBScriptでは、

Sub SomeMethod(myValue)
End Sub

と、

Sub SomeMethod(byRef myValue)
End Sub

は等価です。


VB.NETでは、以下の二つが等価になります*3

Sub SomeMethod(myValue)
End Sub
Sub SomeMethod(byVal myValue)
End Sub

元々のコード『参照渡し』であることを意識しておらず、引数に値をセットして戻すようなことしていなければよいのですが、そうでない場合、挙動が変わってしまいます。しかも、これはコンパイルエラーは出ません。ですので、これが潜在していると、動かしてみるまで顕在化しないバグになる可能性があります。


なぜ、こんな大事なことを書き漏らしていたかというと…言い訳でしかないのですが、二つほど理由がありまして…。一つは、VB6からの移植をいろいろやっていた身としては、もう常識として体が勝手にこれを考慮してコードを移植する感じになっていていること。もう一つは、そもそもVBScriptでも、私が書いたコードだと極力明示的にbyValとbyRefを書くようにしていたことです。おかげで、移行テストをしていた時にまったくこの問題に引っかからず(^^;


この問題を含め、言語レベルの問題については先にも挙げた『Visual Basic 6.0 ユーザーのための Visual Basic .NET 移行ガイド』を参考にしてください。VB6系から.NETへの移行を経験されたことがない方でしたら、一度は目を通すことを強くお奨めしておきます。

*1:別に強要されるわけではなくほかの手段も使えますが、Web Formsのそもそもの思想と考えると、POSTBACKと完全に決別して実装するのが良い手段とは思えません。

*2:Javascriptで実装している方もいるかもしれませんが、大半はVBScriptだと思います

*3:Visual StudioのIDEを利用すると勝手に補完されます