画面間でデータの受け渡しをする方法

Windowsフォームのアプリケーションにおいて、画面間でデータを受け渡しする方法はいくつかある。業務システムで利用するという観点で筆者の考えをまとめてみた。

  1. Formクラスにメンバ変数とパブリックなプロパティで公開する

  2. プロパティでコントロールのデータを公開する方法。.NETの解説書でよく紹介される方法であり、簡単である。しかしながら、業務システムで利用するとなると使いづらいと考える。
     たとえば、商品の一覧画面から、詳細画面に遷移する場合を考える。詳細画面で必要なデータは、一覧画面で選択された商品のデータだけであるから、その商品データだけ公開するためにひとつ変数が必要となり、それを公開するプロパティが必要になってしまう。
     共有するデータが変更された場合に影響を受けやすく保守性が低下する。逆に、一覧画面でコントロールのデータをすべて公開し、詳細画面から選択されたデータを見つけ出し取り出すのも、依存関係がループしているので設計上美しくない。

  3. グローバル変数に共有する値を置いて取り出す
  4. メリットは、使いやすくアプリケーションが死ぬまで保持できる。
    デメリットは、使いすぎるとメモリを圧迫する危険性がある。クリアするタイミングに注意が必要となる。
    画面遷移の種類が増すほど、多くのグローバル変数を用意する必要があり管理が大変になる。おそらく複数人で開発するようなプロジェクトでは、何が何のための変数か分からなくなるであろう。
    アプリケーションで共有の変数という性質上、クリアや上書きするタイミングによっては、関連する部分に予期せぬ影響を与えてしまう可能性があり、規模の大きなシステムでは使うべきではない。
    そもそも、グローバル変数はシステム全体で使用する変数であるべきで、本来画面遷移のために使うべきではない。

  5. 画面クラスのスタティック変数に置いて取り出す
  6. スタティック(静的)変数に共有する値をセットする方法。同じプロセス内であれば、スタティック変数は共有できる。単純であるが、Formクラスは本来Form自身の属性だけを持つべきであり、画面遷移のためにスタティック変数を定義するのは、クラス設計として望ましくない。そもそも、スタティック変数は、同じクラスの異なるインスタンスで共有するための仕組みである。

  7. HashTableにキーと値をペアで保持し共有する
  8. HashTableクラスのインスタンスを生成し、キーと値をペアで保持する方法である。メリットは、任意のキー名で任意の型のオブジェクトを保持できるため、画面遷移の増減や共有するデータの変化によってクラスを修正しなくてよい点である。デメリットは、グローバル変数の方法と同じで、必要なくなったデータを適切なタイミングで消す注意が必要である。

    実際に使う場合は、HashTableクラスの変数を保持するクラス(以下コンテキストクラス)を用意して、
    コンテキストクラスのインスタンスをアプリケーションでひとつだけ存在するインスタンスとして定義し、コンテキストクラスはひとつだけしか生成されないようにする。

下記のサンプルは、データを保持するクラスのサンプルである。シングルトンパターンで作ってあるので、このインスタンスは複数生成されることはない。したがって、同じプロセス内であればどこからでも、情報の格納と取得ができる。

データを格納するときのコードは次のようになる。

そして、データを取得側のクラスでは、次のようなコードを書く。

こうすることで、多くの引数を引きずりまわしてメソッドを作る必要がなくなり、ソースコードが見やすくなる。

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/254

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.