공통 기본 유형의 다른 클래스를 래핑하는 클래스가 있습니다. 기본 유형 인터페이스가 상당히 크기 때문에 많은 통과 함수를 작성해야합니다. 나는 이것을 피할 수있는 방법을 찾고 있습니다.
예를 들어 보자.
Car
/ \
Volvo VolvoWithTrailer
이제 VolvoWithTrailer의 자동차 인터페이스에서 각각의 모든 함수를 구현하고 더 낮은 값을 반환하는 GetMaxSpeed ()를 제외하고 래핑 된 Volvo 객체에서 적절한 함수를 호출해야합니다. 기본적으로 나는 많은 기능을 가질 것이다
int VolvoWithTrailer::GetNumSeats() {
return mVolvo.GetNumSeats()
}
이를 해결하는 확실한 방법은 VolvoWithTrailer를 Volvo의 하위 클래스로 만드는 것입니다.
Car
|
Volvo
|
VolvoWithTrailer
그러나 그것은 상속보다 구성을 선호하는 원칙을 위반하는 것 같습니다.
래퍼를 작성하지 않으려면 어떻게해야합니까 (언어는 C ++ 임)? 또는-그것이 당신의 입장이라면-왜 그냥 쓰거나 상속을 사용해야합니까? 이것에 도움이 될만한 템플릿 마법이 있습니까?
답변
제 의견은 프로그램의 장기적인 안정성과 유지 관리 성을 향상 시키기 위해 작성해야 할 내용을 작성해야한다는 것 입니다. 오늘 20 줄의 코드를 작성하지 않는 것이 요점입니다.이 코드를 사용하는 무언가를 만지거나이 클래스를 유지하기 위해 돌아올 때마다 오늘 시간을 투자하지 않아 5 분 이상이 더 소요됩니다.
따라서 질문은 “무엇을 작성해야합니까?”가됩니다. 나는 당신이 충분한 정보 난 그냥 몇 가지 물건 목록을 것입니다, 그래서 확실한 대답을 할 수 있도록 제공 할 생각하지 않아요 내가 결정을 내리기에 대한 생각을 :
1. 예고편 또는 미래에 예고편 개체를 소유해야합니까?
그렇다면 두 복합 객체를 감싸는 래퍼를 만드는 데 꽤 좋은 주장이 있습니다. 이미 래핑해야 할 것이기 때문입니다. 일관성이있을 수도 있습니다.
2. 개발자가 자주 사용하는 코드 영역에 세 가지 유형 (Car, Trailer, CarWithTrailer)이 있습니까?
그렇다면 코드를 터치 할 때마다 잘못된 항목을 선택하면 발생하는 비용이 크게 상쇄 될 수 있으므로 매우주의해야합니다. 그렇지 않으면 결정한 내용에 차이가 없을 수 있습니다. 방향을 고르면됩니다.
3. 이해하기 가장 쉬운 것은 무엇입니까?
당신의 뒤에 오는 누군가가 당신이하려는 일을 즉시 “얻을”것이라는 한 가지 접근법이 당신에게 튀어 나옵니까? 팀원에게는 특정 편견이있어 한 가지 접근 방식을 유지하기가 어려울 수 있습니까? 모든 것이 동일하면 가장 낮은인지 부하를 부과하는 솔루션을 선택하십시오.
4. 한 가지 방법을 다른 방법보다 사용하면 어떤 이점이 있습니까?
나를 밖으로 점프 한 가지 래퍼 아이디어는 당신이 당신의 CarWithTrailerWrapper 바꿈 수를 작성하는 경우 뚜렷한 장점이 있다는 것입니다 어떤 자동차와 어떤 CarWithTrailer에 트레일러를. 그런 다음 모든 패스 스루 메소드를 작성하지만 각 클래스마다 한 번이 아니라 한 번만 작성합니다 .
이렇게하면 자동차와 트레일러를 더 추가 할 때 패스 스루 방법을 작성하는 초기 투자 비용이 훨씬 저렴 해집니다. 또한 하나의 구현으로 더 많은 것을 할 수 있기 때문에 물건을 Volvo 또는 VolvoWithTrailer에 직접 연결하려는 유혹을 줄이고 CarWithTrailerWrapper에 대한 결합 결과를 줄입니다.
확장 방법을 사용하면 무료로 얻을 수있는 뚜렷한 이점이있을 수 있지만 보이지는 않습니다.
좋아, 그래서 나는 사소한 응용 프로그램을 위해 계속 진행하고 통과 방법을 작성하는 것에 대해 이야기 한 것처럼 보입니다.
저는 C ++ 프로그래머가 아니므로 어떤 코드 생성 도구를 사용할 수 있는지 잘 모릅니다. 내가 사용하는 IDE는 인터페이스에서 메소드를 생성 할 수 있으며 통과를 작성하는 데 어려움을 겪지 않는 코드 템플릿 을 추가 할 수 있습니다 . 이 작업을 수행하는 IDE에 액세스 할 수 없으면 실제로 Excel에서 코드를 작성 하도록 할 수 있습니다 .
답변
기본 유형 인터페이스가 상당히 크기 때문에 많은 통과 함수를 작성해야합니다.
그리고 당신의 문제가 있습니다.
인터페이스는 하나의 책임 만 처리해야합니다. 그것들을 얇고 집중적으로 유지하면 데코레이터, 프록시 또는 기타 래퍼의 경우 수행해야 할 통과 작업의 양이 제한됩니다 (클래스 Simpiler를 사용, 테스트, 유지 관리 및 확장하는 것).