답변:
지원하는 언어로 작업하는 경우 Stream을 사용하는 Save 메서드를 제공합니다. 이렇게하면 사용자는 원하는 곳에 데이터를 저장할 수 있습니다.
파일에 저장하는 것보다 쓰기에 20 초가 걸리지 만 프로그래머가 쉽게 이해할 수 있으며 호출 사이트에서는 실제로 어떤 일이 발생하는지 매우 분명합니다.
당신이 그것을 묘사 한 방식 (입력을 읽고 다른 파일로 출력하는 객체)은 다르게 보입니다. 시공 중 모든 것을 수행하는 객체를 구성하는 목적은 무엇입니까?
이런 식으로 부르시겠습니까?
var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;
SaveFileWeirdClass의 합리적인 구현에 대해서는 그냥 생성하는 것만으로는 부작용이 없을 것입니다. 파일 읽기-좋아요. 파일을 작성 하시겠습니까? 아니.
나에게 이것은 다음과 같이 더 분명해 보입니다.
var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;
using(Stream stream = new FileStream(filePath))
stuff.Save(stream);
수업 시간에 구부러진 경우 초기화 중에 작성하십시오. 이 단계를 연기하면 두 가지 나쁜 일이 발생합니다. 첫째, 발신자를 위해 추가로 명시적인 단계를 추가합니다. 발신자는 출력을 생성하기 위해 객체를 사용하지 않는 한 처음부터 객체를 만들지 않았습니다. 둘째, 클래스의 코드가 파일이 열려 있는지 여부를 결정하고 해당 조건을 처리해야하는 지점을 두 개 이상 추가합니다. 출력을 쓰려고 할 때 한 번, 닫을 때 소멸 할 때 한 번입니다. 전자는 모든 쓰기 작업을 수행 할 때 마다 확인해야 하므로 많은 작업을 수행하면 낭비가 될 수 있습니다.
개인적으로, 나는 호출자가 생성자에게 미리 열린 파일 핸들을 전달하도록 선택하지 않을 것입니다. 클래스 내에서 파일을 만들면 호출자에게 권한 설정과 같은 작업을 수행하거나 장치에 쓰는 경우 장치 별 초기화를 수행하는 옵션을 제공 할 수 없습니다. FooConverter
파일에서 작동하고 생성 작업이 수행되는 클래스 버전을 원한다면로 묶으십시오 FooFileConverter
.
명백히
향후 릴리스 또는 일반적이지 않은 아키텍처에서 깨질 수있는 영리한 부작용 규칙에 의존하지 않도록하고 싶습니다. 물론, 사용자가 원하는 경우 덮어 쓸 수있는 기본 파일이 있어야합니다.
명시 적 메서드에 대한 다른 인수 외에도 생성자에서 작업을 수행하는 경우 클래스의 모든 사용자가 개체를 만들기 위해 예외 처리를 수행하도록합니다. 이것은 많은 상용구 코드로 이어질 수 있습니다.
이에 대한 논의는 /programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception 을 참조 하십시오 .