질문 플롯에 침입 코드 구현 (추상 조금,하지만 내 실제 응용 프로그램에서 나에게 도움이 될 것입니다이 질문에 대답) : 그래서C++ - 다른 부분
을, 나는에 렌더링 할 수있는 객체에 대한 몇 가지 추상 슈퍼 클래스가 화면. IRenderable
이라고합시다.
struct IRenderable {
// (...)
virtual void Render(RenderingInterface& ri) = 0;
virtual ~IRenderable() { }
};
그리고 나는 또한 IRenderable
에서 파생 된 다른 개체, 예를 들어 있다고 가정 Cat
및 Dog
.
지금까지 그렇게 좋았습니다. 일부 Cat
및 Dog
특정 메서드를 추가하십시오 (예 : 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(...);
을 내 질문은 이러한 종류의 코드를 논리적으로 배치하는 것에 관한 것입니다.
내가 코드를 분리 헤어지고 싶어, 그건 내 클래스 구현이 엉망로 전환되지 않도록, (상상 (이 예에서는 Render
및 Bark
) 현재 개체의 렌더링 및 그것의 자신의 방법에 해당 나는 Bark
과 같은 10 가지 방법을 가지고 있으며 물론 Render
메서드는 회사에 적합하지 않으며 찾을 수 없을 것입니다. 나는 (내가 아는 한)에 원하는 것을 만드는
두 가지 방법은 다음과 같습니다
클래스 내에서 다음 기능을
render
네임 스페이스에 가입하고,RenderCat(Cat& cat, RenderInterface* ri)
같이 적절한 루틴을 만드는 것virtual void Render(...) { RenderCat(*this, ...); }
처럼 보이지만, 이것은 바보입니다. 왜냐하면 나는Cat
의 비공개 회원에 대한 액세스 권한을 잃어 버리고 이러한 기능을 부각시키는 것은 전체 디자인 재앙처럼 보입니다.방문객 패턴을 사용하고 있지만 내 앱의 디자인을 다시 만들어야하고 초반부터 코드를 복잡하게 만드는 부적절한 방법 인 것처럼 보입니다.
어떤 화려한 아이디어? :)
비즈니스 로직을 사용하는 패턴이나 아키텍처에 관계없이 항상 비즈니스 로직을보기와 분리하고자합니다. 그렇지 않으면 비즈니스 로직을 재사용하기가 매우 어려워지며보기를 추가하거나 변경하는 일도 비참하게됩니다. –
오, 그 점에 동의합니다. 그러나 "보기"부분에 대해 단순한 작업을 수행하는 경우 논리와 분리 할 필요가 없습니다. 어떤 실제 크기로도 작업을 수행한다면, 로직과 뷰를 분리하는 것이 좋은 생각이 될 것입니다. –