2012-05-14 5 views
14

코드 검토에서 동료가 코드를 변경하여 스트림에서 매개 변수로 전달했습니다. 그는 이것이 물체를 처분 할 책임이 호출자에게 분명하다는 것을 보증하는 것이라고 말했다. 어떤 의미에서 나는 공감할 수 있습니다. 나는 또한 객체 제작자가 정리를 책임지는 것을 선호 할 것이다.일회용 물체를 통과시켜야합니까?

다른 한편으로는 어느 방법도 using에 대한 필요성을 없앴습니다. 나는 더 간단한 메소드 호출을 선호한다.

여분 PARAM를 추가 할 수있는 기술적 인 이유가

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

VS

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

코드 구조에 따라 다릅니다.

I, 개인적으로 두 번째 방법처럼 (이 하나 개 더 인수를 추가하는 경우에도) 여기서 함수의 정의상태가 닫히지/스트림을 처리하지만, 그것은 발신자에게 달려.

동일한 스트림에서 동일한 함수를 호출 할 때 유용합니다. 상상할 경우 모든 함수 호출이 닫히고 스트림을 다시 열어 리소스를 소비하는 작업이됩니다.

4

이미 열려있는 TextWriter가있을 수 있습니다. 그래서 두 번째 버전을 선호합니다. 또한 Serialize 메서드의 범위를 줄입니다. 직렬화되었지만 아무 것도 열리지 않습니다. 오프닝은 다른 관심사입니다.

0

오버로드 된 Serialize-T 메서드는 스트림을 생성합니까? 한편

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

,이 스트림을 공급하는 호출자의 경우 더 좋을 수도있는 경우에 당신이 통과하고 싶습니다 : 그런 경우는 단순이 '사용'하게 becuase 나는 # 1을 선호 하나의 옵션 2.

1

코드를 유지하는 프로그래머는 접근 방식을 사용하면 스트림을 닫는 것이 호출 코드의 책임이라는 것을 기억하지 못할 수 있습니다 (특히 단순하지 않은 경우) . 호출자는 올바른 일을하기 위해 문서에 의존해야하며 모든 사람들이 문서를 읽습니다. ;)

제 2의은보다 양호하게 접근한다. "balances" resources. 그것은 책임의 분리가있는 곳에서 훨씬 더 명확하게 만듭니다.

관련 문제