MVC (Model, View, Controller)는 유지 관리 성을 향상시키기 위해 응용 프로그램에서 코드를 구성하는 패턴입니다.
스튜디오에서 자신의 카메라로 사진 작가를 상상해보십시오. 고객이 상자 사진을 찍도록 요청합니다.
비 MVC 아키텍처는 서로 밀접하게 통합되는 경향이 있습니다. 만약 박스, 컨트롤러 및 카메라가 동일한 물체라면 우리는 새로운 시야를 원할 때마다 박스 와 카메라를 분리하고 다시 만들어야합니다. 또한 사진을 찍는 것은 항상 셀카를 찍는 것과 같습니다. 항상 쉬운 것은 아닙니다.
bwaha는 다음과 같이 썼다.
저자는 MVC 디자인의 예로 wxPython에서 mvctree.py를 참조합니다. 그러나 나는 여전히 너무 녹색이므로 특정 예제가 너무 복잡하다는 것을 알았으며 저자가 권장하는 분리를 이해하지 못합니다.
MVC는 모든 관심사 분리에 관한 것입니다.
모델은 프로그램 데이터 (개인 및 클라이언트 데이터 모두)를 관리합니다. 뷰 / 컨트롤러는 외부 세계에 프로그램의 클라이언트 데이터와 상호 작용할 수있는 수단을 제공합니다.
모델은 프로그램의 다른 부분이 상호 작용할 수 있도록 내부 인터페이스 (API)를 제공합니다. View / Controller는 외부 인터페이스 (GUI / CLI / web form / high-level IPC / etc.)를 제공하여 프로그램 외부의 모든 것이 통신 할 수 있도록합니다.
모델은 프로그램 데이터의 무결성을 유지할 책임이 있습니다. 프로그램 데이터가 손상되면 모든 사람이 게임을 끝내기 때문입니다. 보기 / 컨트롤러는 UI의 무결성을 유지하고 모든 텍스트보기가 최신 값을 표시하고 현재 포커스에 적용되지 않는 메뉴 항목을 비활성화하는 등의 작업을 담당합니다.
모델에는 View / Controller 코드가 없습니다. GUI 위젯 클래스, 대화 상자 레이아웃 또는 사용자 입력 수신을위한 코드가 없습니다. 뷰 / 컨트롤러에는 모델 코드가 없습니다. URL을 검증하거나 SQL 쿼리를 수행하기위한 코드 및 원래 상태도 없음 : 위젯이 보유한 모든 데이터는 단지 표시 용이며 모델에 저장된 실제 데이터를 반영한 것입니다.
이제 진정한 MVC 디자인을 테스트했습니다. View / Controller를 연결하지 않아도 프로그램은 본질적으로 완벽하게 작동해야합니다. 외부 세계는이 형식으로 상호 작용하는 데 어려움이 있지만 적절한 Model API incantation을 알고있는 한 프로그램은 정상적으로 데이터를 보유하고 조작합니다.
왜 이것이 가능합니까? 간단한 대답은 모델과 뷰 / 컨트롤러 레이어 사이의 낮은 커플 링 덕분입니다. 그러나 이것은 전체 이야기가 아닙니다. 무엇 전체 MVC 패턴의 핵심입니다 것은입니다 방향 ALL 지침 흐름 : 그 연결이 진행되는 에서 보기 / 컨트롤러 에 모델. 모델은 절대로 뷰 / 컨트롤러에게 수행 할 작업을 알려주지 않습니다.
왜? MVC에서는 뷰 / 컨트롤러가 모델 (특히 모델의 API)에 대해 조금 알 수 있지만 모델은 뷰 / 컨트롤러에 대해 아무것도 알 수 없습니다.
왜? MVC는 분명한 관심사 분리를 만들기위한 것입니다.
왜? 프로그램의 복잡성을 통제 불능으로 만들고 개발자를 파 묻지 않도록하기 위해. 프로그램이 클수록 해당 프로그램의 구성 요소 수가 많아집니다. 이러한 구성 요소 사이에 연결이 많을수록 개발자가 개별 구성 요소를 유지 관리 / 확장 / 교체하거나 전체 시스템 작동 방식을 따르는 것이 더 어렵습니다. 프로그램 구조의 다이어그램을 볼 때 나무 또는 고양이 요람을 원하십니까? MVC 패턴은 원형 연결을 금지하여 후자를 피합니다. B는 A에 연결할 수 있지만 A는 B에 연결할 수 없습니다.이 경우 A는 모델이고 B는보기 / 제어기입니다.
BTW, 예리한 경우 방금 설명한 '단방향'제한에 문제가 있음을 알 수 있습니다. 모델이 모델을 허용하지 않을 때 모델이 사용자 데이터의 변경 사항을 뷰 / 컨트롤러에게 알리는 방법 View / Controller가 메시지를 보내지 않아도된다는 것을 알고 있습니까? 그러나 걱정하지 마십시오. 이것에 대한 해결책이 있으며 처음에는 약간 우회 해 보이더라도 깔끔합니다. 우리는 잠시 후에 다시 돌아올 것입니다.
실용적인 관점에서, View / Controller 객체는 모델의 API를 통해 1. 모델에게 작업을 수행하도록 명령하고 (명령 실행) 2. 모델에 작업을 수행하도록 지시합니다 (데이터 반환). View / Controller 레이어 는 명령 을 모델 레이어로
푸시 하고 모델 레이어 에서 정보 를 가져옵니다 .
그리고 첫 번째 MyCoolListControl의 예를 잘못 곳 클래스의 API 정보가 될 것을 요구하기 때문에 즉,의 밀어
그것으로, 그래서 당신은, 층 사이의 양방향 커플 링을 갖는 MVC 규칙을 위반하고에 바로 당신을 덤핑에 돌아온다 당신이 처음에 피하려고했던 고양이의 요람 구조.
대신 MyCoolListControl 클래스는 흐름과 함께 이동하여 필요할 때 아래 레이어에서 필요한 데이터를 가져옵니다. 목록 위젯의 경우 일반적으로 값이 몇 개인 지 묻는 다음 각 항목을 차례로 요청하는 것이 가장 간단하고 느슨한 방법이므로 커플 링이 최소가되도록 유지하기 때문입니다. 예를 들어, 위젯이 그 값을 알파벳 순서로 사용자에게 제시하기를 원한다면 그것은 그 설명입니다. 물론 그 책임.
앞서 언급했듯이 마지막으로 수수께끼가 있습니다 .MVC 기반 시스템에서 UI의 디스플레이를 모델의 상태와 동기화 상태를 유지하는 방법은 무엇입니까?
문제는 다음과 같습니다. 많은 View 개체가 상태 저장되어 있습니다. 예를 들어 확인란을 선택하거나 선택 취소하면 텍스트 필드에 편집 가능한 텍스트가 포함될 수 있습니다. 그러나 MVC는 모든 사용자 데이터가 모델 계층에 저장되도록 지시하므로 표시 목적 (확인란의 상태, 텍스트 필드의 현재 텍스트)을 위해 다른 계층이 보유한 모든 데이터는 해당 기본 모델 데이터의 보조 복사본이어야합니다. 그러나 모델의 상태가 변경되면 해당 상태의 뷰 사본이 더 이상 정확하지 않으므로 새로 고쳐야합니다.
그러나 어떻게? MVC 패턴은 모델이 해당 정보의 새로운 사본을보기 계층으로 푸시하지 못하게합니다. 심지어 모델이 View에게 상태가 변경되었다는 메시지를 보낼 수는 없습니다.
거의. 모델 레이어는 다른 레이어와 직접 대화 할 수 없습니다. 그렇게하려면 해당 레이어에 대해 알아야 할 것이기 때문에 MVC 규칙은이를 방지합니다. 그러나 나무가 숲에 떨어지고 아무도 들리지 않는다면 소리가 나는가?
답은 알림 시스템을 설정하여 모델 계층에 특히 흥미로운 일을 한 사람에게 알리지 않는 장소를 제공하는 것입니다. 그런 다음 다른 계층은 해당 알림 시스템과 함께 리스너를 게시하여 실제로 관심있는 공지 사항을들을 수 있습니다. 모델 계층은 누가 듣고 있는지에 대해 (또는 누군가 듣고있는 경우에도) 알 필요가 없습니다. 단지 공지 사항을 게시 한 다음 잊어 버립니다. 그리고 누군가가 그 발표를 듣고 나중에 새로운 데이터를 모델에 요청하여 화면 디스플레이를 업데이트 할 수있는 것처럼 무언가를하고 싶다고 느끼면 훌륭합니다. 모델은 API 정의의 일부로 전송하는 알림을 나열합니다. 그 지식으로 다른 사람이하는 일은 그들에게 달려 있습니다.
MVC는 보존되어 있으며 모두가 행복합니다. 응용 프로그램 프레임 워크는 기본 제공 알림 시스템을 제공하거나 그렇지 않은 경우 직접 작성할 수 있습니다 ( '관찰자 패턴'참조).
...
어쨌든, 그것이 도움이 되길 바랍니다. 일단 MVC의 동기를 이해하고 나면 일이 이해되기 시작하는 방식으로 일이 이해되는 이유는 언뜻보기에는 필요 이상으로 복잡해 보입니다.
건배,
있다