MVC에서 여러 뷰에 동일한 컨트롤러가 있거나 하나의 뷰에 고유 한 컨트롤러가 있어야합니까?


15

MVC 관련 프로젝트의 아키텍처를 디자인하는 동안 몇 가지 질문이 있습니다. (이것은 C ++ / Marmalade SDK 프로젝트이며 특정 MVC 프레임 워크를 사용하지 않고 있습니다.)

여러 기사 ( 원래 Steve Burbek 기사 에서와 같이 )에서 나는이 개념을 문자 그대로 받아 들인 이래로 "MVC triad"라는 개념을 계속 읽습니다. 처음 읽었을 때 응용 프로그램이 "MVC 트라이어드"단위 (내가 생각한 각 UI 부분에 대해 하나씩)를 중심으로 구축 된 것처럼 보이지만 다소 융통성이 없으며 MVC를 사용하려는 방식이 아니라고 생각합니다. 그런 다음이 문제에 대해 더 연구하면서 컨트롤러와보기의 긴밀한 결합, 즉 일대일 관계의 몇 가지 예를 찾았습니다. TextEditView에는 TextEditController가 있습니다.

그러나 내 프로젝트로 돌아갈 때 하나의 컨트롤러 (AddElementController와 같은 '논리 단위')와 특정 컨트롤러에 대한 여러 뷰를 갖는 것이 유용 할 수 있습니다.

일종의 탭 UI가 있어야하는 AddElementController와 같은 것을 분명히 생각하고 있습니다. 탭에 대해 AddElementTabView와 여러 AddImageView, AddSoundView 등이있는 AddElementController가 있어야합니까? 또는 각 탭보기마다 다른 '서브 컨트롤러'가 있어야합니까?

요컨대, MVC 패턴 (X 프레임 워크가이 패턴의 특정 이해 / 구현이 아님)과 관련하여 컨트롤러에 대해 여러 개의 뷰를 갖는 것이 올바른지 또는 각 뷰에 특정 컨트롤러가 있어야합니까?

또한 컨트롤러에 상태 정보를 유지하는 것이 올바른지 또는 상태 비 저장 상태 여야합니까 (상태가 일부 비 도메인 상태 모델에 배치되어야 함을 의미 함)?

미리 감사드립니다.

답변:


14

문제는 MVC 패턴이 더 이상 존재하지 않는 시스템에서 설계되었다는 것입니다. UI 라이브러리가 존재하지 않을 때 스몰 토크에서 발명되었습니다. 창 대화 상자를 만들려면 모든 상자를 그리고 적절한 사각형을 강조 표시하고 그림 텍스트가 올바른 위치에 있는지 확인하십시오.

하나의 큰 캔버스 만 사용하여 대화 상자 앱을 작성하는 것이 어떤 것인지 상상해보십시오. 그것이 MVC의 세계입니다.

이 시스템에서 "보기"는 텍스트 상자였으며 상자, 텍스트, 선택한 영역 그리기, 텍스트 변경에 대한 응답 등을 담당하는 클래스였습니다.

"컨트롤러"는 마우스 이동, 키 다운, 키 업, 클릭 등과 같이이 상자 내에서 발생하는 마우스 이벤트를 취하는 또 다른 클래스였으며 어떤 일이 발생했는지를 결정했습니다. 텍스트를 바꿔야합니까? 선택을 바꿔야합니까? 그런 것들.

"모델"은 구성 요소의 기본 데이터 및 상태를 나타내는 또 다른 클래스입니다. 텍스트 상자 모델에는 물론 텍스트, 글꼴, 선택 등이 있습니다.

보시다시피, 이와 같은 상황에서 세 가지 구성 요소는 단일 아이디어를 표현하는 데 매우 얽혀 있습니다. 이러한 맥락에서 "3 단계"를 말하는 것이 합리적입니다.

