Seberapa banyak pandangan yang harus diketahui tentang model?


10

Saya membangun aplikasi dalam python dengan pembungkus python untuk WPF dan dengan dukungan DAG. Saat ini saya berada pada titik di mana saya harus memutuskan cara yang konsisten untuk berinteraksi antara data dan tampilan.

Sejauh yang saya lihat saat ini ada dua solusi yang jelas.

Yang pertama mirip dengan bagaimana Aplikasi Android disusun. Anda memiliki pengontrol yang mengatur / mengisi tampilan. Jadi pengontrol memiliki pandangan dan hanya mendorong data primitif yang akan ditampilkan. Tampilan hanya lapisan bodoh dan tidak tahu apa yang terjadi dan dari mana data itu berasal. Dan kemudian jika pengguna berinteraksi dengan tampilan, itu akan mengirim panggilan balik ke controller (jika terdaftar).

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)

Yang kedua adalah meneruskan (referensi) model ke tampilan dan membiarkan tampilan untuk mengambil dan memperbarui data. Tampilan sekarang berisi model dan karena itu dapat memperbaruinya tanpa panggilan balik tambahan ke controller.

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)

Jadi saya kira apa yang saya tanyakan adalah, apakah saya harus melewatkan data yang sangat primitif dan menjaga tampilan se generik mungkin, kemudian bekerja dengan callback dan melakukan spesifik bisnis di controller.

Atau haruskah saya meneruskan seluruh model ke tampilan dan membiarkan tampilan untuk memperbarui model secara langsung. Ini berarti bahwa akan ada lebih sedikit kode untuk diketik.

PS. Jangan menilai kode - itu hanya untuk visualisasi.

EDIT:

Juga untuk menambah - aplikasi ini akan ditulis dalam python yang mendukung ducktyping. Ini berarti bahwa dengan pendekatan kedua, tampilan masih dapat digunakan kembali selama model memenuhi antarmuka yang diperlukan.

Jawaban:


3

Satu-satunya "logika" tampilan harus berisi, harus kode yang bertanggung jawab untuk mengubah keadaan GUI yang terlihat kepada pengguna. Kode apa pun yang memanipulasi data atau menghitung nilai harus ditangani di tempat lain.

Pandangan Anda harus tahu seperti apa model itu, tetapi harus mengabaikan perilaku yang terkait dengan hal apa pun yang diungkapkan oleh model.

Melewati tipe data sederhana ke tampilan Anda membuatnya bertanggung jawab untuk memanipulasi GUI dan menyimpan status tampilan, yang dapat dengan mudah menjadi berat.

Anda harus meneruskan model langsung ke tampilan jika model dibuat untuk manipulasi oleh tampilan. Jika model Anda adalah sama dengan yang digunakan oleh mekanisme penyimpanan data Anda, itu dapat menyebabkan masalah di jalan jika representasi internal Anda dan melihat representasi berbeda (seperti yang sering dilakukan).

Pada dasarnya, Anda hanya perlu memiliki View, View Model, Model Data dan sesuatu untuk menangani logika bisnis. Maka semua kekhawatiran Anda mudah dipisahkan, Anda hanya perlu merekatkannya bersama.


1

Ini adalah jawaban yang agak umum, tetapi tampilan IMO harus melakukan sesedikit mungkin pekerjaan (misalnya memvalidasi input pengguna).

Dengan cara ini Anda bisa mengharapkan semua logika Anda berada di controller. Ini membuatnya jauh lebih mudah untuk mempertahankan jalan, prinsip tanggung jawab tunggal, dan semua itu.


Nah dalam pendekatan kedua logika akan tetap berada di view-model dan bukan di view.
Arturs Vancans
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.