이 개념을 다른 출발점에서 봐야한다고 생각합니다. 데이터베이스 디자이너의 관점에서 살펴보십시오. 첫 번째 예제에서 전달 된 유형은 유용한 방법은 물론 고유 한 방식으로 매개 변수를 정의하지 않습니다.
public void bookTicket(
String name,
String firstName,
String film,
int count,
String cinema);
티켓을 예약하는 실제 고객을 지정하려면 두 개의 매개 변수가 필요합니다. 이름이 동일한 두 개의 다른 영화 (예 : 리메이크)가 있고 이름이 다른 동일한 영화가있을 수 있습니다 (예 : 번역). 예를 들어, 사용중인 (영화관의 특정 체인은 다른 지점이있을 수 있습니다, 그래서 당신은 어떻게 문자열과 일관성있는 방법으로 그와 거래를하려고 $chain ($city)
하거나 $chain in $city
또는 뭔가 다른 방법이이 있는지 확인하려고 최악의 경우 실제로 두 개의 매개 변수를 사용하여 고객을 지정하는 것입니다. 이름과 성이 모두 제공된다는 사실은 유효한 고객을 보장하지 않으며 두 가지를 구별 할 수 없습니다 John Doe
.
이것에 대한 대답은 유형을 선언하는 것이지만, 위에서 보여준 것처럼 얇은 래퍼는 거의 없습니다. 대부분 데이터 저장소로 작동하거나 일종의 데이터베이스와 연결될 것입니다. 따라서 Cinema
객체에는 이름, 위치 등이있을 수 있으며 이러한 방식으로 이러한 모호성을 제거 할 수 있습니다. 그것들이 얇은 포장지라면 우연의 일치입니다.
따라서 IMHO 블로그 게시물은 "올바른 유형을 전달해야합니다"라고 말하고 있으며 저자는 특히 기본 데이터 유형 (잘못된 메시지)을 선택하기 위해 지나치게 제한적인 선택을했습니다.
제안 된 대안이 더 좋습니다.
public void bookTicket(
Name name,
FirstName firstName,
Film film,
Count count,
Cinema cinema);
다른 한편으로, 나는 블로그 게시물이 모든 것을 감싸는 데 너무 멀다고 생각합니다. Count
너무 일반적이기 때문에 사과 또는 오렌지를 계산하고 추가 할 수 있으며 유형 시스템이 무의미한 작업을 수행 할 수있는 상황이 여전히 있습니다. 물론 블로그에서와 같은 논리를 적용하고 유형 CountOfOranges
등을 정의 할 수 있지만, 그것은 또한 어리석은 일입니다.
그만한 가치가 있기 때문에 실제로는
public Ticket bookTicket(
Person patron,
Film film,
int numberOfTickets,
Cinema cinema);
간단히 말해서 : 당신은 무의미한 변수를 전달해서는 안됩니다. 실제 객체를 결정하지 않는 값으로 객체를 실제로 지정하는 유일한 경우는 쿼리를 실행할 때 (예 :) public Collection<Film> findFilmsWithTitle(String title)
또는 개념 증명을 정리할 때입니다. 유형 시스템을 깨끗하게 유지하십시오. 너무 일반적인 유형 (예 :로 표시되는 영화 String
) 또는 너무 제한적 / 특정 / 구분 된 유형 (예 : Count
대신 int
)을 사용하지 마십시오 . 가능하고 실행 가능할 때마다 객체를 고유하고 명확하게 정의하는 유형을 사용하십시오.
편집 : 더 짧은 요약. 소규모 어플리케이션 (예 : 개념 증명)의 경우 : 복잡한 설계로 귀찮게하는 이유는 무엇입니까? 그냥 사용 String
하거나 사용 int
하십시오.
대규모 응용 프로그램의 경우 : 기본 데이터 형식의 단일 필드로 구성된 클래스가 많이있을 가능성이 있습니까? 그러한 클래스가 거의 없다면 "정상적인"객체 만 있고 특별한 것은 없습니다.
나는 문자열을 캡슐화한다는 아이디어를 느낍니다. ... 불완전한 디자인입니다. 소규모 응용 프로그램에는 지나치게 복잡하지만 큰 응용 프로그램에는 충분하지 않습니다.