클래스를 설계 할 때 일반적인 프로그래밍 방식보다 동작의 일관성을 선호해야합니까? 구체적인 예를 들자면 :
일반적인 규칙은 다음과 같습니다. 클래스가 객체를 소유 한 경우 (예 : 객체를 생성 한 경우) 완료되면 정리해야합니다. .NET에서는 클래스가 IDisposable객체를 소유하는 경우 수명이 다했을 때 처리해야하는 특정 예가 있습니다 . 당신이 그것을 소유하지 않으면 그것을 만지지 마십시오.
이제 StreamWriter.NET 에서 클래스를 살펴보면 문서에서 기본 스트림이 닫히거나 처리 될 때 닫히는 것을 확인할 수 있습니다. 이것은이 경우에 필요하다 StreamWriter작가가 기본 파일 스트림을 생성하고, 따라서이를 종료해야합니다 같은 파일 이름을 전달하여 인스턴스화됩니다. 그러나 외부 스트림을 전달할 수도 있습니다.
이것은 나에게 많은 시간을 낭비했다.
내 클래스 중 하나에서 이러한 패턴에 도달하면 일반적으로 생성자를 통해 주입 된 ownsFooBar경우 false로 설정되고 FooBar그렇지 않으면 true로 설정 되는 플래그를 만듭니다 . 이렇게하면 인스턴스를 명시 적으로 전달할 때이를 정리하는 책임이 호출자에게 전달됩니다.
이제 일관성이 모범 사례보다 유리 해야하는지 궁금합니다 (또는 내 모범 사례가 그렇게 좋지 않을 수도 있음)? 그것에 대한 논쟁이 있습니까?
설명을 위해 편집
"일관성"이란 의미 : 개체를 만들거나 소유권을 명시 적으로 이전 한 경우에만 개체의 소유권을 가져 오기 위해 클래스의 일관성있는 동작이 항상 소유권 (및 스트림 닫기) 대 "모범 사례"를 취하는 것입니다.
언 노잉하는 예를 들어 보자.
데이터를 생성하고 처리하는 것과 같이 스트림을 사용하여 스트림을 허용하는 두 개의 지정된 클래스 (일부 타사 라이브러리의)가 있다고 가정하십시오.
public class DataProcessor
{
public Result ProcessData(Stream input)
{
using (var reader = new StreamReader(input))
{
...
}
}
}
public class DataSource
{
public void GetData(Stream output)
{
using (var writer = new StreamWriter(output))
{
....
}
}
}
이제 다음과 같이 사용하고 싶습니다.
Result ProcessSomething(DataSource source)
{
var processor = new DataProcessor();
...
var ms = new MemoryStream();
source.GetData(ms);
return processor.ProcessData(ms);
}
Cannot access a closed stream데이터 프로세서에서 예외 로 인해 실패 합니다. 약간 구성되었지만 요점을 설명해야합니다. 그것을 고치는 다양한 방법이 있지만 그럼에도 불구하고 내가해야 할 일을 해결한다고 생각합니다.