[Notes/Domino] クラスのメンバ変数を追加・削除すると、エラーになる
Notes では、一応オブジェクト指向の機能も備わっておりますが、C++、Java はもとより、最近のLL言語と比べても、機能が劣ることは否めません(TT
それだけならまだしも、最も困るのが不具合。他の言語では考えられないようなエラーが発生します(涙
たとえば、スクリプトライブラリを作成し、以下のようなクラスを定義します。(テスト用なので、メンバ変数 a は意味のないものになっています。)
Public Class CTest Private a As String Private b As String Public Sub New(Byval s As String) b = s End Sub Public Sub Test() Msgbox b End Sub End Class
このスクリプトライブラリを Use してエージェントを作成し、以下のように使用してみます。
Sub Initialize Dim t As New CTest("Test") Call t.Test() End Sub
エージェントを実行すると、うまく動きます。
ではスクリプトライブラリ側のみ、メンバ変数を1つ追加してみましょう。
Public Class CTest Private a As String Private b As String Private c As String Public Sub New(Byval s As String) b = s End Sub Public Sub Test() Msgbox b End Sub End Class
エージェント側に変更を加えずに実行してみると……はい、エラーが出ました(TT
T004 外部の名前の型が一致しません。 CTEST
メンバ変数1個追加しただけやんけ(- -メ これでエラーが出るって……。(追加した変数の型によってはエラーにならない場合もあるみたいですが……。)
ちなみに、メンバ変数 a を削除しても同じ結果となります。構造体(ユーザー定義型)の場合でも同じです。(まぁ構造体はクラスみたいなもんだからかな。)
これって、部品的なものを作るときに、とっても困ります。機能拡張でメンバ変数を追加したい場合もありますから。
この厄介な現象を回避するには、以下のようにしてください。
Public Class CTest Private a As String Private x List As String Public Sub New(Byval s As String) x("b") = s End Sub Public Sub Test() Msgbox x("b") End Sub End Class
どうもメンバ変数の個数のほうが重要みたいで、既存のメンバ変数の型や名前を変える分にはエラーにならないみたいです。なんじゃそりゃ。
で、これを利用してリスト変数(他の言語で言うところの連想配列(ハッシュ)ね)にするところがミソで、「x("c")」のようにすれば、擬似的にメンバ変数を増やすことができます。
まぁこの方法は、多少コードが汚くなってしまいますから、最終手段ということで。部品的なクラスを設計するなら、最初に予備変数を作っておいたほうがよいかもしれません。
それにしても、メンバ変数の追加・削除だけでエラーになるとは……Notes 恐るべし(涙
コメント
今頃ですが、エージェントを変更(1文字入れて削除とかでいい)して保存すると再コンパイルされるので、エラーが出なくなると思います(一杯あったらどうしてくれる)。
でもこういう「プログラムは正しいのに・・・」的な動きを随所でしてくれるので困ったもんです。
Posted at 2009/05/19 11:03 PM by たつじろう
たつじろうさん、コメントありがとうございます! 🙂
ご指摘のとおり、Use している設計要素を保存すれば、コンパイルされるのでOKです。
また、R6から追加された [ツール]メニュー→[すべての LotusScript をリコンパイル] 機能を使えば、全設計を1クリックでコンパイルしてくれます。
ただ、1DBで完結している場合はいいんですけど、各DBで共通に使用しているライブラリとかだと、全部のDBをリコンパイルするというのは、ちょっと現実的でなくなる場合があります。
この Tips はそのようなケースを想定しているのでした。
メンバ変数を追加・削除しただけでエラーになっちゃうなんて、ホントに困っちゃいますよね……(´~`)
Posted at 2009/05/19 11:23 PM by takenoff
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。