객체 생성이 암시 적 또는 명시 적으로 파일을 생성해야합니까?


9

하나의 형식의 파일로 읽고 다른 형식의 다른 것을 만드는 것이 유일한 목적을 가진 객체를 만들고 있습니다.

객체를 초기화하는 동안 암시 적으로 출력 파일을 만들거나이 파일을 만들 때 사용자에게 선택권을주는 공개 메서드를 사용하는 것이 가장 좋습니까?

답변:


12

지원하는 언어로 작업하는 경우 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);

1
이거 좋다 비슷한 또 다른 옵션은 응용 프로그램에있는 모든 스트림 기반을 구현하고 다른 스트림처럼 처리하는 객체를 구현하는 것입니다.
Steven Evers

3

수업 시간에 구부러진 경우 초기화 중에 작성하십시오. 이 단계를 연기하면 두 가지 나쁜 일이 발생합니다. 첫째, 발신자를 위해 추가로 명시적인 단계를 추가합니다. 발신자는 출력을 생성하기 위해 객체를 사용하지 않는 한 처음부터 객체를 만들지 않았습니다. 둘째, 클래스의 코드가 파일이 열려 있는지 여부를 결정하고 해당 조건을 처리해야하는 지점을 두 개 이상 추가합니다. 출력을 쓰려고 할 때 한 번, 닫을 때 소멸 할 때 한 번입니다. 전자는 모든 쓰기 작업을 수행 할 때 마다 확인해야 하므로 많은 작업을 수행하면 낭비가 될 수 있습니다.

개인적으로, 나는 호출자가 생성자에게 미리 열린 파일 핸들을 전달하도록 선택하지 않을 것입니다. 클래스 내에서 파일을 만들면 호출자에게 권한 설정과 같은 작업을 수행하거나 장치에 쓰는 경우 장치 별 초기화를 수행하는 옵션을 제공 할 수 없습니다. FooConverter파일에서 작동하고 생성 작업이 수행되는 클래스 버전을 원한다면로 묶으십시오 FooFileConverter.


2

명백히

향후 릴리스 또는 일반적이지 않은 아키텍처에서 깨질 수있는 영리한 부작용 규칙에 의존하지 않도록하고 싶습니다. 물론, 사용자가 원하는 경우 덮어 쓸 수있는 기본 파일이 있어야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.