오늘날 UI 라이브러리를 만들고 원시 드로잉 명령을 사용하는 경우 비슷한 작업을 수행 할 수 있습니다. 그러나 "MVC"패턴의 적용은 초기 목적을 넘어 확산되었습니다. 이제는 실제로 완전한 대화 상자 일 수있는 "보기"와 "textChanged"또는 "buttonClicked"와 같은 이벤트에 응답하는 컨트롤러가 있습니다. 오늘날 MVC의 모델은 일반적으로 시스템과 상당히 분리되어 있지만 (일반적으로 일종의 옵저버 인터페이스를 제공하여 뷰에 연결됨) 한 모델과 관련된 많은 뷰가있을 수 있습니다.

예를 들어 최근에 설계 한 시스템에서 단일 문서 "보유자"및 활성 문서를 관찰하는 약 10 개 이상의보기가있었습니다. 기본 도면 인터페이스는 문서의 레이아웃, 선택한 항목을 관찰하고 레코드 인터페이스를 제공 한 다양한 속성보기, 표시되는 창 대신 전체 문서를 표시하는 기본보기의 작은 배율 표시와 상호 작용했습니다. 이러한보기 중 일부에는 GUI 이벤트가 문서의 변경 사항으로 바뀌는 다양한 복잡도의 컨트롤러가있어 여러 가지보기를 알립니다.

아직도 그런 관계를 "삼국지"라고 부를 수 있습니까? 어쩌면 이전의 오래된 MVC 응용 프로그램을 너무 많이 의미한다고 생각합니다.

다른보기로 컨트롤러를 공유 할 수 있습니까? 뷰의 유사도에 따라 다릅니다. 나는 일반적 으로이 유형의 객체를 말하면 제어하는보기와 매우 재사용 할 수있는 조작 모델에 따라 동작이 있지만 항상 예외가 있음을 발견했습니다.


5

때에 따라 다르지. MVC에는 몇 가지 변형이 있으며, 일부는 1 : 1 관계 (예 : "겸손한 대화 상자") 만 이해하고 다른 것은 그렇지 않습니다. 가장 중요한 MVC 변형을 설명하는 " Build Your Own CAB "기사 를 읽는 것이 좋습니다 .


3

뷰에는 MVC에 컨트롤러가 없습니다. 컨트롤러는 보스이므로 컨트롤러는 렌더링 할 뷰를 결정하고 뷰는 어떤 컨트롤러가 뷰를 요청했는지 상관하지 않습니다.

컨트롤러에서 여러 개의 뷰를 가질 수 있습니다. MVC 패턴을 고수하고 싶다면 각 뷰에 대한 모델을 만드는 것을 생각하십시오.


3

컨트롤러의 핵심은 도메인 모델과의 사용자 상호 작용을 제어하는 ​​것입니다. 즉, 사용자가 보는 것 (보기)과 응용 프로그램 상태 (모델) 사이의 간접적 인 수준입니다.

사용자가 요청하면 컨트롤러로 연결됩니다. 컨트롤러는 일반적으로 일종의 서비스 클래스를 통해 해당 요청을 응용 프로그램에 릴레이하는 방법을 결정합니다. 그런 다음 해당 서비스 클래스의 응답을 해석하고 사용자에게 다시 보낼 뷰를 결정합니다.

사용자가 컨트롤러에 대해 한 가지 종류의 요청 만 할 경우 컨트롤러는 항상 동일한보기 (1 : 1)를 반환 할 수 있으며 항상 같은 종류의 응답이 필요합니다. 예를 들어,는 "Hello, World!" HelloWorldController라는 HelloWorldView표시 를 항상 반환합니다 .

반면에, 컨트롤러는 모델이 말하는 것에 따라 종종 다른 뷰를 결정해야합니다. 는 TeamRosterController반환 할 수 있습니다 RugbyTeamRosterView또는를 FootbalTeamRosterView요청한 팀의 유형에 따라.

사용자 세션의 상태에 대한 일부 액세스가 필요하거나 바람직 할 수 있지만, 제어기는 상태 비 저장 인 것이 일반적으로 바람직하다. 가능하면 해당 상태에 대한 액세스를 별도로 관리해야합니다.

실제 MVC 프레임 워크를보고 그 기능과 작동 방식을 확인하는 것이 좋습니다. 당신이 그것을 사용할 필요는 없지만, 자신을 만들기 전에 분명히 더 잘 이해할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.