2012-08-18 6 views
2

일부 클래스에 대한 작업 집합을 정의하기 위해 방문자 패턴을 사용하고 있습니다.
일부 작업은 교환 가능하므로 방문자 패턴 코드가 중복됩니다.
A B C B A C A C B B C C A C B A C B C B C C B C C B C C B C C B C C B C C B C C B C C B C C B B C
A * A, B * B, C * C는 고유합니다.
A * B, B * A 및 친구들이 코드 복제본을 사용합니다. A * B를 구현하고 B * A를 A * B로 호출 할 수는 있지만 결국 A : B 사이에서 작업을 어떤 파일에서 구현했는지 묻습니다. 그리고 B는 A 또는 B로 다시 나타 납니까? (약 6 개의 클래스가 있으므로이 질문을 많이하겠습니다. 가능한 한 15 쌍의 작업)
미래에 누군가가 A * B를 무한 루프로 돌릴 위험이 있습니다. B * A * B를 호출합니다. 새로운 작업을 구현할 때
A * B 또는 B * A 중 어느 것을 구현해야하는지 결정하는 규칙이 부자연 스럽습니다.
A * B와 B * A 중 하나가 호출하는 모든 구현 된 함수로 세 번째 파일을 만들 수 있지만 객체 지향적이지는 않습니다.
이 문제를 어떻게 해결할 예정입니까?
감사
(나는 몇 가지 코드를 나열 할 수 있지만이 길어 쉽게 포인트 설명하지 않습니다)대칭 방문자 패턴

답변

4

당신이 옳다을, 당신은 확실히 B*A의 호출로 A*B 구현을 자제해야한다. 코드가 대칭이 아니기 때문에 호출의 무한 사슬을 만들 가능성에 덧붙여이 접근법은 코드에서의 대칭 연산을 반영하지 않습니다.

더 나은 방법은 언어에서 지원되는 항목에 따라 도우미 클래스 또는 최상위 함수로 "대칭"연산을 구현 한 다음 A*BB*A이 모두 해당 도우미 구현을 호출하도록하는 것입니다.

+0

클래스가 다른 클래스의 속성을 사용하는 것은 정확하지 않다는 지침이 있습니다. 나는 선택의 여지가 많지 않다고 생각한다. – titus

+0

Scott Meyer는 그의보다 효과적인 C++ 서적 (항목 31 : 하나 이상의 객체와 관련하여 가상 함수 만들기)에서 주제에 대한 훌륭한 토론을하고있다. 그의 예는 우주에서 다양한 물체가 충돌 할 수있는 게임. 그의 예는 대칭 적이다 (소행성이 우주선에 부딪혔거나 우주선이 소행성에 부딪혔다면 상관 없다. 폭발은 같다). 그는 방문자 패턴으로 시작하여 RTTI에 의존하는 C++ 관련 솔루션을 점차 개발합니다. – dasblinkenlight

+0

은 1996 년 판입니까? – titus

1

나의 제안

new ParameterBuilder() 
    .setFirst("A") 
    .setSecond("B") 
    .setThird("C") 
    ... 
    .build(); 

는 그런 다음 인수로 ParameterBuilder 소요 하나의 방법이있을 것이다 매개 변수 빌더 역할을 사용 빌더가 될 것입니다.

+0

흠, 물건을 구현할 수있는'Object * result = new MultiplyHelper(). addOperand ("A"). addOperand ("B"). 컴퓨 트();' – titus

+0

또한 A/B와 같은 일부 비가 변 함수가 있습니다. 비대칭 연산을 위해 위와 같은 대칭 구조를 사용하는 것은 좋지 않습니다. 다른 방향으로 나아. – titus

+0

매개 변수 빌더는 매개 변수를 취하는 용도로만 사용됩니다. 네가하는 일도 좋다. 나는 당신의 방법을 그대로 유지하고 오직 방법 서명 만 바꾸기 위해이 해결책을 제안했다. –