ビューはモデルについてどの程度知っておくべきですか?


10

WPFのpythonラッパーとDAGサポートを使用して、pythonでアプリケーションを構築しています。私は現在、データとビューの間でやり取りする一貫した方法を決定する必要があるところにいます。

私が見る限り、現在2つの明白な解決策があります。

1つ目は、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)

2つ目は、モデルの(参照)をビューに渡し、ビューにデータを取得および更新させることです。ビューにはモデルが含まれているため、コントローラへの追加のコールバックなしでモデルを更新できます。

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で記述されます。つまり、2番目のアプローチでは、モデルが必要なインターフェースを満たす限り、ビューは再利用可能です。

回答:


3

ビューに含める必要がある唯一の「ロジック」は、ユーザーにGUIの表示状態を変更するコードです。データを操作したり、値を計算したりするコードは、別の場所で処理する必要があります。

ビューはモデルがどのように見えるかを知っている必要がありますが、モデルが公開するものに関連する動作を知らないようにする必要があります。

単純なデータ型をビューに渡すと、GUIの操作とビューステートの保存の両方が行われ、扱いにくくなる可能性があります。

モデルがビューによる操作用に作成されている場合は、モデルをビューに直接渡す必要があります。モデルがデータストレージメカニズムで使用されているものと同じである場合、内部表現とビュー表現が(多くの場合)異なると、将来的に問題が発生する可能性があります。

基本的には、ビュー、ビューモデル、データモデル、およびビジネスロジックを処理するためのものが必要です。その後、すべての懸念が簡単に分離され、それらを接着するだけです。


1

これはやや一般化した回答ですが、IMOビューは可能な限り最小限の作業(たとえば、ユーザー入力の検証)を行う必要があります。

このようにして、すべてのロジックがコントローラー内にあることを期待できます。これにより、将来、単一の責任の原則などを維持することが非常に簡単になります。


2番目のアプローチでも、ロジックはビューモデルではなくビューモデルにあります。
Arturs Vancans 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.