2012-05-14 13 views
14

コードのレビューでは、共同作業者が自分のコードを変更してストリームとしてパラメータとして渡しました。彼は、これは、オブジェクトを処分する責任が発信者にはっきりしていることを保証することだと述べました。ある意味で私は共感することができます。私はオブジェクトクリエイターもクリーンアップの責任を負うことを望んでいます。使い捨て可能なオブジェクトを渡す必要がありますか?

どちらの方法でも、どちらの方法も、もう一度明らかにする必要はありません。私はより簡単なメソッド呼び出しも好む。

VS

public static TextReader Serialize<T>(T obj) where T: new() 
    { 
     if (obj == null) throw new ArgumentNullException("obj"); 
     return Serialize<T>(obj, null); 
    } 

を取る

public static void Serialize<T>(T obj, TextWriter outbound) where T : new() 
    { 
     if (obj == null) throw new ArgumentNullException("obj"); 
     Serialize<T>(obj, outbound, null); 
    } 

渡すパラメータを追加するための技術的な理由はありますか?

+3

たとえば、XmlSerializerなどの.NET Framework自体からヒントを取得すると、ストリームはパラメータとして渡される傾向があります。 – mellamokb

+0

http://codereview.stackexchange.com/の質問があります – MattDavey

答えて

9

あなたのコードアーキテクチャに厳密に依存します。それは近い/ストリームを処分しないであろう第二のアプローチ(それはもう一つの引数を追加した場合でも)関数の定義状態のような個人的に

私は、、、それは発信者次第です。

これは、同じ関数を同じストリームで呼び出すときに便利です。想像すると、すべての関数呼び出しがストリームを閉じて再オープンし、リソースを消費する操作になります。

4

すでにTextWriterを開いている可能性があります。だから私は2番目のバージョンが好きです。また、Serializeメソッドの範囲を縮小します。シリアル化されていますが、何も開きません。オープニングは別の関心事です。

0

オーバーロードされたSerialize-Tメソッドは、ストリームを作成しますか?一方

using (var stream = Serialize(a_T))) 
{ 
    // Do something else with the stream? 
} 

、ストリームを供給するために、発信者のためのより良いかもしれない。その場合にはあなたが合格したいのですが、:そのような場合、それは単純に「を使用」になりbecuase私は#1を好みますプロジェクトが進化するにつれて、プログラマ(S)最初アプローチでコードを維持することは、それが(特に非自明な例で)ストリームを閉じるために、呼び出し元のコードの責任だとラ・オプション2.

1

内の1つのを覚えていないかもしれません。通話者は正しいことをするための文書に頼らなければならず、誰もが文書を読むのでしょうか? ;)

第2のは、より良く接近します。"balances" resourcesです。責任の分離がどこにあるのかがはっきりしています。

関連する問題