何となく 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
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

re: Re:頭を柔らかく(「Re:頭を柔らかく」へのコメント)より:

>インスタンスの参照が循環するのと、
>クラスの参照が循環するのと、
「クラスの参照」の意味がわかりませんT-T
参照するのは全部インスタンスで…

ですよね(T^T)

本文の方に「Parent プロパティ」は Control クラスに定義されていて、これは自己参照です。設計図の循環参照ではありません。と書いていることを指しています。


Form 上に Button を置きます。Form.Controls プロパティ内には、配置した Button のインスタンスがあります。そのインスタンスの Parent プロパティは、配置されている Form のインスタンスを指しています。

「インスタンスの参照が巡回する」とは、この状態を指しています。これを否定するつもりは、毛頭ありません。

で、「クラスの参照」について。

Form.Parent プロパティを見てみます。MSDN Library では、ここ→Form メンバ (System.Windows.Forms)(MSDN ライブラリ)

メンバの一覧ですが、ここの Parent プロパティには、(Control から継承されます。)と、書かれています。そして、このプロパティの型は Control クラスです。

Button.Parent も同じ。Control クラスから継承した、Control 型の Parent プロパティです。

つまり、Form クラスが Button クラスを知っていたり、Button クラスが Form クラスを知っていたりするわけではありません。Form クラスと Button クラスは互いを知らず、ただ、両方の継承元である Control クラスを知っているだけです。また、Control クラスは Form クラスも Button クラスも知っていません。Control クラスが、ControlCollection クラスを通して Control クラスを知っています。

このとき、クラスの定義上は、継承先クラスから継承元クラスへの一方的な片思いという関係しかありません。この状態を「クラスの参照が循環していない」とします。(いや、Control <-> ControlCollection で循環しているわけだけど)

えムナウさんが書かれていますが、System.Data.DataTable クラスは、DataSet プロパティに DataSet 型の自分が所属する DataSet を持っています。では、DataSet クラスは?

DataSet は自分に所属している DataTable を、DataTables プロパティによって知ることができます。そしてこのプロパティは、DataTableCollection 型です(「クラス」と「型」の使い分けについては気にするナ)。よって、DataSet → DataTableCollection → DataTable → DataSet と、参照しています。この状態を「クラスの参照が循環している」とします。


これで、使い分けの説明になったかな?

投稿日時 : 2007年10月19日 22:14
コメント
  • # re: Re:re: Re:頭を柔らかく
    えムナウ
    Posted @ 2007/10/19 23:09
    DataParentというクラスを作ってそのプロパティに管理しているDataSetやDataTableの参照と親を管理しているDataParentへの参照を持っているとします。
    (自己参照)

    DataRow・DataTable は DataParentのインスタンスを持っていてそれを通して親が判別できます。

    今の実装よりこんな実装がいいってことでしょうか?
  • # re: Re:re: Re:頭を柔らかく
    れい
    Posted @ 2007/10/19 23:36
    わざわざ図まで作っていただいての説明、
    ありがとうございます。
    Jittaさん的にはDataSetの設計はよくないと。

    私もできればクラスは自己完結してたほうがいいとおもいますが、
    互いに依存していたほうがいい場合もたくさんあると思います。
    DataSetもそうですし、
    コレクションとその要素とか、
    GUI部品とかもそうですね。

    設計時に憂慮する事項としては、
    順位は低い部類に入るかな。
    もっと気にしなければいけないことはたくさんあるので。


  • # re: Re:re: Re:頭を柔らかく
    中博俊
    Posted @ 2007/10/20 17:17
    層概念などなく全般的に避けるべきだ。
    とは思いません。

    それなくしてList, Tree, 双子をどのように表現するのでしょうか?

    Controlにしているかどうかは所詮汎化特化しているだけでしかないでしょう。
  • # re: Re:re: Re:頭を柔らかく
    Jitta
    Posted @ 2007/10/20 21:07
    えムナウさん、れいさん、中さん、コメントありがとうございます。

    「なぜ、避けようと考えているのだろう?」と考えたとき、DLL の循環参照を当てはめている、と思い当たりました。
    DataSet と DataTable, DatARow の関係、Tree 系のデータクラスなど、双方向の結びつきが強く、参照させた方がよいものがあると思います。
    その一方で、クラス間の結合を粗にするために、循環させないという考え方もあると思います。

    いかがでしょうか。
  • # re: Re:re: Re:頭を柔らかく
    れい
    Posted @ 2007/10/21 10:36
    >クラス間の結合を粗にするために、循環させないという考え方もあると思います。

    粗なクラスで用が済むなら粗にします。

    用が済まない場合がたくさんあるので、
    その場合は参照を持ち合ったりして
    密なクラス群をつくります。

    前者も後者も普通かと思います。
    後者を無理に避けることは私はしません。

    だって、その方が綺麗に簡単に作れるんだもん。
  • # re: Re:re: Re:頭を柔らかく
    中博俊
    Posted @ 2007/10/21 15:53
    DLLの循環参照はもちろんだめだけど、だめなのは所詮技術的な問題で、論理的には問題ではありません。

    そのあたりをごっちゃにしちゃうと、踏み誤りますよ。
タイトル
名前
Url
コメント