Saya secara teratur menemukan situasi di mana saya perlu Menambah atau Mengedit item, dan kadang-kadang saya menggunakan metode terpisah untuk Tambah dan Edit, dan di lain waktu saya menggabungkannya menjadi satu metode.
Apakah satu metode lebih disukai daripada yang lain? Jika demikian, mengapa?
public void AddItem()
{
ShowEditingPopup(new Item(), "Add Item");
}
public void EditItem(Item item)
{
ShowEditingPopup(item, "Edit Item");
}
ATAU
public void EditItem(Item item)
{
ShowEditingPopup(
(item ?? new Item()),
string.format("{0} Item", (item == null ? "Add " : "Edit "))
);
}
dimana ShowEditingPopup
didefinisikan sebagai
public void ShowEditingPopup(object popupDataContext, string popupTitle)
{
PopupDataContext = popupDataContext;
PopupTitle = popupTitle;
IsPopupVisible = true;
}
Sunting: Hanya untuk memperjelas, saya tidak Menyimpan item, saya membukanya untuk diedit. Saya hampir selalu menerapkan metode Simpan generik untuk menyimpan ke database
Sunting # 2: Sampel kode yang diedit sehingga lebih akurat mencerminkan jenis situasi yang saya maksud
coding-style
Rachel
sumber
sumber
EditOrAddItem
, bukan hanyaEditItem
.EditItem
.Save
metode adalah sempurna berlaku programmers.stackexchange.com/q/104404/1130Jawaban:
Pikirkan konteks Anda sejenak ... Tidak ada perbedaan antara Menambahkan elemen baru atau mengedit yang sudah ada. Kamu hanya
SaveChanges()
. Status elemen individual memberi tahu konteks apakah elemen baru ditambahkan atau elemen yang sudah diedit.EDIT: Ok ... Nah dalam hal itu, saya punya Aksi Kontrol terpisah (MVC3) untuk setiap tindakan, namun, hanya 1 tampilan ...
sumber
Save
metode generik untuk menyimpan objek kembali ke database)ShowPopup(popupContent, popupTitle);
, dan saya ingin tahu apakah ada alasan untuk membuat panggilan terpisah yang menunjukkan item baru atau item yang ada, atau melakukan keduanya dengan metode yang sama.Katakanlah saya menambahkan atau mengedit
Person
entitas. Saya hampir selalu memiliki dua model untuk menangani proses add / edit:AddPersonModel
EditPersonModel
Mereka hampir selalu mewarisi dari kelas dasar abstrak umum:
AddEditPersonModelBase
Jadi kelas dasar mungkin memiliki
Commit
metode abstrak , yang ditimpa oleh kelas turunan untuk memulaiPerson
entitas baru , atau untuk menyimpan perubahan kePerson
entitas yang ada .Logika bisnis yang umum untuk menambahkan dan mengedit masuk dalam kelas dasar (misalnya, untuk mengedit alamat), tetapi selalu ada sedikit logika bisnis yang berbeda jika Anda menambahkan atau mengedit, dan yang masuk dalam subclass. Misalnya, Anda mungkin ingin memberi mereka nomor ID tambahan yang unik, tetapi Anda tidak benar-benar membuatnya sampai Anda menyimpan entitas. Dalam hal ini, hanya Anda yang
EditPersonModel
memiliki properti itu.Demikian pula, Anda akan memiliki Tampilan terpisah (dan ViewModels) untuk menambahkan atau mengedit
Person
, tetapi masuk akal untuk menambahkan dan mengedit varian yang diwarisi dari kelas dasar yang sama karena banyak yang akan menjadi umum.sumber
WPF
/MVVM
, dan UI adalah DataTemplate generik untuk objek, sedangkan ViewModel untuk objek tahu bagaimana menanganinya berdasarkan keadaan itu.AddPersonViewModel
(yang tidak mengambilPerson
dalam konstruktor) atauEditPersonViewModel
(yang tidak mengambil yang adaPerson
dalam konstruktor). Siapa pun yang dibuat akan ditetapkan sebagaiWindow
'sDataContext
. Ketika WPF melihat salah satu dari mereka di tata letak, ia mencariDataTemplate
untuk ituViewModel
dan menerapkannya secara otomatis. KeduanyaAddPersonViewModel
danEditPersonViewModel
mewarisi dari kelas dasar yang sama dengan logika umum di antara mereka di dalamnya. Misalnya, sebuahICommand
untuk menyimpan. Tombol simpan mengikat itu.DataTemplate
yang mengikat untuk menambah atau mengeditViewModel
(dengan mengikat ke kelas dasar), atau Anda dapat menambahkan baruDataTemplate
yang mengikat ke kelas anak, jika salah satu atau keduanya perlu memiliki Tampilan yang berbeda.PersonViewModel
yang menerimaPerson
objek di konstruktor. Saya biasanya membuat aplikasi kecil dan sering tidak melihat kebutuhan untuk memisahkanViews
/ViewModels
kecuali ada perbedaan besar antara objek baru dan yang sudah ada. Situasi seperti itulah yang mendorong pertanyaan saya.Saya pribadi cenderung mengikuti prinsip menjadi semantik . Ini berarti bahwa saya biasanya tidak menyediakan formulir pengeditan all-in-one. Dengan kata lain, pengguna biasanya tidak ingin mengedit seluruh informasi suatu entitas . Sebaliknya proses pengeditan mereka lebih semantik dan dapat diklasifikasikan. Misalnya, untuk entitas pengguna , orang biasanya mengedit kata sandi dan mengedit profil . Jadi, saya membuat dua fungsi untuk diedit seperti:
Atau, pengguna biasanya mengedit artikel dengan cara ini:
Singkatnya, saya biasanya membuat form pembuatan all-in-one, tapi saya cenderung menggunakan form edit yang kecil untuk setiap operasi edit semantik. Jadi, saya biasanya tidak menggabungkannya. Namun, ini tidak berarti bahwa Anda tidak dapat menggabungkan mereka. Setiap kali Anda ingin memberikan bentuk edit besar dan besar yang menyerupai bentuk kreasi, saya pikir penggabungan dapat bekerja lebih baik.
sumber
Ini adalah masalah seberapa baik Anda memahami Prinsip Tanggung Jawab Tunggal . Akan lebih bersih dan lebih mudah untuk membaca, memahami, dan memelihara jika tanggung jawab dipisahkan ke dalam metode / tindakan yang terpisah. Namun, ini dari perspektif pengkodean.
Jika saya harus memilih satu pendekatan dari contoh Anda, saya akan pergi untuk pendekatan pertama .
Perspektif pengguna tergantung pada seberapa mudah menambahkan item baru atau mengedit item yang ada (jumlah klik adalah salah satu cara saya mengukur) dan mungkin untuk mengikuti beberapa aturan emas.
Jika saya harus mengimplementasikan fungsionalitas (UI / Formulir), saya akan memiliki satu formulir ketika menambah dan mengedit keduanya memiliki fetures yang sama, dan dua bentuk terpisah ketika mereka berbeda.
sumber