视图应该对模型了解多少?


10

我正在使用WPF和DAG支持的python包装器在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)

所以我想我要问的是,我应该传递非常原始的数据并保持视图尽可能通用,然后使用回调并在控制器中处理业务细节。

还是应该将整个模型传递给视图,然后让视图直接更新模型。这意味着将要键入的代码更少。

PS。不要判断代码-只是为了可视化。

编辑:

另外要补充 -此应用程序将使用支持鸭型的python编写。这意味着使用第二种方法,只要模型满足所需的接口,视图仍然可以重用。

Answers:


3

视图应该包含的唯一“逻辑”应该是负责更改GUI对用户可见状态的代码。任何处理数据或计算值的代码都应在其他地方处理。

您的视图应该知道模型的外观,但是应该不知道与模型公开的任何事物相关的行为。

将简单的数据类型传递给视图使它既可以操作GUI,又可以存储视图状态,这很容易变得笨拙。

如果模型是为视图操作而构建的,则应将模型直接传递给视图。如果您的模型与数据存储机制所使用的模型相同,则如果内部表示和视图表示不同(通常如此),则可能会导致问题。

基本上,您应该只具有一个View,View Model,Data Model和一些用于处理业务逻辑的东西。这样,您就可以轻松分离所有问题,只需将它们粘合在一起即可。


1

这多少有些笼统,但是IMO的观点应该做的工作最少(例如验证用户输入)。

这样,您可以期望所有逻辑都在控制器中。这使得沿途,单一责任原则以及所有其他方面的维护变得容易得多。


在第二种方法中,逻辑仍然会在视图模型中,而不是在视图中。
Arturs Vancans
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.