何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

頭を柔らかく(まどか の ぶろぐ)より:

いやいや、否定する点は無いのだが、「あり」の中で私の書いた例は設計の結果として「あり」の一部ではないと思うのだが。

いっしょだよ、と言われればそれまで。というのも納得している。でも。。。

MDI子フォームからMDI子フォームの操作(どぼん!のプログラミング道場掲示板)より:

今までは
「子フォームA」のプロパティに「子フォームB」、
「子フォームB」のプロパティに「子フォームA」を追加して
親フォームから子フォームのインスタンスを作成する時に
それぞれのプロパティにインスタンスを渡し、
「子フォームA」から「子フォームB」を操作する時は
「子フォームB」の入ったプロパティから直接操作していたのですが

一元管理の為、
親フォームに「子フォームA」、「子フォームB」プロパティを持たせて
「子フォームA」から「子フォームB」を操作する時は
親フォームの「子フォームB」プロパティを操作しようと思っているのですが

この方法で間違いはないでしょうか?

私はまどかさんと同じで、避けるべき、だと思う。

FormA が確定するためには FormB が確定しなければならず、FormB が確定するためには FormA が確定しなければならない。その FormA が確定するためには...と、無限ループにはまっているわけです。

設計的には、FormB にやって欲しい操作、外から指示される操作をインターフェイスとして定義、FormB はそれを実装する。FormA はそのインターフェイスを持ち、インターフェイスを通して FormB を操作する。

反対も同じ。

こうすることで、フォームが依存するのはインターフェイスとなり、インターフェイスが確定すれば、フォームは確定できる。

実装上、FormA のインスタンス内で FormB のインスタンスを参照し、FormB のインスタンス内で FormA のインスタンスを参照することは、ある。れいさんは、こっちの意味じゃないかなぁ?


まどかさんが誤解しているとすれば、循環参照は「今までしていた」。これからしようと思っている、「親フォームがすべて管理する」方法をどう思うか、という質問のポイントではないか、と。。。

と、思ったのですが、#20771 を見ると、そうじゃないですね。ダメだよぉ。。。

設計として、知っている人が循環しちゃダメ!

後から出てくる、「Parent プロパティ」は Control クラスに定義されていて、これは自己参照です。設計図の循環参照ではありません。


interface IOperater {
    void ShowChild(int childNumber);
}

public class ParentForm : Form, IOperater
{
    void ShowChild(int childNumber)
    {
        switch (childNumber)
        {
        case 1:
            this._frmA.Show();
            break;
        case 2:
            this._frmB.Show();
            break;
        default:
        }
    }

    private FormB _frmB;

    public FormB frmB   // ReadOnly
    {
        get
        {
            return _frmB;
        }
    }

    // FormA は省略

    public ParentForm()
    {
        this._frmB = new FormB();
        this._frmA = new FormA();
    }
}

class FormA : Form
{
    void FormBを開きたくなるメソッド()
    {
        IOperater p = this.Parent as IOperater;
        if (p != null) {
            p.ShowChild(2);
        }
    }
}
投稿日時 : 2007年10月17日 20:44
コメント
  • # re: Re:頭を柔らかく
    中博俊
    Posted @ 2007/10/17 21:12
    Parent-Childrenに関しては普通にやるので、どうかなー
    粒度なり、レイヤー違いじゃなければ問題ないと思いますが。
  • # re: Re:頭を柔らかく
    Jitta
    Posted @ 2007/10/17 21:36
    ん...
    FormA の修正をしたときに、FormB が引きずられないか。そういう目で見ました。
    まぁ、private なメンバの修正であれば、引きずられませんけどね。
    クラス図を書いたときに、お互いに矢印の頭を持ち合うのはイヤだ、ってことで。
  • # re: Re:頭を柔らかく
    えムナウ
    Posted @ 2007/10/18 0:46
    DataRow.Table.DataSet
    DataRow に Table プロパティ
    DataTable に DataSet プロパティ
    これがなきゃ自分の所属しているものはわからないですよね。
  • # re: Re:頭を柔らかく
    れい
    Posted @ 2007/10/18 1:30
    反対派が優勢のようですねぇ。

    依存という意味では、
    なるべくないほうがいいですよね。

    私はクラスの意味を考え、必要なら躊躇なく使います。
    GUIなパーツの場合はよく使いますね。
    MDIだったりすると尚更。

    設計は個々のスタイルもありますから、
    良い悪いは分かりませんが、
    .Netも、Javaも、クラスライブラリの中は
    循環だらけです。

    実際に、
    全ての参照は循環してはいけない、
    なんていう制約を課せられたら、
    殆ど何もできないということは
    皆さんに同意していただけるかと。
  • # re: Re:頭を柔らかく
    Jitta
    Posted @ 2007/10/18 7:09
    インスタンスの参照が循環するのと、
    クラスの参照が循環するのと。
    前者は否定していません。
    後者は避けたい。
  • # re: Re:頭を柔らかく
    れい
    Posted @ 2007/10/18 7:32
    >インスタンスの参照が循環するのと、
    >クラスの参照が循環するのと
    「クラスの参照」の意味がわかりませんT-T
    参照するのは全部インスタンスで…
タイトル
名前
Url
コメント