컨트롤러가 View & Model에 대해 알아야합니까? 혹은 그 반대로도?


13

이 작업을 수행 해야하는지 개념적으로 이해하려고합니다.

item = Model()
screen = View()
brain = Controller(item, screen)

아니면 이거..

brain = Controller()
item = Model(brain)
screen = View(brain)

아니면 이거..

class Controller():
    def __init__(self):
        item = Model(self)
        screen = View(self)

아니면 다른 무엇인가?

답변:


18

나에게는 첫 번째 옵션이 의미가 있습니다. Controller의 역할은 뷰와 모델을 조정하는 것입니다. 이러한 관점에서 볼 때 컨트롤러는 뷰 및 모델에 대한 참조를 제어하는 ​​컨트롤러 인 것이 좋습니다.

모델과 뷰가없는 컨트롤러를 실제로 가질 수는 없지만 뷰 또는 모델 (예 : 단위 테스트)을 갖는 것이 훨씬 더 합리적입니다. 그렇기 때문에 이러한 종속성을 다른 두 가지가 아닌 컨트롤러에 전달하려고합니다.


9

Model와는 View서로 독립적입니다.

MVC 구조 Controller두뇌 라고 생각하지 마십시오 . 이라고 생각 디스패처 브라우저의 요청을 처리하고 전달 받는 그들 Model. 그런 다음 소요 된 데이터 로부터 ModelA의와 패키지를 템플릿 친화적 인 방법으로, 다음에 보냅니다 View.

Model는 IS 두뇌 MVC의 구조에서, 당신이 당신의 비즈니스 규칙을 두어야 곳이다. 비즈니스 규칙은 여러 컨트롤러에 공통 입니다. 따라서 문서 컨트롤러와 보고서 컨트롤러는 모두 사용자 모델을 사용하여 누가 그 일에 액세스 할 수 있는지 확인할 수 있습니다. 두 컨트롤러에서 이러한 규칙을 반복하지 않으려 고합니다.

View아닌 데이터 소스 특정 방식으로 데이터를 표시하는 HTML 템플릿을 사용해야합니다. 데이터베이스의 스키마에 밀접하게 바인딩되어서는 안됩니다. 문서의 제목을 표시하려면 뷰 출력을라는 템플릿 변수의 내용을 가지고 것입니다 document_title, 만은 Controller그 변수가 설정되고, 오직이 방법을 알고 Model그 문서는 그 제목이 이유를 알고있다.


1
나는 MVC에 대한 전반적인 이해로 젤처럼 대답하기를 좋아합니다. 그러나 문제의 중요한 부분, 특히 Triad의 어떤 부분이 다른 부분을 언급합니까? 내가 생각하는 혼란은 당신이 묘사 한 사실이 뷰가 "구멍이있는 바보 템플릿"이라는 것입니다. 동시에, 내가 계속 보게되는 또 다른 공통점은 Views가 사용자 작업을 Controller에 보내야한다는 것입니다. 뷰는 C를 참조하지 않고 어떻게 이것을 할 수 있습니까?
alnafie

@alnafie MVC 프레임 워크를 3 개의 클래스로 단순화했습니다. 기존 MVC 오픈 소스 프레임 워크를 살펴보면 작동시키는 데 훨씬 더 많은 것이 필요하다는 것을 알게 될 것입니다. 프레임 워크의 모든 부분을 관리하는 더 높은 것이 있어야합니다. 컨트롤러를 호출하는 것과 뷰의 액션으로 라우팅을 처리하는 것.
Reactgular

3

MVC는 원래 데스크톱 응용 프로그램을 쉽게 프로그래밍 할 수 있도록 정의되었습니다. 뷰는 모델 이벤트를 구독하여 모델이 변경 될 때 프리젠 테이션을 업데이트합니다. 컨트롤러는 사용자 인터페이스 이벤트 (예 : 버튼 누름)를 모델 호출로 변환했습니다. 따라서 컨트롤러와 뷰는 모델에 따라 다르지만 서로 독립적입니다. 이 모델은 두 가지와 무관했습니다. 이를 통해 여러 뷰와 컨트롤러가 동일한 모델에서 작동 할 수있었습니다.

