2016-09-28 2 views
0

이 예제에서는 Serializer 개체가 두 메서드에서 인스턴스 변수 또는 메서드 변수 여야합니까? 두 가지 접근 방식의 장단점은 무엇입니까?이 예제에서는 인스턴스 변수 또는 메서드 변수 여야합니까?

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

"NullReferenceException"을 던질 수있는 코드에서 serialiser에 도달하는 두 가지 다른 방법이 필요하다는 것에 대해 더 걱정할 것입니다. 왜 당신의 생성자에서 그것을 초기화하고'private serialiser' 속성을 없애지 않을까요? – MickyD

+0

해당 속성이 두 가지 다른 메서드에서만 사용되는 경우 무엇입니까? 그래서 내가 게으른 로딩이었습니다. – user3587180

+0

이 질문에 투표가 왜 내려 졌는지 나는 잘 모르겠습니다. 나는 그것이 유효한 질문이라고 생각했다. – user3587180

답변

3

사용 사례에 따라 다릅니다. CustomHelper이 수명이 길다는 의미입니다. 즉, 지역 범위의 메소드 필드가 아니라 더 오래 머물러 서 재사용 한 다음 멤버 속성 (게으르거나하지 않거나 심지어 필드도 중요하지 않음)으로 만드는 것입니다. . 일단 Serializer를 한 번만 할당 한 다음 해당 인스턴스를 다시 사용해야합니다.

다시 말씀 드리지만, 사용 사례에 따라 다릅니다. WriteToLog 메서드가 CustomHelper의 상태를 변경하고 무언가가 Serializer이라는 속성을 인스턴스화하는 경우를 상상해보십시오. 모든 후속 호출에서 돌연변이 된 Serializer 속성을 공유 하시겠습니까? 새로운 Serializer를 원한다면, 당신은 당신의 방법으로 그것을 인스턴스화 할 것이다.

예에서 CustomHelper은 상태 비 저장이며 나는 Serializer도 있다고 가정합니다. 그렇다면 문제가 존재하지 않습니다. 그러나 이런 종류의 디자인 결정을 내릴 때 명심해야 할 것이 있습니다.

부수적으로, CustomHelper이 오래 살아 있다면 속성을 제거하고 개인 필드를 사용하여 코드를 약간 정리할 것입니다. 수명이 길어질 때, 당신이 그것을 사용할 헬퍼를 처음으로 인스턴스화 할 확률이 있습니다. 따라서 생성자에서 Serializer를 인스턴스화하는 것은 실제로 상처를주지는 않습니다. 후속 호출에서 동일한 CustomHelper 인스턴스를 다시 사용하는 경우에도 마찬가지입니다.

관련 문제