1

뷰는 정의에 의해 논리가없는 것으로 가정됩니다. 사용자가보기와 상호 작용하면 해당 컨트롤러에 알립니다. 앱에서 상태가 변경되면 컨트롤러가보기를 알립니다. 그러나 뷰의 일부 또는 전체를 다시 렌더링 할 때 뷰와 컨트롤러 사이의 통신 특성이 혼란 스럽습니다.컨트롤러와 뷰를 실제로 MVC에서 분리해야하는 이유는 무엇입니까?

나는 2 인조 카드 게임을하고있다. 이보기는 데크, 버려진 더미, 플레이어의 손에있는 카드 및 기타 UI 구성 요소를 보여줍니다. 플레이어가 카드를 플레이 할 때보기에는이 변경 사항이 반영되어야하며보기에이를 알리는 것은 컨트롤러의 작업입니다. 다음 중이 이벤트를 처리하는 가장 좋은 방법은?

  1. 컨트롤러는보기를 다시 그리기 만하면됩니다. 컨트롤러를 통한보기는 게임 상태의 모든 매개 변수에 액세스 할 수 있습니다. 이 매개 변수를 사용하여 데크, 양쪽 플레이어의 손 등을 포함한 모든 것을 다시 그립니다.

  2. 컨트롤러는 플레이어가 카드를 재생했다는 사실을 알려줍니다. 플레이어가 카드를 재생할 때 해당 플레이어의 손만 다시 그려야한다는 것을 알 수 있습니다. 옵션 1과 마찬가지로 뷰는 게임 상태의 매개 변수를 사용하여 플레이어의 손을 다시 그리는 방법을 결정합니다.

  3. (비슷하지만 2와 다름) 컨트롤러는보기에서 플레이어의 손을 다시 그려야하고 그렇게하기 위해 필요한 모든 매개 변수를 전달합니다. 뷰에는 게임 매개 변수에 대한 액세스 권한이 없습니다.

  4. 다른 방법이 있습니까?

옵션 1은보기가 상태가 없기 때문에 가장 쓰기 쉬운 것 같습니다. 매번 모든 것을 다시 그립니다. 그러나 같은 이유로, 그것은 매우 낭비입니다. 한 명의 플레이어가 카드를 사용할 때 두 플레이어의 손을 모두 그릴 필요가 없습니다. 우리가 다시 그릴 때마다 우리는 오래된 캔버스를 던져 버리고 새로운 뷰 구성 요소로 새로운 캔버스를 작성하기 때문에 애니메이션과 같은 일을하기가 어렵습니다.

스펙트럼의 다른 끝에서 옵션 3은보기에서 논리를 제거하는면에서 가장 좋은 것처럼 보이지만 몇 가지 문제가 있습니다. 첫째, 모든 적절한 메시지가보기로 전송되어야하므로 작성하기가 더 어려웠습니다. 놓친 경우보기가 앱의 상태를 제대로 반영하지 않습니다. 둘째, 사용자가 진행중인 저장된 게임을 복원 할 때 완전히 다시 그리는 것이 필요한 것처럼 보입니다.

옵션 1과 2 모두에서보기는 게임 상태에 대한 데이터를 "가져옵니다"반면이 데이터는 옵션 3에서 "푸시 (push)"됩니다.보기가 이와 같은 정보를 요청할 수 있거나 이것이 존재 함을 의미합니까? 보기에 논리가 너무 많습니까?

빛에 대해 미리 감사 드리며이 주제에 관해 설명해 드릴 수 있습니다!

답변

1

MVC는 모든 응용 프로그램에 가장 적합하지 않습니다. 또한 어떤 종류의 프레임 워크가 사용 가능한지에 따라 다릅니다.

플랫폼/프레임 워크를 고려하지 않으면 HMVC (계층 적 모델보기 컨트롤러) 또는 PAC (프리젠 테이션 추상화 제어)가 페이지가 분할 될 수 있기 때문에 더 적합하다고 말합니다. 여러 부분 (세보기 : 손 & 갑판).

네이티브 응용 프로그램 (GUI)의 경우 MVP보다 MVP가 더 선호됩니다.

마틴 파울러 (Martin Fowler)는 여기에 다른 GUI 패턴에 대한 멋진 기사가 있습니다. http://www.martinfowler.com/eaaDev/uiArchs.html

관련 문제