2012-09-06 3 views
1

설명 방법은 이벤트 및 게시/구독 모델을 사용하는 것이 었습니다. 기본적으로 모델은 데이터 일 뿐이며 뷰/GUI/UI에 대한 지식이 없습니다. 모델은 일반적으로 데이터에서 작동하는 추상 객체이며 작업 및 기타 등등을 수행 할 수 있습니다.MVC를 이해하려고합니다. 이게 옳은 거니?

뷰는 모델의 변경 내용에 응답하고 일반적으로이 데이터를 사용자에게 표시하는 다른 클래스입니다. 이전에는 뷰와 모델 간의 결합없이 이것이 발생할 수있는 방법을 알지 못했지만 이벤트로 설명하면 혼란이 훨씬 잦아 들었습니다. 이것은 재미있는 일이 발생할 때 모델 자체가 발생시키는 공개 이벤트를 포함한다는 것을 의미합니까? 예를 들어, 체스 게임을 프로그래밍했다면, 조각이 움직일 때, 모델은 필요한 정보 (어느 부분에서 어디로 옮겼습니까)로 뷰를 구독 할 수있는 PieceMoved의 이벤트를 발생시킵니다. 이벤트를 수행 한 다음 이전 사각형에서 새 사각형으로 움직이는 조각의 애니메이션을 표시합니다.

나를 혼란스럽게하는 부분은 컨트롤러의 정확한 특성입니다. 새로운 정보로 모델과 뷰를 제공하는 방법을 이해하는 데 문제가 있습니다. 컨트롤러가 모델과 뷰에 대한 참조를 포함하고 있다고 생각합니다. Chess 예제를 유지하면서 컨트롤러는 사용자 입력 (예 : 조각 이동)에 응답 한 다음 모델로 이동하고자하는 부분을 제안합니다. 그런 다음 모델은이 정보를 사용하여 합법적 인 이동인지 여부를 확인하고 적절하면 모델을 업데이트하고 뷰가 반응하고 이에 따라 그래픽 영역을 업데이트하는 PieceMoved 이벤트를 발생 시키십시오.

마지막으로 컨트롤러가 이동하려는 부분을 어떻게 확인합니까? 그 유형의 것이보기에 크게 묶여있는 것처럼 보입니다 (이동하려는 조각을 먼저 클릭 한 다음 대상 사각형을 이동하는 것이 포함됩니다). 컨트롤러가 마우스 클릭에 응답하여 모델에 해당 좌표를 전송한다고 상상해 봅니다.하지만 모델에서 선택한 좌표를 변환하는 방법을 모델이 어떻게 알 수 있습니까? 그것이보기에 크게 묶여 있지 않습니까? 뷰가 모델과 컨트롤러에 단순히 응답하는 대신 로직 처리를 수행해야하지만 뷰/모델 믹스 대신 올바른 뷰가 아닌 것처럼 보입니다.

+1

