2016-09-28 1 views
0

この例では、シリアライザオブジェクトは、2つのメソッドのインスタンス変数またはメソッド変数である必要がありますか?両方のアプローチの長所と短所は何ですか?この例では、インスタンス変数かメソッド変数か?

public class CustomerHelper 
{ 

    private _Serializer; 
    private JavaScriptSerializer Serializer { 
     get 
     { 
      if (_Serializer == null) { 
       _Serializer = new JavaScriptSerializer(); 
      } 
      return _Serializer; 
     } 


    public Customer GetJsonLog(Customer Cust) 
    { 
     return GetFromLog(Serializer.Searilize(Cust)); 
    } 

    public void WriteToLog(Customer Cust) 
    { 
     SaveToLog(Serializer.Searilize(Cust)); 
    } 
} 

編集 - スレッドセーフに関する問題を無視して、Seralizerオブジェクトが再利用されるとします。

+0

コード内でシリアライザに到達するための2つの異なる方法 - 基本的には 'NullReferenceException'をスローする可能性があることを心配します。なぜあなたのコンストラクタでそれを初期化し、 'private serialiser'プロパティを削除しないのですか? – MickyD

+0

そのプロパティが2つの異なるメソッドでのみ使用されている場合はどうなりますか?だからこそ私はそれを怠けていたのです。 – user3587180

+0

私はなぜこの質問が投票されているのか分かりません。私はそれが有効な質問だと思った。 – user3587180

答えて

3

あなたのユースケースによって異なります。 CustomHelperが長期間使用されている場合、ローカルスコープのメソッドフィールドではなく、メンバープロパティ(遅延オブジェクトでもなくてもフィールドであっても問題ありません)として保持して再利用することを意味します。 。シリアライザを一度割り当ててから、そのインスタンスを再利用するだけで済みます。

また、あなたのユースケースによって異なります。もしWriteToLogメソッドがCustomHelperの状態に突然変異を起こし、それがSerializerというプロパティをインスタンス化していたとします。以降のすべての呼び出しで変異したSerializerプロパティを共有したいですか?新しいシリアライザが必要な場合は、メソッド内でインスタンス化するだけです。

あなたの例では、CustomHelperはステートレスで、Serializerもそうであると仮定しています。その場合、問題は存在しません。しかし、このような設計上の決定を下す際には、留意すべきことです。

CustomHelperが長生きしている場合は、プロパティを削除してプライベートフィールドを使用してコードを少し修正します。それが長期間続くと、ヘルパーをインスタンス化して初めて使用する確率が高くなります。したがって、コンストラクタでシリアライザをインスタンス化することは、本当に傷つくことはありません。その後の呼び出しで同じCustomHelperインスタンスを再使用する場合は、それほどです。

関連する問題