Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

続・何年かぶりにVB6

久しぶりにVB6をさわったら、既定のインスタンスが大好きになってしまいそうです。どうしよう。これが恋?
コメントにしたら長くなりそうなので円取り立てましたエントリ立てました。

いわゆる業務アプリ開発において。
画面がいくつかあるとします。
画面遷移図が木構造になっておらず、AからB、BからC、CからAという遷移が可能だとします(BとCを通ってAに戻るイメージです)。
木構造ならモーダルフォームで楽が出来るのですが、このように輪になっているとそれはできません。
こういう場合、次に表示する画面を毎回 new するわけにはいかないので、一度作った画面のインスタンスは、遷移元画面クラスの外に置かなければなりません。
既定のインスタンスは、それを暗黙のうちにやってくれるものと言うことができます。

VB6.0 で「Form の既定のインスタンス」を防ぐには?

防ぐなw

このような、正当な方法を利用するメリットはいくつかあります。

  • インスタンスを生成することで、初期化が保証される
  • スコープを狭めることができる (例のコードでは Command1_Click プロシージャ内でのみ有効)
  • 結果、他の場所から勝手に呼び出されてしまう心配がない
  • 外部のどこから操作されているのか明確になる
  • 別のインスタンスを作って複製可能

ふむふむ?

  • インスタンスを生成することで、初期化が保証される
    • 既定のインスタンスを使うと初期化されないんですの?
      既定のインスタンスのメソッドを最初に呼んだ時に Initialize が走るって書いてありますやん。
  • スコープを狭めることができる (例のコードでは Command1_Click プロシージャ内でのみ有効)
    • それじゃ狭すぎて困るんです。遷移元画面よりも広いスコープが必要なんです。
  • 結果、他の場所から勝手に呼び出されてしまう心配がない
    • それはそうかも。
  • 外部のどこから操作されているのか明確になる
    • どこかで一元管理しているなら別として、遷移元画面で new しているような状況では、そんなに変わらないと思いますが。
  • 別のインスタンスを作って複製可能
    • 実のところ、同じ画面のインスタンスをいくつも作る必要がある場合というのは、そう多くないものです。

画面管理クラスをちゃんと設計して、遷移元画面から直接次の画面を Show しないように作るのが正道かもしれませんが、理想と現実は得てして異なるものです。
# 100以上のフォームを、「動かなくてもいいから、とりあえず今日中に画面遷移だけでもするようにしてくれ」って昼過ぎに言われてもね…。

投稿日時 : 2008年6月6日 17:27

Feedback

# re: 続・何年かぶりにVB6 2008/06/06 17:41 じゃんぬねっと

シャノンさん十八番のいちゃもんつけですか? (w

> 既定のインスタンスを使うと初期化されないんですの?
> 既定のインスタンスのメソッドを最初に呼んだ時に Initialize が走るって書いてありますやん。

2 度目という意味。

> それじゃ狭すぎて困るんです。遷移元画面よりも広いスコープが必要なんです。

ダイアログ的に使いたい場合を想定しています。

> どこかで一元管理しているなら別として、遷移元画面で
> new しているような状況では、そんなに変わらないと思いますが。

これは言い回しがダメでしたね。
ローカル変数的な使い方しかしていない場合を想定しています。
既定のインスタンスを使うと、他に弊害があるかもとわざわざ検索しないといけない。
これは、前項と内容が被っていますね。

> 実のところ、同じ画面のインスタンスをいくつも作る必要がある場合というのは、そう多くないものです。

そういう場面ではメリット。
そうでない場面ではノンメリットだけど、デメリットってわけではないですよね。

# re: 続・何年かぶりにVB6 2008/06/06 17:44 じゃんぬねっと

ぶっちゃけ、1 人で作って引継ぎも特に考えていないなら、行儀良く使えば特に弊害はないんですよね。
実際にはめちゃめちゃな使い方をする人がいるから制限しないといけなかったりするわけです。

# re: 続・何年かぶりにVB6 2008/06/06 17:55 シャノン

> シャノンさん十八番のいちゃもんつけですか? (w

わんくま MVP for いちゃもんつけのアワード期間は、先日のレイアウト変更とともに終了しましたw

> ダイアログ的に使いたい場合を想定しています。

ダイアログ的に使いたい場合は明示的インスタンスの方がいいでしょう。
じゃんぬさんの挙げた利点は、すべてその前提のもとでのみ成立します。

> 行儀良く使えば特に弊害はないんですよね。

ダイアログ用途だったら一人でも明示的の方がいいですね…

.NET で言えば Dispose されるかどうか等に関しても、モーダルとモードレスでは全く用途も挙動も違うので、単一のクラスで両方カバーしようとするのがどうかとも思います。

昔やった仕事では、管理クラスを作らなかったがために、循環して戻るような遷移をモーダルで擬似的に実現したことがあります。
AからBへ遷移した後、BからCへ遷移するときに、一旦、共通の分岐点であるAに戻って、Aはフラグを見てAを表示するかCを表示するかを判断してました。
あんなコードはもう二度と書きたくないですorz

# re: 続・何年かぶりにVB6 2008/06/06 17:56 シャノン

余談ですが、ここで言う「管理クラス」を、ちょっと洒落た言い方にすると「ユーザー インターフェイス プロセス コンポーネント」ってやつになるんですかね。

# re: 続・何年かぶりにVB6 2008/06/07 14:55 れい

「ユーザー インターフェイス プロセス コンポーネント」

「プロセッシング」かな?

# zgUMlZEJQGliBgWVGt 2011/12/27 19:12 http://www.spytown.com/

Strange but true. Your resource is expensive. At least it could be sold for good money on its auction!...

# DTPfOxFgmWm 2012/01/07 8:58 http://www.luckyvitamin.com/m-164-homedics

Stupid article..!

タイトル
名前
Url
コメント