2011-09-04 2 views
4

이것은 이론적 인 질문입니다.이 문제에 대한 표준 절차를 찾기 위해 사용하고 있습니다.생성자에서 얼마를 수행해야합니까?

데이터를 수집하는 설정 작업을 많이하는 생성자 메서드가있는 경우 생성자에서 "모든 항목 생성"을 유지해야하며 그렇지 않으면 생성자 내부에서 다른 메서드를 호출해야합니까? 기본적으로), 또는 내가해야 할 모든 것을 초기화해야하고 나중에 실제로 처리해야하는 다른 것들을 남겨 두어야합니까?

다음은 예입니다.

기본적으로 컬렉션 관리자 인 객체를 만듭니다. 파일로부터 데이터를 읽어 들여 배열 안에 저장합니다.

기본 속성을 가진 객체를 만들고 나중에 데이터를 읽는 데는 생성자를 사용합니까? 아니면 모든 정보를 읽고 나중에 시간을 절약하지만 여기에 여분의 시간이 소요되는 생성자 안의 배열을 설정해야합니까? 아니면이 실제 코드, 다른 방법으로 아웃소싱 단지 예 "꽤 코드까지"대신 슈퍼 긴 생성자 메서드의 내가 말 5- 할 수 할 수없는

public myConstructor(String filename) { 
data = readDataIn(filename); 
} 

의 라인을 따라 뭔가해야 생성자가 접근 할 수있는 짧고보기 좋은 메소드 6 개.

+2

"super long"을 사용하면 생성자가 그렇지 않을 것으로 예상됩니까? 당신의 수업이 SRP를 심하게 위반하고있을 가능성을 고려 했습니까? –

+0

@karl, 예, 있습니다. 나는 이것을 "알기"위해 대부분 물었고, 단지 내가 느끼지 못했기 때문에 뭔가를 위반하고 있다는 느낌이 들기도했기 때문에 .... : P – Andy

답변

8

생성자는 계약을 충족하는 상태로 인스턴스를 가져 오기에 충분한 작업 만 수행해야합니다. 그런 다음 각 메소드는 메소드의 계약을 이행하고 인스턴스를 계약을 충족시키는 상태로두기에 충분한 작업을 수행해야합니다.

생성자 호출이 부작용을 일으키거나 입력을 수정하는 경우는 거의 없습니다. 이것들은 단지 계약을 만족시키기 위해 자주 요구되지 않습니다. 예를 들어, 연결 클래스는 구성중인 네트워크를 만지지 않아야합니다. 닫을 수 있어야하므로 닫힌 상태가 계약의 일부 여야하므로 "충분한 작업"표준은 생성자가 준비 상태이지만 아직 열지 않은 상태로 설정하도록 지시합니다.

귀하의 특정 예제는 클래스를 파일 시스템에 연결합니다. Guava Files을 사용하여 읽기를 수행하고 대신 내용이있는 문자열을 가져 와서 더 많은 테스트 가능한 일반 클래스를 얻을 수 있습니다. new MyClass을 수행하는 편리한 static MyClass fromFile(String path) 팩토리 함수를 작성하여 파일 시스템에 결합 된 생성자의 편리함을 얻을 수 있습니다. 그러면 인스턴스 변수와 상호 작용하는 부분 외부의 파일 시스템에 연결된 코드 부분이 테스트 할 수있는 상호 작용 수를 줄 이도록 이동합니다. 다른 사람들이 지적했듯이 의존성 주입은 디커플링을 달성하는 또 다른 좋은 방법입니다.

+0

고마워, 그게 정확히 내가 무엇을 찾고 있었는지 설명 해준다. – Andy

2

정말 API 스타일에 따라 다릅니다. 이 같은 여러 개의 생성자,이 할 수 있습니다 :

public MyThing(String filename) { } 
public MyThing(FileInputStream filestream) {} 
public MyThing(File file) { } 
public MyThing(byte[] rawdata) { } 

을하는 그 (파일 열기 및 파일 구문 분석)이 경우

0

방법 또는 두 가지로 파일 로딩 작업을 통합 할 현명한, 내가 의존성 삽입을 사용하여 생성자가 이미 계산 된 데이터를 필요로하고 생성자를 호출하는 모든 것에 계산을 연기하도록합니다. 이 모든 복잡한 설정을 수행하는 추가 정적 팩토리 함수를 제공하여 (예 : 테스트에서)이 객체를 구성하는 것이 편리하지만 최소한이 클래스의 사용자가 더 영리하게 (예 : 이 클래스를 생성하는 방법은 병렬화 또는 지연 초기화 된 방식 일 수 있습니다.

관련 문제