래퍼에 많은 통과 함수를 작성하지 않으려면 어떻게해야합니까?


13

공통 기본 유형의 다른 클래스를 래핑하는 클래스가 있습니다. 기본 유형 인터페이스가 상당히 크기 때문에 많은 통과 함수를 작성해야합니다. 나는 이것을 피할 수있는 방법을 찾고 있습니다.

예를 들어 보자.

      Car
     /   \
Volvo     VolvoWithTrailer

이제 VolvoWithTrailer의 자동차 인터페이스에서 각각의 모든 함수를 구현하고 더 낮은 값을 반환하는 GetMaxSpeed ​​()를 제외하고 래핑 된 Volvo 객체에서 적절한 함수를 호출해야합니다. 기본적으로 나는 많은 기능을 가질 것이다

int VolvoWithTrailer::GetNumSeats() {
  return mVolvo.GetNumSeats()
}

이를 해결하는 확실한 방법은 VolvoWithTrailer를 Volvo의 하위 클래스로 만드는 것입니다.

    Car
     |
   Volvo
     |
VolvoWithTrailer

그러나 그것은 상속보다 구성을 선호하는 원칙을 위반하는 것 같습니다.

래퍼를 작성하지 않으려면 어떻게해야합니까 (언어는 C ++ 임)? 또는-그것이 당신의 입장이라면-왜 그냥 쓰거나 상속을 사용해야합니까? 이것에 도움이 될만한 템플릿 마법이 있습니까?


2
그럼에도 불구하고 Java로 생각하지 않았습니다. '예고편'인터페이스는 어떻습니까? VolvoWithTrailer는 볼보를 확장하고 트레일러 인터페이스를 구현합니까?

7
그렇게하는 것이 합리적 일 때만 상속보다 구성을 선호하십시오.
Robert Harvey

@RobertHarvey : +1 그것은 "원칙"이 아니라 지침이며 절대적인 계명은 아닙니다.
메이슨 휠러

파이썬에서는 내성 (C #이 리플렉션이라고 함) 으로이 문제를 해결할 수 있습니다.
user16764

1
IDE가 코드 생성을 처리하지 않습니까?
Amy Blankenship

답변:


5

제 의견은 프로그램의 장기적인 안정성과 유지 관리 성을 향상 시키기 위해 작성해야 할 내용을 작성해야한다는 것 입니다. 오늘 20 줄의 코드를 작성하지 않는 것이 요점입니다.이 코드를 사용하는 무언가를 만지거나이 클래스를 유지하기 위해 돌아올 때마다 오늘 시간을 투자하지 않아 5 분 이상이 더 소요됩니다.

따라서 질문은 "무엇을 작성해야합니까?"가됩니다. 나는 당신이 충분한 정보 난 그냥 몇 가지 물건 목록을 것입니다, 그래서 확실한 대답을 할 수 있도록 제공 할 생각하지 않아요 내가 결정을 내리기에 대한 생각을 :

1. 예고편 또는 미래에 예고편 개체를 소유해야합니까?
그렇다면 두 복합 객체를 감싸는 래퍼를 만드는 데 꽤 좋은 주장이 있습니다. 이미 래핑해야 할 것이기 때문입니다. 일관성이있을 수도 있습니다.

2. 개발자가 자주 사용하는 코드 영역에 세 가지 유형 (Car, Trailer, CarWithTrailer)이 있습니까?
그렇다면 코드를 터치 할 때마다 잘못된 항목을 선택하면 발생하는 비용이 크게 상쇄 될 수 있으므로 매우주의해야합니다. 그렇지 않으면 결정한 내용에 차이가 없을 수 있습니다. 방향을 고르면됩니다.

3. 이해하기 가장 쉬운 것은 무엇입니까?
당신의 뒤에 오는 누군가가 당신이하려는 일을 즉시 "얻을"것이라는 한 가지 접근법이 당신에게 튀어 나옵니까? 팀원에게는 특정 편견이있어 한 가지 접근 방식을 유지하기가 어려울 수 있습니까? 모든 것이 동일하면 가장 낮은인지 부하를 부과하는 솔루션을 선택하십시오.

4. 한 가지 방법을 다른 방법보다 사용하면 어떤 이점이 있습니까?
나를 밖으로 점프 한 가지 래퍼 아이디어는 당신이 당신의 CarWithTrailerWrapper 바꿈 수를 작성하는 경우 뚜렷한 장점이 있다는 것입니다 어떤 자동차와 어떤 CarWithTrailer에 트레일러를. 그런 다음 모든 패스 스루 메소드를 작성하지만 각 클래스마다 한 번이 아니라 한 번만 작성합니다 .

이렇게하면 자동차와 트레일러를 더 추가 할 때 패스 스루 방법을 작성하는 초기 투자 비용이 훨씬 저렴 해집니다. 또한 하나의 구현으로 더 많은 것을 할 수 있기 때문에 물건을 Volvo 또는 VolvoWithTrailer에 직접 연결하려는 유혹을 줄이고 CarWithTrailerWrapper에 대한 결합 결과를 줄입니다.

확장 방법을 사용하면 무료로 얻을 수있는 뚜렷한 이점이있을 수 있지만 보이지는 않습니다.

좋아, 그래서 나는 사소한 응용 프로그램을 위해 계속 진행하고 통과 방법을 작성하는 것에 대해 이야기 한 것처럼 보입니다.

저는 C ++ 프로그래머가 아니므로 어떤 코드 생성 도구를 사용할 수 있는지 잘 모릅니다. 내가 사용하는 IDE는 인터페이스에서 메소드를 생성 할 수 있으며 통과를 작성하는 데 어려움을 겪지 않는 코드 템플릿추가 할 수 있습니다 . 이 작업을 수행하는 IDE에 액세스 할 수 없으면 실제로 Excel에서 코드를 작성 하도록 할 수 있습니다 .


3

기본 유형 인터페이스가 상당히 크기 때문에 많은 통과 함수를 작성해야합니다.

그리고 당신의 문제가 있습니다.

인터페이스는 하나의 책임 만 처리해야합니다. 그것들을 얇고 집중적으로 유지하면 데코레이터, 프록시 또는 기타 래퍼의 경우 수행해야 할 통과 작업의 양이 제한됩니다 (클래스 Simpiler를 사용, 테스트, 유지 관리 및 확장하는 것).


5
어? 한 클래스는 여러 인터페이스를 구현할 수 있으며 인터페이스는 서로 상속 할 수 있습니다. 따라서 인터페이스가 아주 작은 경우에도 인터페이스를 구현하는 클래스에 많은 함수 나 통과 함수가 필요한지 여부와 관련이 없습니다. 클래스가 작고 잘 정의 될수록 통과 함수 필요할 가능성이 높아집니다 .
Amy Blankenship
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.