긴 질문을 가지고 전체 대답은 더 긴 것, 다른 사람들처럼, MVC (I의 내 자신의 버전입니다. 먼저 몇 권의 책을 읽으십시오. 완전히 주제에서 벗어나지는 않지만 너무 광범위합니다. –

+0

나는 질문을보다 구체적이고 짧게하려고 노력할 것이다. 좋아, 잘하면 더 좋다. –

답변

0

MVC 패턴에 대한 나쁜 일들은 다음과 같습니다

  • 모든 사람은 자신의 버전/그녀가
  • 그것은 추상적 조금 먼저

좋은에서 파악되어야한다

  • 사물 :

    • 실제

      모델

      이것은 쉬운 일이다 : 그것은 비록 귀하의 질문에 대답하기 위해 대부분의 응용 프로그램

    을 나누는 환상적인 방법입니다

  • 매우 간단 히. 모델은 자신에 대해서만 알고 있어야합니다. 보드, 개, 및 게임 규칙이 있습니다. 데스크톱 애플리케이션이나 웹 애플리케이션에서 모델을 재사용 할 수 있다면 모델을 바로 구축 할 수 있다는 것을 알고 계실 것입니다.

    이 역시 복잡하지 뷰

    . 그것은 시각적 인 부분이며 사용자 입력을 다루는 부분입니다. MVC 패턴에서 뷰의 역할을 이해하는 가장 중요한 개념은 시스템의 둥근 인터페이스에 대한 호출을 수행하는 방법을 제공해야한다는 것입니다. 체스 게임에서 요소를 그리고 사용자가 마우스/키보드로 무엇을하고 있는지를 감지해야합니다. 사용자가 무언가를하면 뷰를 호출하여 시스템을 호출합니다. "사용자 1이 조각을 X에서 Y로 이동하려고합니다."(중요 : 대부분의 경우보기가 User1과 같은 호출을 x, y 좌표에서 클릭하는 것을 원하지 않습니다. 픽셀은보기의 영역입니다. 그래픽 방식으로 표현 된 방식과 무관 한 주문 수신).

    네 말이 맞아 컨트롤러는,이는 straightfoward 없습니다. 컨트롤러는 공용 인터페이스에 대한 호출을 처리해야하는 컨트롤러입니다. 귀하의 예제에서 'User1은 X에서 Y로 이동'이라는 호출을 수신하고 모델의 적절한 객체 (이 경우에는 보드 일 가능성이 높음)에서 메소드를 호출합니다. 따라서 제어기 은 전체적으로으로 모델의 객체를 알고 있습니다. 그러나 응용 프로그램에서 필요하지만 모델의 도메인에 속하지 않는 코드도 포함될 수 있습니다. 사용자가 시스템에 액세스 할 권한이 있는지 확인해야합니까? 그 전화를 파일에 기록해야합니까? 글쎄, 대부분의 일은 그런 종류의 일들이 컨트롤러에 들어갑니다.

    그러나, 또한 내 자신이 너무 ... :)

  • 0

    MVC는 꽤 일반적인 개념입니다. 다양한 방식으로 구현되었으며, 대부분은 한 가지 또는 다른 유형의 타협이 있습니다.

    내가보기에 문제는 비전 개념을 취하여 구체적인 구현 세부 사항을 적용하려고하는 것입니다. MVC, fubuMVC, spring MVC, smalltalk MVC 등 무엇이든간에 매우 특정한 구현을 염두에 두지 않으면 각기 다른 방식으로 알림 및 이벤트 처리와 같은 작업을 수행합니다.

    MVC 개념에 대해 이야기하고 있다면 MVC 개념을 일반적인 방법으로 처리해야합니다. 구체적인 구현이 있다면 이해하기가 더 쉽지만 구현의 이해를 기반으로 패턴 이해 (MVC) 경로를 따라 가면 패턴 자체에 대한 이해가 왜곡 될 수 있습니다.

    메시지 나 이벤트에 관해 읽을 때 "구현이 정의 된 일부 메커니즘"이라고 생각해야합니다. 이 콜백 될 수있다, 또는 C#을 이벤트가 될 수도 있고, 그것은 윈도우 메시지 일 수도 있고, 그 힘을 사용할 수 있었다;

    EDIT) : 나는 반복됩니다 업데이 트에 대해서는

    . 일반 개념에 대한 구현 관련 세부 정보는 대답 할 수 없습니다. 누군가 구현 세부 사항을 수행하는 방법을 설명 할 수 있도록 특정 구현을 정의해야합니다.

    -1

    그래서 체스 보드보기 (체스 보드)와 컨트롤러가있는 경우 컨트롤러는 이벤트를 저장합니다. 조각을 움직이면 현재 위치와 원하는 위치와 같은 정보를이 이벤트에 전달해야하는 PieceMoved 이벤트가 발생합니다.

    매우 간단한 응용 프로그램의 경우 모델 개념을 파악하지 못할 수도 있습니다. 여러보기 (예 : 세부보기 및 작성보기)에서 재사용 할 수있는 청구 모델이있을 수 있습니다. 필요할 때마다이 코드를 복제하기를 원하지 않으므로 컨트롤러에서 각 이벤트가 필요한 이벤트를 지불 할 수 있습니다. 모델을 작성하면 코드를 캡슐화합니다.

    0

    많은 질문에 대한 답변이 많이 있습니다. 주로 MVC 프레임 워크가 매우 다양하기 때문입니다. 몇 가지 예를 들어 http://martinfowler.com/eaaDev/uiArchs.html을보십시오. 나는 MVVM 관점을 제공 할 수 있는데, 그 이유는 요즘에는 내가 일하고있는 것이기 때문에 이것이 내가 어떻게 생각하는지 알기 때문이다.

    모델 계층은 기본적으로 데이터와 비즈니스 논리입니다. 데이터베이스 나 웹 서비스와 대화를 나눌 수 있습니다. 시스템 작성이 끝나면 이는 단순한 GUI 이상입니다. 이것은 재사용 가능한 코드입니다.

    ViewModel은 모델 위쪽에 위치하며 기본적으로 데이터를 속성으로 표시합니다. INotifyPropertyChanged 인터페이스를 사용하여 데이터가 변경 될 때 UI에 알립니다. 모델 레이어로 이동하기 전에 무언가를 만드는 데 사용하는 데이터가 있다면 여기에 살고 있습니다. 일반적으로 UI에서 ICommand로 수행 할 수있는 작업을 노출합니다.

    View 레이어는 바인딩을 사용하여 ViewModel에 연결하기 때문에 결합이 가장 적습니다. 시각화 할 것은 IValueConverters 옵션을 사용하여 바인딩 된 속성입니다.

    조치 UI 요소는 ViewModel의 명령에 바인드되어 ViewModel 조치를 시작합니다.

    Command="{Binding DoSomething}" 
    
    관련 문제