뷰는 모델에 대해 얼마나 알아야합니까?


10

WPF 용 Python 래퍼와 DAG 지원을 사용하여 Python으로 응용 프로그램을 작성하고 있습니다. 현재 데이터와 뷰간에 일관된 상호 작용 방식을 결정해야하는 시점에 있습니다.

내가 아는 한 현재 두 가지 명백한 해결책이 있습니다.

첫 번째 는 Android 애플리케이션의 구조와 유사합니다. 보기를 설정 / 채우는 컨트롤러가 있습니다. 따라서 컨트롤러는 뷰를 소유하고 표시 될 기본 데이터 만 푸시합니다. 뷰는 단순한 레이어이며 어떤 일이 발생하고 데이터의 출처를 모릅니다. 그런 다음 사용자가 뷰와 상호 작용하면 콜백을 컨트롤러에 등록합니다 (등록 된 경우).

UserInfoController.py

userInfoView = UserInfoView()
userInfoView.onGenderChangedCallback = self.onGenderChangedCallback 
userInfoView.setUserGenderValue(user.getGender())

UserInfoView.py

def setUserGenderValue(self, gender):
    self.userGender = gender

def getView(self):
    return ui.Label(self.userGender, onEditCallback=self.onGenderChangedCallback)

두 번째 모델은 (참조의) 모델을 뷰에 전달하고 뷰가 데이터를 검색하고 업데이트하도록합니다. 뷰에는 이제 모델이 포함되어 있으므로 컨트롤러에 대한 추가 콜백없이 업데이트 할 수 있습니다.

UserInfoViewModel.py

self.gender = 'Male'

UserInfoView.py

def getView(self):
    return ui.Label(self.ViewModel().getGender(), onEdited=self.genderEdited)

def genderEdited(self, newValue):
    self.ViewModel().setGender(newValue)

그래서 내가 요구하는 것은 매우 원시적 인 데이터를 전달하고 가능한 한 일반적인 뷰를 유지 한 다음 콜백으로 작업하고 컨트롤러에서 비즈니스 세부 사항을 수행해야한다는 것입니다.

또는 전체 모델을 뷰에 전달하고 뷰가 모델을 직접 업데이트하도록해야합니다. 즉, 입력 할 코드가 줄어 듭니다.

추신. 코드를 판단하지 마십시오. 단지 시각화를위한 것입니다.

편집하다:

또한 이 응용 프로그램은 ducktyping을 지원하는 파이썬으로 작성됩니다. 즉, 두 번째 방법을 사용하면 모델이 필요한 인터페이스를 충족하는 한 뷰를 계속 재사용 할 수 있습니다.

답변:


3

뷰에 포함되어야하는 유일한 "논리"는 GUI의 가시 상태를 사용자로 변경하는 코드 여야합니다. 데이터를 조작하거나 값을 계산하는 코드는 다른 곳에서 처리해야합니다.

뷰는 모델의 모양을 알고 있어야하지만 모델이 노출하는 것과 관련된 동작은 무시해야합니다.

간단한 데이터 유형을 뷰에 전달하면 GUI 조작 및 뷰 상태 저장이 모두 어려워 져서 다루기가 어려워 질 수 있습니다.

뷰에서 조작 할 수 있도록 모델을 빌드 한 경우 모델을 뷰에 직접 전달해야합니다. 모델이 데이터 저장 메커니즘에서 사용하는 것과 동일한 모델 인 경우 내부 표현과 뷰 표현이 (종종 그렇듯이) 분기 될 경우 문제가 발생할 수 있습니다.

기본적으로 뷰, 뷰 모델, 데이터 모델 및 비즈니스 로직을 처리 할 무언가가 있어야합니다. 그런 다음 모든 우려 사항을 쉽게 분리 할 수 ​​있습니다.


1

이것은 다소 일반적인 답변이지만 IMO보기는 가능한 최소한의 작업을 수행해야합니다 (예 : 사용자 입력 확인).

이런 식으로 모든 로직이 컨트롤러에있을 것으로 예상 할 수 있습니다. 따라서 도로, 단일 책임 원칙 등을 유지하기가 훨씬 쉬워집니다.


두 번째 접근법에서 논리는 여전히 뷰 모델이 아니라 뷰 모델에 있습니다.
Arturs Vancans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.