Saat menggunakan objek bisnis yang dapat digunakan kembali, praktik apa yang dianggap terbaik saat membangun model tampilan?
Kami menggunakan objek yang kami sebut Builder
untuk membangun model tampilan kami. Satu pembangun untuk setiap unit tampilan logis (pesanan, pengguna, dll), di mana setiap unit dapat berisi sejumlah model tampilan yang berbeda (pesanan berisi ringkasan, baris pesanan, dll).
Pembangun dapat menarik data melalui satu atau lebih objek bisnis standar untuk membangun model tampilan.
Apa yang dianggap praktik yang lebih baik ketika menggunakan objek / model bisnis dalam model tampilan?
Pendekatan 1
Izinkan penggunaan objek bisnis dalam model tampilan?
//Business object in some library
public class Order
{
public int OrderNum;
public int NumOrderLines;
//...
}
//Order builder in website
public class OrderBuilder
{
public OrderSummary BuildSummaryForOrder(int OrderNum)
{
Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
//Any exception handling, additional logic, or whatever
OrderSummary obModel = new OrderSummary();
obModel.Order = obOrder;
return obModel;
}
}
//View model
public class OrderSummary
{
public Some.Business.Logic.Order Order;
//Other methods for additional logic based on the order
//and other properties
}
Pendekatan 2
Ambil hanya data yang diperlukan dari objek bisnis
//Business object in some library
public class Order
{
public int OrderNum;
public int NumOrderLines;
//...
}
//Order builder in website
public class OrderBuilder
{
public OrderSummary BuildSummaryForOrder(int OrderNum)
{
Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
//Any exception handling, additional logic, or whatever
OrderSummary obModel = new OrderSummary()
{
OrderNum = obOrder.OrderNum,
NumOrderLnes = obOrder.NumOrderLines,
}
return obModel;
}
}
//View model
public class OrderSummary
{
public int OrderNum;
public int NumOrderLines
//Other methods for additional logic based on the order
//and other properties
}
Saya bisa melihat manfaat dan kekurangannya, tetapi saya ingin tahu apakah ada pendekatan yang diterima? Dalam pendekatan 1, tidak ada duplikasi kode di sekitar model, tetapi itu menciptakan ketergantungan pada logika bisnis. Dalam pendekatan 2, Anda hanya mengambil data yang diperlukan untuk tampilan, tetapi Anda menduplikasi kode di sekitar model.
sumber
Opsi 1 lebih disukai karena menghindari duplikasi kode. Itu dia.
Jika model domain berubah secara signifikan, hampir pasti bahwa pandangan harus tetap berubah. Dengan opsi 2, maka Anda harus mengubah model tampilan DAN pembangun serta tampilan itu sendiri. Hal semacam itu adalah racun mutlak untuk pemeliharaan. YAGNI.
Tujuan memiliki model tampilan terpisah adalah untuk menjaga status yang bermakna hanya untuk tampilan (mis. Tab apa yang saat ini dipilih) terpisah dari model bisnis. Tetapi data bisnis itu sendiri harus digunakan kembali daripada digandakan.
sumber
Prinsip dan mantra terkadang berharga untuk memandu desain ... tapi inilah jawaban praktis saya:
Bayangkan model tampilan Anda diserialisasi ke JSON atau XML. Jika Anda mencoba dan membuat serial model domain Anda, Anda akan berakhir dengan kekacauan teks yang mengerikan dan kemungkinan besar akan mengalami masalah dengan referensi melingkar dan masalah lainnya.
Tujuan dari model tampilan bukan untuk mengelompokkan model domain bersama sehingga tampilan dapat mengkonsumsinya. Sebaliknya model tampilan harus menjadi model tampilan yang benar-benar datar ... hal yang sebenarnya Anda lihat di layar. Logika tampilan Anda hanya harus berkaitan dengan penataan data yang ada dalam model tampilan.
Idealnya model tampilan Anda harus terdiri hampir seluruhnya dari string pra-diformat. Pikirkan tentang hal ini ... Anda bahkan tidak ingin DateTime atau desimal dalam model tampilan Anda karena Anda terjebak melakukan pemformatan logika dalam C #, Javascript, Objective-C, dll.
sumber