2010-04-23 4 views
0

질문 플롯에 침입 코드 구현 (추상 ​​조금,하지만 내 실제 응용 프로그램에서 나에게 도움이 될 것입니다이 질문에 대답) : 그래서C++ - 다른 부분

을, 나는에 렌더링 할 수있는 객체에 대한 몇 가지 추상 슈퍼 클래스가 화면. IRenderable이라고합시다.

struct IRenderable { 
    // (...) 
    virtual void Render(RenderingInterface& ri) = 0; 
    virtual ~IRenderable() { } 
}; 

그리고 나는 또한 IRenderable에서 파생 된 다른 개체, 예를 들어 있다고 가정 CatDog.

지금까지 그렇게 좋았습니다. 일부 CatDog 특정 메서드를 추가하십시오 (예 : SeekForWhiskas(...)Bark(...)). 그 후 내 코드는 이런 식으로 보이는, 그래서 나는 그들을 위해 특정 Render(...) 방법을 추가

class Cat : public IRenderable { 
public: 
    void SeekForWhiskas(...) { 
    // Implementation could be here or moved 
    // to a source file (depends on me wanting 
    // to inline it or not) 
    } 

    virtual void Render(...) { 
    // Here comes the rendering routine, that 
    // is specific for cats 
    SomehowDrawAppropriateCat(...); 
    } 
}; 

class Dog : public IRenderable { 
public: 
    void Bark(...) { 
    // Same as for 'SeekForWhiskas(...)' 
    } 

    virtual void Render(...) { 
    // Here comes the rendering routine, that 
    // is specific for dogs 
    DrawMadDog(...); 
    } 
}; 

을 그리고 다른 곳에서 나는 적절한 렌더링 루틴을 호출하는 방식 그리기 수행 할 수 있습니다

IRenderable* dog = new Dog(); 
dog->Render(...); 

내 질문은 이러한 종류의 코드를 논리적으로 배치하는 것에 관한 것입니다.

내가 코드를 분리 헤어지고 싶어, 그건 내 클래스 구현이 엉망로 전환되지 않도록, (상상 (이 예에서는 RenderBark) 현재 개체의 렌더링 및 그것의 자신의 방법에 해당 나는 Bark과 같은 10 가지 방법을 가지고 있으며 물론 Render 메서드는 회사에 적합하지 않으며 찾을 수 없을 것입니다. 나는 (내가 아는 한)에 원하는 것을 만드는

두 가지 방법은 다음과 같습니다

  • 클래스 내에서 다음 기능을 render 네임 스페이스에 가입하고, RenderCat(Cat& cat, RenderInterface* ri) 같이 적절한 루틴을 만드는 것 virtual void Render(...) { RenderCat(*this, ...); }처럼 보이지만, 이것은 바보입니다. 왜냐하면 나는 Cat의 비공개 회원에 대한 액세스 권한을 잃어 버리고 이러한 기능을 부각시키는 것은 전체 디자인 재앙처럼 보입니다.

  • 방문객 패턴을 사용하고 있지만 내 앱의 디자인을 다시 만들어야하고 초반부터 코드를 복잡하게 만드는 부적절한 방법 인 것처럼 보입니다.

어떤 화려한 아이디어? :)

답변

1

내가 그래픽 프로그래밍으로 정신을 차렸을 때부터 나의 이해와 기억은 참으로 적절하다.

1

개인적으로 필자는 파일의 기능을 지능적으로 정렬하고 대부분은 그 기능을 포함한다고 말하고 싶지만 그게 당신이 찾고있는 것만 같지 않은 것 같습니다.

항상 디스플레이 관련 항목을 하나의 클래스에 넣고 비 표시 항목은 다른 항목에 넣고 다중 상속을 사용할 수 있습니다. 로직과 GUI 요소를 분리하는 것은 MVC 디자인 패턴 덕분입니다. 그것은 종종 좋은 일을하는 방식이지만, 내가하는 일에 얼마나 잘 적용되는지 모르겠습니다.

또 다른 가능성은 함수 정의를 별도의 파일에 넣는 것입니다. 클래스의 모든 함수 정의를 하나의 파일에 모두 넣지 않아도됩니다. Dog.cpp 대신 Dog_DisplayFunctions.cpp와 Dog_ActionFunctions.cpp 또는 그와 비슷한 것을 포함하는 Dog.cpp를 가질 수 있습니다.

+0

비즈니스 로직을 사용하는 패턴이나 아키텍처에 관계없이 항상 비즈니스 로직을보기와 분리하고자합니다. 그렇지 않으면 비즈니스 로직을 재사용하기가 매우 어려워지며보기를 추가하거나 변경하는 일도 비참하게됩니다. –

+0

오, 그 점에 동의합니다. 그러나 "보기"부분에 대해 단순한 작업을 수행하는 경우 논리와 분리 할 필요가 없습니다. 어떤 실제 크기로도 작업을 수행한다면, 로직과 뷰를 분리하는 것이 좋은 생각이 될 것입니다. –