생성자에 대한 정적 객체 생성 방법의 장단점은 무엇입니까?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
내가 생각할 수있는 사람은 거의 없다.
장점 :
- 예외를 던지는 대신 null을 반환하십시오 (name
TryCreate
). 이렇게하면 클라이언트 쪽에서 코드를 더 간결하고 깨끗하게 만들 수 있습니다. 클라이언트는 생성자가 실패 할 것으로 거의 예상하지 않습니다. - 명확한 의미, 예와 다른 종류의 객체 생성
CreatFromName(String name)
및CreateFromCsvLine(String csvLine)
- 필요한 경우 캐시 된 객체 또는 파생 된 구현을 반환 할 수 있습니다.
단점 :
- 덜 알아볼 수 있고 코드를 탈지하기가 더 어렵습니다.
- 직렬화 또는 반사와 같은 일부 패턴 (예 : 더 어렵습니다
Activator<Foo>.CreateInstance()
)
1
더 느립니다. 어쨌든 null 참조를 처리해야합니다.
—
Amir Rezaei
@Amir 처리 null은 (
—
dbkk
Foo x = Foo.TryCreate(); if (x == null) { ... }
)입니다. ctor 예외 처리는 ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }
)입니다. 일반적인 메소드를 호출 할 때 오류 코드보다 예외를 선호하지만 객체 생성시 TryCreate
더 깨끗해 보입니다.
유효성 검사에서 유형 검사를 수행 하시겠습니까?
—
Amir Rezaei
두 번째 프로에 관해서, "명확한 의미와 다른 종류의 객체를 생성, 예를 들어 CreatFromName (문자열 이름)과 CreateFromCsvLine (문자열 csvLine)는"당신이 만들 더 좋을 수
—
bentayloruk
Name
및 CsvLine
유형보다는 명시 적 요구 사항 메소드 이름을 통해. 이렇게하면 Create를 오버로드 할 수 있습니다. 두 가지 모두에 문자열을 사용하는 것은 "원시적 인 집착"으로 간주 될 수 있습니다 (알려진 성능상의 이유로이 선택을하지 않았다고 가정). 재미있는 방법으로 Object Calisthenics 를 확인하십시오 .