- - PR -
クラス設計の基本的質問:プロパティ経由で受け取ったリソースの破棄
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-31 19:01
8ヶ月ほど前に、同じことをやった気がする。
私は、破棄することを放棄しました。ASP.NETなので、Pageオブジェクトが破棄されたら、参照が外れて、そのうち破棄されるだろう.. 真似しないほうがいいと思う(ノ_-;) _________________ | ||||||||
|
投稿日時: 2007-01-31 20:49
Penに限った話ではないですが、newしたオブジェクトを、
別のクラスのインスタンスにプロパティ経由で渡し、 そのインスタンスが破棄されたときに渡したオブジェクトも 一緒に破棄されるというのに、私は違和感を覚えます。 やはりnewした側が責任を持つべきな気がします。 1つの案ですが…こんなのはどうでしょう? 描画に使用するPenやらBrushやらをコンストラクタで生成して、 内部フィールドに格納。Dispose内でそれらをDisposeします。 そして、PenとかBrushは外部にreadonlyのプロパティとして公開。 使う側はそのプロパティを参照してPenのColorやWidthのような プロパティを必要に応じて変更する。 | ||||||||
|
投稿日時: 2007-01-31 20:54
皆様ありがとうございます。
おかげさまで
の原則をようやく呑み込めたように思います。 確認のため 現時点の私の認識を述べさせていただきます。 ここで、仮に、コンストラクタ・プロパティ等を経由して外部からリソースへの 参照を渡されるクラスがあるものとします。 このクラスの設計について、以下のようにあるべきであると認識します。 ・外部からリソースへの参照を渡されるにしても、そのリソースの破棄は 原則としてそのリソースを生成した者の責任である。 ・このクラスのコンストラクタ内・メソッド内で、このクラス自身が生成した リソースについては、当然このクラスが破棄の責任を持つ。また、必要に応じて IDisposableを実装すべきである。 ・↑の理由でIDisposableを実装した場合、このクラスのDispose()では、 外部から参照を渡されたリソースの破棄については、くどいようであるが このクラスの責任範囲外であり、リソース生成者が破棄すべきである。 ・・・こうしてみますと、実に初歩的なことだったのかもしれません。お恥ずかしい;; (強いて述べますと、上記の設計でIDisposableを実装した場合、そのクラスのDispose()が 外部リソースの破棄まで負ってくれるものとユーザが誤解する可能性は残るような 気はいたします # と このように述べましたが、そんな誤解しないですよね。すみません。 ) 以上の認識に従いまして、冒頭のTBorderクラス他 外部からリソースを渡される クラスについては、そのリソースの破棄の責任を負わないことにいたします。 仮にユーザが
のようなコードを書いて、リソースの破棄をGC任せにするとしても、 それはユーザの勝手とします。 これでユーザにリソースの破棄について選択の自由が生まれました。 私自身はPHPなどスクリプト言語での開発が長いためか、 私の意識がリソースの管理について非常にルーズであることがわかりました。 ベテランの方々のご助言をいただけまして助かりました。 [ メッセージ編集済み 編集者: Dustin 編集日時 2007-01-31 21:04 ] | ||||||||
|
投稿日時: 2007-01-31 21:41
ご指摘ありがとうございます。 ”描画する際に使用するPenの情報だけ保持して”というのは、 例えば線を引くのに必要な情報(色や太さなど)をフィールドとして持つ構造体を定義して graphクラスがその構造体を持つ、あるいは直接graphクラスがフィールドとしてそのような情報を 持つことを意味していると認識いたしましたが、正しいでしょうか。
| ||||||||
|
投稿日時: 2007-02-01 01:24
「今回はその方がいいかもね」というだけであって、常にそのシナリオが妥当であるというわけではありません。「委譲」のパターンも存在します。 |