좋은 MVC 구현을위한 리트머스 테스트는 뷰를 쉽게 바꿀 수있는 방법입니다. 나는 게으름 때문에 항상이 일을 정말로 잘못했지만 지금은 제대로하고 싶습니다. 이것은 C++이지만 과장된 것을 믿는다면 비 데스크탑 응용 프로그램에도 똑같이 적용되어야합니다.컨트롤러와 뷰 사이의 연결
다음은 하나의 예입니다. 응용 프로그램 컨트롤러는 백그라운드에서 일부 URL을 확인해야합니다.
BackgroundUrlCheckerThread(Controller & controller)
{
// ...
signalUrlAvailable.connect(
boost::bind(&Controller::urlAvailable,&controller,_1))
}
그래서 Controller::urlAvailable
처럼 무엇을 보는가
void
Controller::urlAvailable(Url url)
{
if(!view->askUser("URL available, wanna download it?"))
return;
else
// Download the url in a new thread, repeat
}
이 나에게, 뷰와 컨트롤러의 총 결합처럼 보인다 :
여기에 하나의 가능성이다. 이러한 결합은 웹을 사용하는 경우이 불가능 뷰를 구현할 수 있습니다
또 다른 가능성 (옆으로 코 루틴을.) :
void
Controller::urlAvailable(Url url)
{
urlAvailableSignal(url); // Now, any view interested can do what it wants
}
나는 후자에 부분 해요하지만이 나타납니다 나는이 작업을 수행 할 경우이 것을 be :
- 이러한 신호는 400 억 개입니다.
커플 링을 제거하고 복잡성을 낮추려면 어떻게해야합니까? 미리 감사드립니다.
StackOverflow에 대한 광범위한 설문 조사에서 링크 된 게시물을 읽었습니다. 내가 너에게 동의하지 않는다고 말하는게 아니야. 제 경우에는 그렇습니다. 모델은 충분히 일반적인 것입니다. 현재 데스크톱 및 XML-RPC보기를 지원합니다. 그러나 피하려고하는 반복 된 코드가 많이 있습니다. 나는 MVC가 크게 도움이 될 것이라고 생각했다. 위의 예제를 상호 연결된 세계에서 어떻게 다시 작성하겠습니까? – cheez
당신의 솔루션 ("이 ... 뷰와 컨트롤러의 커플 링")이 자연스럽고 예상되는 것입니다. 다른보기를 구현하려면 함께 연결된 새로운 상호 연결된 컨트롤러를 만들어야 할 수도 있습니다. 2 개의 뷰와 2 개의 컨트롤러 사이에서 공통 코드 (아마도 기본 클래스로)를 추출하려면 리팩터링해야 할 수도 있습니다. 위의 컨트롤러 코드는 데스크톱 응용 프로그램 용이고 새로운보기는 UI가 아닌 XML-RPC보기 용인 것으로 가정합니다. 사용자 상호 작용없이 URL을 다운로드하는 urlAvailable() 콜백을 사용하여 XML-RPC 컨트롤러를 만들 수도 있습니다. –
그런 설정에서, 나는 컨트롤러가 0에서 전혀 로직을 갖지 않을 것이라고 추정한다. 즉, 단순히보기와 모델을 연결합니다. – cheez