Saya sedang mengerjakan aplikasi ASP.NET MVC, dan saya sudah terbiasa membiasakan apa yang kelihatannya membantu dan nyaman digunakan dalam kelas model / entitas saya.
Sebagai contoh:
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string FullName
{
get { return FirstName + " " + LastName; }
}
public string FormattedPhoneNumber
{
get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
}
}
Saya bertanya-tanya orang-orang memikirkan FullName
dan mendapatkan FormattedPhoneNumber
.
Mereka membuatnya sangat mudah untuk membuat format data standar di seluruh aplikasi, dan mereka tampaknya menyimpan banyak kode berulang, tetapi dapat dipastikan bahwa format data adalah sesuatu yang harus ditangani dalam pemetaan dari model ke model-tampilan.
Sebenarnya, saya awalnya menerapkan format data ini di lapisan layanan saya di mana saya melakukan pemetaan, tetapi itu menjadi beban untuk terus-menerus harus menulis formatters kemudian menerapkannya di banyak tempat berbeda. Misalnya, saya menggunakan "Nama Lengkap" di sebagian besar tampilan, dan harus mengetikkan sesuatu seperti di model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);
semua tempat tampak jauh lebih elegan daripada hanya mengetik model.FullName = entity.FullName
(atau, jika Anda menggunakan sesuatu seperti AutoMapper, berpotensi tidak mengetik apa pun).
Jadi, di mana Anda menggambar garis ketika datang ke pemformatan data. Apakah "boleh" melakukan pemformatan data dalam model Anda atau apakah itu "pola bau"?
Catatan: Saya jelas tidak memiliki html dalam model saya. Saya menggunakan pembantu html untuk itu. Saya benar-benar berbicara tentang memformat atau menggabungkan data (dan terutama data yang sering digunakan).
sumber
PhoneNumber
mungkin termasuk dalam kelasnya sendiri (yang sekarang telah saya implementasikan). TetapiFullName
sebenarnya adalah hal yang memotivasi saya untuk menulis pertanyaan. Tapi saya tertarik untuk mencari tahu apakah, secara umum, masuk akal untuk meletakkan pemformatan data / menyisir, dll dalam model untuk hal-hal yang akan berlaku di seluruh aplikasi. Dari jawaban di bawah, sepertinya ini bukan anti-pola, tetapi keputusan harus dibuat dengan hati-hati.Jawaban:
Dalam contoh Anda, saya menyukai
FullName
pengambil (untuk semua alasan yang Anda berikan) tetapi saya tidak suka pengambil FormattedPhoneNumber. Alasannya adalah: itu mungkin tidak mudah (setelah Anda memiliki nomor telepon internasional, dll.) Dan jika Anda menempatkan logika untuk memformat nomor telepon dalam suatu metodeMember
, kemungkinan Anda perlu melakukan refactor (atau salin-tempelkan caugh ) begitu Anda perlu nomor telepon yang diformat untukInstitution
,Vendor
dll juga.EDIT: IMO akan lebih baik untuk memiliki
PhoneNumber
kelas denganFormatted
pengambil.sumber
String
kelas, saya kira), Anda "mengajar"String
kelas bagaimana memformat nomor telepon. Apakah benar-benar tanggung jawabString
kelas untuk mengetahui nomor telepon? Saya kira tidak. Digunakan seperti itu, metode ekstensi adalah gula sintaksis untuk membiarkan sesuatu yang jelas-jelas tidak berorientasi objek terlihat seperti itu.PhoneNumber
kelas. Saya sudah berencana melakukan itu karena saya juga punyaPhoneType
properti.PhoneNumber
kelas instan karena datanya aslistring
. Sebaliknya, itu harus berupa kelas statis dengan metode sepertipublic static string Format(string phoneNumber, PhoneNumberStyle style)
.Hal-hal yang perlu Anda pertimbangkan ketika menulis kode: Apakah itu benar? Apakah bisa dibaca? Apakah efisien? Apakah bisa dirawat? Saya berpendapat, seperti yang disebutkan @btilly, bahwa itu tidak dapat dikelola karena pemformatan khusus budaya, tetapi pertanyaannya tampaknya lebih umum daripada itu.
Menggunakan pengakses seperti ini membuat kode Anda lebih mudah dibaca, dan, tergantung bagaimana Anda menggunakannya, mungkin membuat bagian lain dari kode Anda jauh lebih bersih. Menurut saya, itu tidak berbau sama sekali. Itu akan mulai berbau jika Anda memiliki Memformat accessors untuk segala jenis string yang Anda mungkin ingin cetak (
public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;
, dll)Atau, dengan kata lain, menggunakan pola tidak secara otomatis membuat kode Anda memiliki "bau pola". Anda perlu menyalahgunakannya jika Anda ingin mendapatkan atribut itu.
sumber
Melanggar prinsip tanggung jawab tunggal. Mengapa tidak membuat kelas nomor telepon, dll ...?
sumber
FullName
kelas?Sebagai contoh Anda, saya tidak melihatnya sebagai masalah besar untuk menggunakan format tertentu. Ini satu atau dua dan semua bagian aplikasi menggunakan format yang sama.
Di mana keputusan itu akan mulai rusak adalah ketika Anda memiliki data yang sama pergi ke beberapa tempat berbeda yang membutuhkan format yang berbeda .
Jika itu terjadi, saya akan tergoda untuk menarik
Member
kelas kembali ke:Dan kemudian lakukan adapter yang berbeda untuk setiap target. Misalnya, anggap informasi itu diperlukan dalam format CSV:
Selalu berasumsi bahwa Anda telah membersihkan data sehingga tidak ada koma, dll.
Adaptor tidak harus menjadi metode ekstensi, tetapi untuk kasus ini sepertinya cocok.
sumber
over
sebanyak itu, maka ada yang salah dengan desainnya.