1つの単純なアプローチの事例
クラスまたはUserControl(実際には特別な種類のクラス)でさえ、プログラム全体で広く一般的に使用されるプロパティとメソッドを持つと非常に便利な場合があります。
主な関心事がステートレスな「ユーティリティ」メソッドの幅広い使用である場合(たとえば、URLエンコード、エンティティエンコードなどのメソッドを持つWeb関連の配列)、追加のグローバルインスタンスを「なし」イベントとして宣言するだけでかなり安価になります。重い内部状態(配列、コレクションなど)をロードさせないこと。プログラムはとにかくすべてのコードを必要とし、1つのコピーだけがメモリにあるため、2番目のインスタンスはかなり安価になる可能性があります。
もう1つのオプションは、これらの「一般的な」操作、さらにはプロパティ値を別のクラスまたは静的(BAS)モジュールに分解することです。
ただし、個別のモジュールにリファクタリングしたり、変更したりしてカスタマイズしたくない、かなり複雑なUserControlまたはクラスがある場合があります。たぶん、さまざまなプロジェクトで使用するための共通の標準バージョンを維持しているでしょう。多分それはあなたがソースさえ持っていないサードパーティのライブラリです。なんでもいい。
考慮すべきこと
これは、Irving Mainwayの不滅の言葉では「盲目の子供向けではない」にもかかわらず、あなたに役立つかもしれない別のテクニックに私たちをもたらします。あなたがこれを使用するのに十分な経験を積んでいるなら、それはすでにあなたに起こっているはずです-しかし、私たちの誰も完璧な記憶を持っていません(実際に私たちがその素晴らしいマニュアルを読むのに時間をかけたことがあれば)。
したがって、おそらくこれは何らかの理由で機能せず、あなたはすでにそのアイデアを検討して破棄しました。
コンテナオブジェクト(Form、UserControl、親クラスなど)は、初期化時に問題のオブジェクトのインスタンスへのグローバル参照を慎重に設定し、終了時に参照を削除できます。これは、他のオブジェクトやプログラム全体がアンロードされないようにする循環参照や孤立した参照を避けるために、注意して行う必要があります。
これは、Johnny GoToが誤って使用したり、使用したりしないでください。しかし、VBで何をしているのかを知っていて、このテクニックとその落とし穴について説明しているマニュアルの部分を実際に読んで理解している場合は、役立つことがあります。
プログラムのスタートアップオブジェクトとしてForm1があるとします。Form1には、WebWiz1という名前のユーザーコントロール「WebWiz」のインスタンスがあります。しかし、他の場所(別の3つまたは12のフォーム?)では、一般的なMIMEタイプの文字列値のセットをファイル拡張子に変換するWebWizメソッドを呼び出したいと考えています。Form1のみがWebWiz1のイベントを処理する必要があり、WebWizは内部状態にかなり重いため、このメソッドのためだけに追加のインスタンスを作成する必要はありません。
静的モジュールでは、次のことを宣言するだけです。
Public gWebWiz As WebWiz
Form1のInitializeまたはLoadイベントが実行されるとき(または、WithEvents
インスタンスを作成した後のクラスの場合)、次のことができます。
Set gWebWiz = WebWiz1
Form1のUnloadイベントハンドラーの場合:
Set gWebWiz = Nothing
次に、プログラムには、さまざまな目的に使用できるグローバル参照があります。
簡単そうですね?
これを使用するプログラムが、またはメインフォームで始まるコードの適切な「ツリー」として記述されているSub Main
場合、通常、特別な注意を払う必要はありません。しかし、あなたがピンボールウィザードのようにコーディングしていて、「開いているすべてのフォームを見つけてアンロードするにはどうすればよいですか?」などの質問をしている人の1人である場合。次にあなた:
- 「ハング」するプログラムを回避するために、さらに多くの作業を行う必要があります。
- おそらく、このテクニックを実際に使用することはできません。