FindById () 'in Avantajları .
Gelecek geçirmezlik : Birlikte başlarsanız Find(int)
, daha sonra diğer yöntemleri (eklemek zorunda FindByName(string)
, FindByLegacyId(int)
, FindByCustomerId(int)
, FindByOrderId(int)
, vb), benim gibi insanlar arayan yaş harcama eğilimi FindById(int)
. Gerçekten bir sorun varsa yapabilirsiniz ve değişecek Find(int)
için FindById(int)
gerekli hale geldiğinde - Gelecek yalıtımı bu hakkındadır eğer s.
Okuması daha kolay . Find
mükemmel para gibi çağrı görünüyor eğer olduğunu record = Find(customerId);
Oysa FindById
öyle olmadığını okumak için biraz daha kolaydır record = FindById(AFunction());
.
Tutarlılık . FindByX(int)
/ FindByY(int)
Desenini her yere tutarlı bir şekilde uygulayabilirsiniz , fakat Find(int X)
/ Find(int Y)
mümkün olmadıkları için çatışma vardır.
Find () 'ın Avantajları
- ÖPMEK.
Find
basit ve anlaşılır ve operator[]
bunun yanında bu bağlamda en çok beklenen 2 işlev adından biri. (Bazı popüler alternatifler olmak get
, lookup
ya da fetch
içeriğe bağlı).
- Genel bir kural olarak, işlevin ne yaptığını doğru şekilde tanımlayan iyi bilinen tek bir kelime olan bir işlev adınız varsa, onu kullanın. Fonksiyonun ne yaptığını açıklamakta biraz daha iyi olan daha uzun kelimeli bir isim olsa bile. Örnek: Uzunluk vs NumberOfElements . Bir takas var ve çizgiyi nereye çekmeliyiz devam eden bir tartışmaya tabi.
- Artıklıktan kaçınmak genellikle iyidir. Biz bakarsak
FindById(int id)
, biz kolayca bunu değiştirerek fazlalık kaldırabilir Find(int id)
, ancak bir ters orantı vardır - biz netliğinde azalma.
Alternatif olarak , güçlü bir şekilde yazılan kimlikleri kullanarak her ikisinden de yararlanabilirsiniz :
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
Uygulama Id<>
: C #'ya kesinlikle ID değerleri girerek
Buradaki ve yukarıdaki bağlantıdaki yorumlar, Id<Customer>
ele almak istediğimle ilgili birçok endişeyi dile getirdi :
- Endişe 1: Bu bir jenerik kötüye kullanımıdır.
CustomerId
ve OrderID
farklı türlerdir ( customerId1 = customerId2;
=> iyi, customerId1 = orderId1;
=> kötü), ancak uygulamaları neredeyse aynıdır, bu yüzden bunları kopyala yapıştır veya metaprogramming ile uygulayabiliriz. Jeneriklerin açığa çıkarılması veya saklanmasıyla ilgili bir tartışmada değer varken, metaprogramlama jenerik için ne işe yarar.
- Endişesi 2: Basit hataları durdurmaz. / Bir problem arayışında bir çözüm Bu, güçlü şekilde yazılmış kimlikleri kullanarak kaldırılan asıl mesele, yapılan çağrıda yanlış tartışma sırasıdır
DoSomething(int customerId, int orderId, int productId)
. Kesin olarak yazılmış kimlikleri, sorulan OP de dahil olmak üzere diğer sorunları da önler.
- Endişe 3: Bu gerçekten sadece kodu gizler. Bir kimliğin tutulup tutulmadığını söylemek zor
int aVariable
. Bir Kimlik'in tutulduğunu söylemek kolaydır Id<Customer> aVariable
ve bunun bir müşteri kimliği olduğunu bile söyleyebiliriz.
- Endişe 4: Bu kimlikler güçlü türler değil, yalnızca paketleyicilerdir.
String
etrafında sadece bir sarıcı byte[]
. Sarma veya kapsülleme, güçlü yazma ile çakışmaz.
- Endişe 5: Tamamlandı. Ben ekleyerek tavsiye edersiniz rağmen İşte asgari versiyonu var
operator==
ve operator!=
sen dayanmak istemiyorsanız, hem de 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)
veya(int size)
kaçınılmaz sorunları nasıl çözmeyi planlıyorsunuz?