웹 1.0 애플리케이션 (전체 페이지 새로 고침, AJAX 없음)에 사용되는 "MVC"아키텍처는 약간 다릅니다. 웹 요청이 컨트롤러로 발송됩니다. 컨트롤러는 어떻게 든 모델 상태를 수정 한 다음 하나 이상의 모델을 보내어 뷰로 렌더링합니다. 컨트롤러와 뷰는 모두 모델에 따라 다르지만 컨트롤러도 뷰에 따라 다릅니다.

웹 2.0 애플리케이션 을 통해 클라이언트 측에서 클래식 MVC 아키텍처로 돌아갑니다 . 모델, 뷰 및 컨트롤러는 모두 클라이언트 측에 Javascript 객체로 상주합니다. 컨트롤러는 사용자 이벤트를 모델 조치로 변환합니다. 모델 조치는 서버에 AJAX 요청을 야기 할 수도 있고 그렇지 않을 수도 있습니다. 다시, 뷰는 모델 이벤트를 구독하고 이에 따라 프리젠 테이션을 업데이트합니다.


좋은 대답 +1. 고전적인 의미에서 데스크톱 애플리케이션의 모델 콜백을 이해할 수 있습니다. Microsoft의 오래된 MFC를 상기시킵니다.
Reactgular

2

뷰는 모델의 변경 사항을 구독해야합니다. 구독이 상세하거나 (이 특정 항목에 대한 재고 변경 사항 표시) 일반 (모델이 변경됨) 할 수 있기 때문에 풍부한 구독이 가능합니다. 뷰는 변경 통지에 응답하여 모델을 질의 할 수있다. 보기는 화면에 원하는 모델 요소 세트를 표시하여 변경 알림을 처리 할 때처럼 화면을 업데이트합니다.

컨트롤러는 사용자 방향 (예 : 키보드 입력, 마우스 및 메뉴 명령)의 결과로 모델 변경 사항을 푸시해야합니다.

모델은 모델과 구독 목록을 유지 관리하고 구독을 통해 적용 가능한 변경 사항을 뷰에 알려야합니다.

또한 새로운 뷰와 컨트롤러를 생성하는 메커니즘이 필요합니다 (MVC에서는 동일한 모델에 대해 두 개 이상의 뷰를 가질 수 있어야하므로 동일한 뷰 (포인트) 또는 다른 뷰 (포인트) 일 수 있음). 논리적으로 컨트롤러가 컨트롤러 또는 다른 구성 요소의 일부일 수있는 뷰 및 컨트롤러 (페어) 팩토리를 수행하거나 액세스해야한다고 생각할 수 있습니다.


-1 Models통지하지 않습니다 Views. 변경 사항을 Controllers쿼리 한 Model다음 Views해당 변경 사항 을 표시 하도록 렌더링 합니다.
Reactgular

4
MVC의 @MathewFoscarini에서 View는 모델의 변경 사항을 구독합니다. 예를 들어 wiki.squeak.org/squeak/598을 참조하십시오 .

기존 MVC 프레임 워크에서 차이점을 이야기하지 않는 것 같습니다. Zend MVC, C # .NET 및 CakePHP는 모델을 뷰에 연결하지 않습니다. 이러한 프레임 워크의 뷰는 독립적입니다. 어떤 MVC를 사용했는지 모르겠지만 비전통이라고 부릅니다.
Reactgular

6
@MathewFoscarini : 이들은 모두 웹 프레임 워크이며 "MVC"라고하더라도 클래식 MVC 아키텍처를 따르지 않습니다.
kevin cline

2
나는 어떤 MVC가 스몰 토크 MVC보다 "전통적인"지 확실하지 않다. 패턴이 처음으로 기술 된 곳이다.

1

MVC는 모듈성 패턴과 비슷합니다. 사용자 인터페이스 레이아웃 (보기)을 변경할 때마다 응용 프로그램 논리 (컨트롤러) 또는 내부 데이터 처리 (모델)를 변경할 필요가 없습니다.

이를 달성하기 위해 패턴은 각 MVC 컴포넌트의 구현 로직을 분리하는 것입니다. 그래도 구성 요소가 서로 인터페이스를 알고있는 것은 정상입니다 .

내가 자주 본 것은 컨트롤러가 모델 및 뷰를 생성 또는 호출하고 (따라서 인터페이스를 알고 있음) 모델 또는 뷰는 컨트롤러에게 콜백 또는 관찰자 패턴과 같은 정보를 반환 할 수 있다는 것입니다. 중요한 부분은 컨트롤러가 레이아웃 구조를 인식하지 못한다는 것입니다.

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