ぽざうねっと

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  420  : 記事  0  : コメント  9718  : トラックバック  76

ニュース

さて、今年は何を漬けようか

書庫

日記カテゴリ

Accessory

Community

Private

http://blogs.wankuma.com/shuujin/archive/2007/02/01/60398.aspx

new したものが delete する。
作った人が責任もって破棄する。
こういう対の考え方はシンプルで非常に有用な考え方だと思う。

で、似たような話のような、別問題のような話ですが、私は Close メソッドが気にいらない。
Close メソッドの存在ではなく、Close が Dispose を呼び出す(それを推奨している)のが非常に気に食わない。
私は、そのようなクラスは Dispose が(あくまで念のため) Close を呼び出すべきだと思う。
まず意味合い。
Dispose は「破棄」、Close は「閉じる」、「閉じる」=「破棄」という考え方が理解できない。
「閉じる」はあくまでも「破棄」のための条件であると思う。
また、Dispose は using のように言語によっては文法レベルでサポートされているように、特殊なメソッドと考えても差し支えないぐらい重要なメソッドだと思う。
それを「文意的に適当だから」とかでかってに差し替えられたらたまらない。混乱するだけだ。
Close は意味どおり、閉じる処理をすればいいのに。

Dispose は new とともにあるべきであり、Close は Open とともにあるべきだと思う。
public interface IOpenable
{
    void Open();
    void Close();
}
いっそのこと、こんなのがあればよかったのにとさえ思う。
投稿日時 : 2007年2月2日 2:00

コメント

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 9:34 かるあ
Close 時に Dispose って推奨されているんですか?
Open → Close → Dispose → Open は破棄されているから出来ないのはわかるけれど
Open → Close → Open はできて欲しい気がするんだけれど。。。


# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 10:20 えムナウ
>Open → Close → Open はできて欲しい気がするんだけれど
基本的にできますよ。
誤解があるのはメモリ空間のマネージドリソースと、
ファイルやGDIとかのアンマネージドリソースを分離して考えていないこと。

この場合アンマネージドリソースをOpenで取得してCloseで解放しろと言っているわけです。
アンマネージドリソースという観点でClose が Dispose(false) を呼び出すのを推奨しているのです。

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 12:33 シャノン
つか、みんな「Close=Dispose」って考えてるみたいだけど、「Close≠Dispose」な実装があってもいいし、CloseじゃなくてDeleteでもKillでもDestroyでもいいんだよね。名前として適切ならさ。

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 12:45 黒龍
「Close≠Dispose」な実装があってもいいし
あってもよいというかCloseを設けるなら意識的に分けるべきですね。

# DisposeとClose 2007/02/02 16:40 えムナウ Blog
DisposeとClose

# DisposeとClose 2007/02/02 16:43 えムナウ Blog
DisposeとClose

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 20:29 THREE-ONE
コメントならびにトラックバックありがとうございます。
Dispose ≠ Close な実装があるのは承知していますし、それはまったくおかしくないと思います。
Dispose = Close な実装が存在した場合に、Close が Dispose を呼び出すのが気に食わないのです。
私の考えでは、あくまで Dispose ⊇ Close であるべきだと思っています。
Close に Open で作成したものを閉じるコードを書き、それを Dispose(false) なり Dispose が呼び出せばいいのじゃないでしょうか?
Close は Open だけを意識すればいいのであって、Dispose が Close を意識するべきだと思うのです。

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 22:15 Jitta
ちょっとした誤解があると思う。
生成破棄を「開く閉じる」と呼ぶ方がふさわしいとき、Dispose を明示実装して隠し、Close メソッドを Dispose として実装する、です。using 句では IDispose にキャストするので、公開した Close では Dispose を呼ぶのみとし、Dipsose に実装することが望ましいとされています。
あくまで、「生成破棄」か「開く閉じる」かの違いです。
くじ引きなら、「引く捨てる」になるかも?


# re: Close が Dispose 呼ぶのが気に食わない 2007/02/02 23:09 THREE-ONE
こういうことでしょうか?
・破棄を実装するのは Dispose である。
・が、ほかに破棄を請け負うにふさわしい名前のメソッドを実装する場合、Dispose を呼び出すものとする。
Close に限らず、例えば Release とかでもやることは同じ。
で、その際 Dispose は明示実装でクラスからは隠す。
パターンの問題だから Close という名前にこだわってもしゃあないよ。
ただ Close っていう例が多いだけだ。と
とにかく破棄処理は Dispose に書け!by Microsoft
ってことなんでしょうか?

# re: Close が Dispose 呼ぶのが気に食わない 2007/02/03 23:04 渋木宏明(ひどり)
>その際 Dispose は明示実装でクラスからは隠す。

隠すかどうかはクラス設計者の裁量です。

>とにかく破棄処理は Dispose に書け!by Microsoft ってことなんでしょうか?

そうです。(ただし「アンマネージ資源の廃棄処理は」ですが)
もっと正確に言えば IDisposable.Dispose() ね。
じゃないと using 句が使えない。



Post Feedback

タイトル
名前
Url:
コメント: