Kapan lebih disukai menggabungkan fungsi Tambah / Edit, dan kapan memisahkannya?

8

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 ShowEditingPopupdidefinisikan 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

Rachel
sumber
Berdalih minor - jika Anda akan menggabungkan, gunakan nama yang tepat untuk metode ini EditOrAddItem, bukan hanya EditItem.
Oded
@Daftar Saya hanya menggunakan SaveItem ... ini berlaku untuk keduanya.
AJC
@AJC - cukup adil. Namun, contohnya masih ada EditItem.
Oded
1
Lebih banyak soal pilihan daripada yang lain .... Akan senang melihat jawabannya
Pankaj Upadhyay
1
@FrustratedWithFormsDesigner Ada satu baru-baru ini, tapi ditangani dengan menyimpan perubahan ke repositori, dalam hal ini saya pikir Savemetode adalah sempurna berlaku programmers.stackexchange.com/q/104404/1130
Rachel

Jawaban:

2

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 ...

AJC
sumber
Saya tidak menyimpan objek, saya membukanya di jendela baru untuk Editing. (Saya punya Savemetode generik untuk menyimpan objek kembali ke database)
Rachel
@Rachel, sunting ...
AJC
Pertanyaan ini muncul karena kode yang biasanya saya gunakan untuk panggilan 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.
Rachel
@Rachel Saya tidak dapat menemukan alasan untuk tidak menggabungkan panggilan ... Namun itu adalah pilihan pribadi ... Jika Anda ingin memisahkan mereka atau mencampurnya. Seperti yang saya katakan, dalam kasus saya, saya menggunakan panggilan terpisah, tetapi UI yang sama untuk keduanya.
AJC
+1 untuk tindakan yang berbeda tetapi tampilan yang sama. Pikirkan situs yang Anda kunjungi yang memiliki kegunaan terbaik .. sebagian besar dari mereka menggunakan layar yang sama untuk membuat / mengedit item, kecuali ada kondisi bisnis yang sangat spesifik yang diaktifkan / ditampilkan ketika melakukan salah satu tindakan.
silverCORE
0

Katakanlah saya menambahkan atau mengedit Personentitas. 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 Commitmetode abstrak , yang ditimpa oleh kelas turunan untuk memulai Personentitas baru , atau untuk menyimpan perubahan ke Personentitas 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 EditPersonModelmemiliki 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.

Scott Whitlock
sumber
Dalam hal ini, dan dalam kebanyakan kasus yang saya lakukan baru-baru ini, baik Menambah dan Mengedit menggunakan formulir yang sama persis. Saya menggunakan WPF/ MVVM, dan UI adalah DataTemplate generik untuk objek, sedangkan ViewModel untuk objek tahu bagaimana menanganinya berdasarkan keadaan itu.
Rachel
@Rachel - dalam bahasa MVVM, Anda dapat membuat AddPersonViewModel(yang tidak mengambil Persondalam konstruktor) atau EditPersonViewModel(yang tidak mengambil yang ada Persondalam konstruktor). Siapa pun yang dibuat akan ditetapkan sebagai Window's DataContext. Ketika WPF melihat salah satu dari mereka di tata letak, ia mencari DataTemplateuntuk itu ViewModeldan menerapkannya secara otomatis. Keduanya AddPersonViewModeldan EditPersonViewModelmewarisi dari kelas dasar yang sama dengan logika umum di antara mereka di dalamnya. Misalnya, sebuah ICommanduntuk menyimpan. Tombol simpan mengikat itu.
Scott Whitlock
@Rachel - Anda dapat memiliki kesamaan DataTemplateyang mengikat untuk menambah atau mengedit ViewModel(dengan mengikat ke kelas dasar), atau Anda dapat menambahkan baru DataTemplateyang mengikat ke kelas anak, jika salah satu atau keduanya perlu memiliki Tampilan yang berbeda.
Scott Whitlock
Biasanya saya hanya punya PersonViewModelyang menerima Personobjek di konstruktor. Saya biasanya membuat aplikasi kecil dan sering tidak melihat kebutuhan untuk memisahkan Views/ ViewModelskecuali ada perbedaan besar antara objek baru dan yang sudah ada. Situasi seperti itulah yang mendorong pertanyaan saya.
Rachel
0

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:

public bool EditPassword(string userName)
{
    // code here
}

public bool EditProfile(Profile newProfile)
{
    // code here    
}

Atau, pengguna biasanya mengedit artikel dengan cara ini:

public bool PutArticleIntoCategories(int articleId, List<Category> categories)
{

}

public bool EditArticleSummary(int articleId, string newSummary)
{

}

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.

Saeed Neamati
sumber
0

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.

Kosala Nuwan Perera
sumber