Keuntungan FindById () .
Masa depan-pemeriksaan : Jika Anda memulai dengan Find(int)
, dan kemudian harus menambahkan metode lain ( FindByName(string)
, FindByLegacyId(int)
, FindByCustomerId(int)
, FindByOrderId(int)
, dll), orang-orang seperti saya cenderung menghabiskan usia mencari FindById(int)
. Tidak benar-benar masalah jika Anda bisa dan akan berubah Find(int)
menjadi FindById(int)
begitu diperlukan - pemeriksaan di masa depan adalah tentang ini jika s.
Lebih mudah dibaca . Find
baik-baik saja jika panggilannya seperti record = Find(customerId);
Namun FindById
sedikit lebih mudah untuk dibaca jika itu record = FindById(AFunction());
.
Konsistensi . Anda dapat secara konsisten menerapkan FindByX(int)
/ FindByY(int)
pola di mana-mana, tetapi Find(int X)
/ Find(int Y)
tidak mungkin karena mereka bertentangan.
Keuntungan Menemukan ()
- CIUMAN.
Find
sederhana dan mudah, dan di samping operator[]
itu salah satu dari 2 nama fungsi yang paling diharapkan dalam konteks ini. (Beberapa alternatif populer menjadi get
, lookup
atau fetch
, tergantung pada konteks).
- Sebagai aturan praktis, jika Anda memiliki nama fungsi yang merupakan kata tunggal terkenal yang secara akurat menjelaskan apa fungsi tersebut, gunakan itu. Bahkan jika ada nama multi-kata yang lebih panjang yang sedikit lebih baik dalam menggambarkan apa fungsinya. Contoh: Panjang vs NumberOfElements . Ada tradeoff, dan di mana menarik garis adalah subjek dari perdebatan yang sedang berlangsung.
- Biasanya bagus untuk menghindari redundansi. Jika kita melihat
FindById(int id)
, kita dapat dengan mudah menghapus redundansi dengan mengubahnya Find(int id)
, tetapi ada trade off - kita kehilangan kejelasan.
Atau Anda bisa mendapatkan keuntungan dari keduanya dengan menggunakan Id yang sangat diketik:
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
Implementasi Id<>
: Sangat mengetik nilai ID di C #
Komentar di sini, serta di link di atas, mengangkat beberapa kekhawatiran tentang Id<Customer>
bahwa saya ingin alamat:
- Masalah 1: Ini penyalahgunaan obat generik.
CustomerId
dan OrderID
tipe yang berbeda ( customerId1 = customerId2;
=> baik, customerId1 = orderId1;
=> buruk), tetapi implementasinya hampir identik, sehingga kami dapat mengimplementasikannya baik dengan salin tempel atau dengan metaprogramming. Meskipun ada nilai dalam diskusi tentang mengekspos atau menyembunyikan generik, metaprogramming adalah tujuan generik.
- Kekhawatiran 2: Itu tidak menghentikan kesalahan sederhana./Ini adalah solusi dalam mencari masalah Masalah utama yang dihapus dengan menggunakan Id sangat diketik adalah urutan argumen yang salah dalam panggilan ke
DoSomething(int customerId, int orderId, int productId)
. Id yang diketik dengan kuat juga mencegah masalah lain, termasuk yang ditanyakan OP.
- Kekhawatiran 3: Ini benar-benar hanya mengaburkan kode. Sulit untuk mengetahui apakah ada id yang ditahan
int aVariable
. Sangat mudah untuk mengetahui bahwa ID telah disimpan Id<Customer> aVariable
, dan kami bahkan dapat mengatakan bahwa itu adalah ID pelanggan.
- Kekhawatiran 4: Id ini bukan tipe yang kuat, hanya pembungkus.
String
hanyalah pembungkus di sekitar byte[]
. Pembungkus, atau enkapsulasi, tidak bertentangan dengan pengetikan yang kuat.
- Kekhawatiran 5: Sudah selesai direkayasa. Inilah versi minimalnya, walaupun saya merekomendasikan untuk menambahkan
operator==
dan operator!=
juga, jika Anda tidak ingin bergantung secara eksklusif pada Equals
:
.
public struct Id<T>: {
private readonly int _value ;
public Id(int value) { _value = value; }
public static explicit operator int(Id<T> id) { return id._value; }
}
T Find<T>(string name)
atau(int size)
bagaimana Anda berencana untuk menyelesaikan masalah yang tak terhindarkan?