2014-01-07 3 views
1

신청서에 문제가 있습니다. 서비스에서 응답을 얻고 있습니다. 때로는 데이터베이스 또는 일부 다른 미디어에서 때로는 캐시에서 응답을 변환하고 저장해야합니다. 응답을 유지할 필요가 없지만 응답 만 변환하고 객체를 반환 할 필요가있는 시나리오도있을 수 있습니다. 나는 다음과 같은 설계 구현 : 난 단지 객체 (NO persiatance)을 변환하는 데 필요한 시나리오에서는, 위의 구현에서구성된 오브젝트에서 Null을 플래그로 사용하는 것이 좋은가요?

public class Response { } 

class MyData { } 

interface IPersistance 
{ 
    public void PersistData(MyData data); 
} 

public class DBPersitance : IPersistance 
{ 
    public void PersistData(MyData data) { } 
} 

public class CachePersitance : IPersistance 
{ 
    public void PersistData(MyData data) { } 
} 

public class MySeviceData 
{ 
    private IPersistance persistence; 

    public MySeviceData(IPersistance persistance) 
    { 
     _persistance = persistance; 
    } 

    public MyData GetServiceData(Response reponseXML) 
    { 
     MyData output = new MyData(); 

     // Here output object is filled with data from responseXML 

     // Object persistance as defined in constructor 
     if(_persistance!=null) 
      _persistance.PersistData(output); 

     return output; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyData output = new MyData(); 
     Response responseXML = new Response() ; 

     //Case 1: Cache the response 
     CachePersitance cache = new CachePersitance(); 
     MySeviceData srvData = new MySeviceData(cache); 
     output = srvData.GetServiceData(responseXML); 

     //Case 2: Write the response in Database 
     DBPersitance db = new DBPersitance(); 
     MySeviceData srvData = new MySeviceData(db); 
     output = srvData.GetServiceData(responseXML); 

     //Case 3: No need to persist. Only Convert and return the response 
     MySeviceData srvData = new MySeviceData(null); 
     output = srvData.GetServiceData(responseXML); 
    } 
} 

을, 나는 null 지속성 객체를 전달했습니다. 이 접근법이 맞습니까? 아무도 이런 종류의 요구 사항에 대해 더 나은 디자인을 제안 할 수 있습니까?

+0

당신은 대신 매개 변수가없는 생성자를 추가 할 수 있습니다 같이 사용하지

public class NoPersitance : IPersistance { public void PersistData(MyData data) { // Nothing to do } } public class MySeviceData { private IPersistance _persistance; public MySeviceData(IPersistance persistance) { if (persistance == null) throw new ArgumentNullException("persistance"); _persistance = persistance; } public MySeviceData() : this(new NoPersistance()) { } public MyData GetServiceData(Response reponseXML) { Debug.Assert(_persistance != null); MyData output = new MyData(); // Fill your object's data // Store object somewhere _persistance.PersistData(output); return output; } } 

(매개 변수는 MyServiceData 생성자 오버로드에 설명 할 수있는 지속성을 의미) 널 (NULL)을 전달합니다. 그러나 이것은 실제로 스타일과 의견의 문제가되어 Stack Overflow에 적합하지 않습니다. –

+0

한 가지 생각은 가능하다면'null'을 확인하기 위해'if'를 피하는 것입니다. 빈'IPersistance' (예를 들면'NoPersistance') 구현이 효과적입니다. 기본값 인 곳에서 오버로드를 제공하면 더욱 부드럽게됩니다. –

답변

1

가능하면 언제든지 if에서 null을 확인하는 것이 좋습니다. 우리는 동의할지 모르겠다. (그리고 이것은 매우 근거가있다. IMO 좋다. 그러나 granal salis, null정보을 가지고있을 때 항상 악의가있는 것은 아니다. 당신이 코드를 읽을 때

이 명백한 의도를 만들 것 대신 null의 빈 클래스를 사용하려면 ( 지속성가 null? 무슨 뜻인지? 기본 한 다음이 기본 무슨 경우? 하나 아무도 기본?).

비어있는 IPersistance (예 : NoPersistance) 구현이 작동합니다. 가장 일반적인 경우 파라미터가없는 생성자 오버로드 (예 : 다음 예와 같이)를 제공 할 수도 있습니다 (명시 적으로 만들 필요가 없으며이 경우 제거 만하면됩니다).

MySeviceData srvData = new MySeviceData(); 
output = srvData.GetServiceData(responseXML); 

또는 같은

가 :

MySeviceData srvData = new MySeviceData(new NoPersistance()); 
output = srvData.GetServiceData(responseXML); 
+0

답변 해 주셔서 감사합니다. 왜 우리가 여기에 오버로드 된 생성자가 필요합니까? – user3169906

+0

@ user3169906 두 번째 예제 (NoPersistance 클래스 사용을 명시 적으로 말한)의 구문에 대한 바로 가기로 첫 번째 예제 (매개 변수 = 없음 지속성 없음)의 구문을 허용 할 수 있습니다. 그런 단축키가 필요하지 않다면 (또는 항상이 선택을 분명히하고 싶다면) 단순히 그 과부하를 제거하고 행복하게 할 수 있습니다. –

관련 문제