Saya bekerja dalam sistem yang dapat mewakili "perkiraan pengiriman" dalam dua cara:
- Tanggal tertentu: Barang dijamin dikirim pada tanggal itu
- Interval hari: Item akan dikirim hari "X ke Y" mulai hari ini
Informasi pada model secara semantik sama, itu adalah "perkiraan pengiriman". Ketika saya mendapatkan informasi tentang perkiraan pengiriman dari sistem, saya dapat mengetahui apakah perkiraan itu dari bentuk pertama atau bentuk kedua.
Model saat ini untuk ini mirip dengan yang berikut:
class EstimattedShippingDateDetails
{
DateTime? EstimattedShippingDate {get; set;}
Range? EstimattedShippingDayRange {get; set;}
}
Range
adalah kelas sederhana untuk membungkus "awal -> akhir" dari bilangan bulat, agak seperti ini:
struct Range
{
int Start {get; set}
int End {get; set}
public override ToString()
{
return String.Format("{0} - {1}", Start, End);
}
}
Saya tidak suka pendekatan ini karena hanya satu dari properti pada model estimasi yang akan diisi, dan saya perlu menguji nol pada salah satu dari mereka dan menganggap yang lain memiliki data.
Masing-masing properti ditampilkan secara berbeda kepada pengguna tetapi di tempat yang sama di UI, menggunakan MVT DisplayTemplate kustom, di mana logika switching saat ini berada:
@Model EstimattedShippingDateDetails
@if (Model.EstimattedShippingDate.HasValue)
{
Html.DisplayFor(m => Model.EstimattedShippingDate)
}
else
{
Html.DisplayFor(m => Model.EstimattedShippingDayRange)
}
Bagaimana saya bisa memodelkan ini untuk membuatnya lebih representatif dari persyaratan aktual sambil tetap menjaga logika tampilan tetap sederhana dalam aplikasi MVC?
Saya berpikir tentang menggunakan antarmuka dan dua implementasi, satu untuk setiap "jenis" estimasi, tetapi saya tidak bisa membungkus kepala saya di sekitar antarmuka umum untuk keduanya. Jika saya membuat antarmuka tanpa anggota, maka saya tidak dapat mengakses data secara terpadu dan ini adalah desain IMHO yang buruk. Saya juga ingin menjaga viewmodel sesederhana mungkin. Saya akan mendapatkan kode "benar berdasarkan konstruksi" dengan pendekatan ini, karena tidak perlu ada nullable lagi: setiap implementasi akan memiliki properti yang tidak dapat dibatalkan, baik a DateTime
atau a Range
.
Saya juga dianggap hanya menggunakan satu Range
dan ketika situasi # 1 terjadi, cukup gunakan yang sama DateTime
untuk keduanya Start
dan End
, tetapi ini akan menambah komplikasi tentang cara memancarkan nilai-nilai ke UI karena saya kemudian harus mendeteksi apakah itu statis atau interval oleh membandingkan nilai-nilai dan memformat rentang dengan benar untuk ditampilkan sebagai tanggal tunggal atau interval yang diformat.
Tampaknya apa yang saya butuhkan adalah konsep yang mirip dengan serikat pekerja Script: pada dasarnya properti yang bisa dari dua jenis. Tidak ada hal seperti itu ada di C # tentu saja (hanya dynamic
akan dekat dengan itu).