2012-12-18 3 views
0

이 문제의 이름을 지정하는 방법을 잘 모르겠습니다. 가능한 한 잘 설명하려고합니다.두 가지 객체 유형을 기반으로 올바른 전략 선택

두 개의 다른 개체 유형에 따라 전략을 전환 할 수 있기를 원합니다. 이 작업을하기 위해 개체를 열거 형으로 플래그를 지정하고 이러한 전략 중 '레지스트리'(arrayish)를 갖는 것을 고려하고 있습니다. 이론적으로 올바른 전략은 두 가지 유형 사이의 비트 연산자와 같은 간단한 연산으로 액세스 할 수 있습니다.

이 의사는 내가 이해하기 쉽게 설명하기 위해 노력하고있어 만들 수 있습니다 :이지도를 사용하여 해결하기 쉬운 것입니다

enum Type { A, B, C } 

struct Object { 
    Type type; 
} 

class ActionRunner { 
    vector<Strategy> strategies; 

    void registerStrategy(type1, type2, strategy) { 
    strategies[type1 operator type2] = strategy; 
    } 

    void runStrategyFor(type1, type2) { 
    strategies[type1 operator type2].execute(); 
    } 
} 

,하지만 난지도 때문에 배열 또는 벡터를 사용하고 싶습니다 이런 문제에 대한 잔인한 생각처럼 보이고 배열을 사용하는 것은 아마도 훨씬 빠릅니다.

그래서 문제는 올바른 전략의 '위치'를 선택하는 데 사용할 수있는 연산자가 무엇인지 모릅니다. 나는 몇 가지 조합에 대해 생각 해왔다. 그러나 그것들 모두는 결국 어떤 조합에서 다른 조합과 충돌을 일으키는 것으로 보인다.

누구에게도 내가 사용할 수있는 것에 대한 단서가 있습니까?

추신 : 나는 조기 최적화가 좋지 않다는 것을 알고 있지만,이 문제가 간단한 방법으로 해결 될 수 있는지 파악하려고합니다.

------- EDIT -------------------------------------- ----------

답변에 비추어 볼 때, 나는 약간의 여분의 생각을 주었고 나는이 질문으로 의도 한 것이 가능한 방법이 아니라는 결론에 이르렀다. 나는 그것을 원한다. 나는이 문제를 사용하여 지금 풀고 자하는 문제를 다시 진술하려고 노력할 것입니다.

특정 유형의 'BaseClass'개체와 'BaseClass'에서 파생 된 두 개체를 가져 와서 해당 개체에 적합한 전략을 실행하는 '프로세서'개체가있는 클래스 구조가 필요합니다. 이런 식으로 뭔가 :

class Processor { 
    void run (DerivedA a, DerivedB b); 
} 

class BaseClass {} 
class DerivedA: public BaseClass {} 
class DerivedB: public BaseClass {} 

BaseClass a = new DerivedA; 
BaseClass b = new DerivedB; 

processor.run(a, b) 

내가 이해에 따르면, 이것은 무엇을하는 것은 '실행'에 매개 변수로 전달되는 경우 내가 예상대로 작동하지 않을 것입니다 차라리 할 거라고 무엇 인 참조입니다. 코드가 너무 복잡하지 않으면이 작업을 수행 할 수있는 방법이 있습니까?

내가 생각하기에 슬레이브 (프로세서) 객체와 결합 된 이중 디스패치와 같은 점을 염두에 두지 만 유지 관리와 확장이 매우 복잡하고 어려울 것으로 보입니다.

감사합니다.

+0

당신은 당신이 더 뭘 하려는지 문구로 사용해 볼 수 있습니까? 어쩌면 예제를 통해 그것을 보여줄 수도 있습니다. – Dukeling

답변

0

질문의 두 번째 문장은 나를 위해 종을 울렸다 :

내가 두 개의 서로 다른 객체의 종류에 따라 전략을 전환 할 수 있어야합니다.

double dispatch을 수행하려는 것 같습니다. 질문을 참조하십시오 (특히 질문에 대한 답변 ;-)) Double dispatch/multimethods in C++에서 이것을 C++로 구현하는 방법을보십시오.

+0

이 질문에서 * type *은 표준 C++ 유형이 아니라고 생각합니다. 오히려 ** 객체 **를 나타내는 ** 값 **입니다. 이것은 게시 된 코드 – SomeWittyUsername

+0

에서 보입니다. @icepack : 아마, 아마도 힌트 일 수도 있습니다. 'type'필드가있는 객체 대신 세 개의 vaule 중 하나를 사용하는 대신 C++ 클래스가 세 개이면 어떤 경우에 내가 링크 된 질문에서 이중 발송 구현이 관련성이 있음). –

+0

처음에는 실제로 언어 유형을 생각하고 있었지만 값을 사용하여 유형을 정의하여 간단한 연산자를 사용하여 '전략 레지스트리'에 액세스 할 가능성을 조사하기 시작했습니다. 이것은 아마도 최고의 디자인 대안이 아니지만,이 단계에서 옵션을 탐색하고 있습니다. – uorbe001

0

어레이 대신 map을 사용하는 전형적인 예입니다.배열은 실제로 키로 정수로 정의 된 map의 개인 경우입니다. 귀하의 경우에는 키가 튜플이므로 간단한 배열로는 처리 할 수 ​​없으며 충돌로 끝날 것입니다 (특정 입력에 대해 운이 좋았더라도 코드는 매우 견고하지 않습니다).

당신은 간단한 arraymap 사이의 중간 솔루션 가질 수 행에 대한 인덱스 및 열 역할을하여 2 종류 2D array을 ..

+0

몇 가지 특별한 생각을 한 후에 나는 당신과 같은 결론에 도달했습니다. 그랬어. 지도의 유일한 문제점은 어레이보다 잠재적으로 느리다는 것입니다. 2D 배열은 내가 고려한 좋은 선택이지만 대부분의 경우 (적어도 내가 고려한 방식)보다 많은 메모리를 할당해야한다는 것을 의미합니다. 제가 여기 고려하고있는 것은 아마도 최고의 디자인 옵션이 아닐 것입니다. – uorbe001

+0

@ uorbe001 메모리 사용을 최소화 할 수있는 방법은 많습니다. 예를 들어 1D 배열에 인덱스를 반환하는 각 조합에 대해 'if..else' 문을 사용하여 자신 만의 연산자를 구현할 수 있습니다. 작동하지만보기 흉하고 성능이 저하 될 수 있습니다. 결론은 공간 또는 시간 (또는 둘의 조합) 중 어느 것을 지불하든 상관없이 – SomeWittyUsername

+0

그래, 나는 클라이언트 코드에서 '플러그인 전략'을 찾는 방법을 찾고 있었지만 이 작업을 효율적으로 수행하는 방법은 보이지 않습니다 (시공간적 관점에서). 내 문제를위한 최선의 방법은 내장 '핵심'전략을 가지고있을 수도 있으며 시간/공간 비용에도 불구하고 클라이언트 코드가 새로운 전략을 등록 할 수 있도록 허용하는 것일 수 있습니다. 이상적으로는 바이너리 호환성을 높이기 위해 모든 전략을 '플러그 인'하고 싶습니다. 단점으로 인해이를 시도하는 것이 좋지 않을까 생각합니다. – uorbe001

관련 문제