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 . Findmü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.
Findbasit 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, lookupya da fetchiç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.
CustomerIdve OrderIDfarklı 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> aVariableve 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.
Stringetrafı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?