Daha geniş soru:
Hiç böyle bir standardın uygulandığını duydunuz mu? Eğer öyleyse, arkasındaki sebep neydi?
Evet, bunu duydum ve tam nitelikli nesne adlarını kullanmak isim çarpışmalarını önler. Nadir olsalar, olduklarında, çözülmeleri çok zor olabilirler.
Bir Örnek:
Bu tür bir senaryo muhtemelen bir örnekle daha iyi açıklanmaktadır.
Diyelim ki Lists<T>
iki ayrı projeye ait iki tane var.
System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>
Tam nitelikli nesne adını kullandığımızda, hangisinin List<T>
kullanılmakta olduğu açıktır . Bu açıklık açıkça ayıklamanın pahasına geliyor.
Ve "Bekle! Kimse böyle iki liste kullanmaz!" Diye tartışıyor olabilirsiniz. Bakım senaryosunu göstereceğim yer burası.
Foo
Kurumunuz için, onaylanmış, optimize edilmiş şirketi kullanan bir modül yazdınız List<T>
.
using MyCorp.CustomCollections.Optimized;
public class Foo {
List<object> myList = ...;
}
Daha sonra, yeni bir geliştirici yaptığınız işi uzatmaya karar verir. Şirketin standartlarının farkında olmamakla birlikte, using
bloğu günceller :
using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;
Acele işlerin nasıl kötüye gittiğini görebilirsiniz.
Aynı adda iki tescilli sınıfınız olabileceğini, ancak aynı proje içinde farklı ad alanlarında olabileceğini belirtmek önemsizdir. Bu yüzden sadece .NET framework tarafından sağlanan sınıflarla çarpışmakla ilgili bir endişe değil.
MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();
Gerçeklik:
Şimdi, bu büyük olasılıkla en projelerde oluşmaya? Hayır gerçek değil. Ancak, çok sayıda girdi içeren büyük bir proje üzerinde çalışırken, üzerinizde patlayan şeylerin olasılığını en aza indirmek için elinizden gelenin en iyisini yaparsınız.
Birden fazla katkıda bulunan ekipleri olan büyük projeler, uygulama dünyasında özel bir tür canavardır. Projeye giriş akışları ve katkıda bulunanların projenin kurallarını okumamış olma olasılığı nedeniyle diğer projeler için mantıksız görünen kurallar daha belirgin hale gelir.
Bu, iki büyük proje bir araya getirildiğinde de oluşabilir. Her iki projede de benzer şekilde sınıflar varsa, bir projeden diğerine referans vermeye başladığınızda çarpışmaları görürsünüz. Projeler refactor için çok büyük olabilir veya yönetim refactoring için harcanan zamanı fonlamak için masrafı onaylamaz.
Alternatifler:
Siz sormadıysanız, bunun sorun için iyi bir çözüm olmadığını göstermeye değer . Ad alanı bildirimleri olmadan çarpışacak sınıflar oluşturmak iyi bir fikir değil.
List<T>
Özellikle, ayrılmış bir kelime olarak kabul edilmeli ve sınıflarınız için bir isim olarak kullanılmamalıdır.
Aynı şekilde, proje içindeki bireysel ad alanları da benzersiz sınıf adlarına sahip olmaya çalışmalıdır. Hangi ad alanıyla çalıştığınızı hatırlamak zorunda kalmak Foo()
, en iyi şekilde kaçınılması gereken zihinsel bir yüktür. Sahip: başka bir yolu Dedi MyCorp.Bar.Foo()
ve MyCorp.Baz.Foo()
sizin geliştiriciler yukarı ve en iyi kaçınılmalıdır yolculuk için gidiyor.
Başka bir şey değilse, belirsizliği gidermek için kısmi ad alanlarını kullanabilirsiniz. Örneğin, herhangi bir Foo()
sınıfı kesinlikle yeniden adlandıramazsanız , kısmi ad alanlarını kullanabilirsiniz:
Bar.Foo()
Baz.Foo()
Mevcut projeniz için özel sebepler:
Sorunuzu, bu standardın ardından mevcut projeniz için verdiğiniz belirli nedenlerle güncellediniz. Onlara bir göz atalım ve tavşan izinden gerçekten aşağı inelim.
Tam türünü elde etmek için fareyi adın üzerine getirmeniz çok zordur. Tam nitelikli türün her zaman her zaman görünür olması daha iyidir.
"Hantal?" Um, hayır. Belki sinir bozucu. Bir ekran işaretçisini kaydırmak için birkaç ons plastik hareket ettirmek hantal değildir . Ama ben dalıyorum.
Bu akıl yürütme çizgisi her şeyden çok örtbas gibi görünüyor. Açıkçası, uygulamadaki sınıfların zayıf olarak adlandırıldığını ve sınıf adını çevreleyen uygun miktarda anlamsal bilgiyi toplamak için ad alanına güvenmeniz gerektiğini tahmin ediyorum.
Bu, tam nitelikli sınıf isimleri için geçerli bir gerekçe değildir, belki de kısmen nitelikli sınıf isimlerinin kullanılması için geçerli bir gerekçedir.
E-postayla gönderilen kod parçacıkları tam olarak nitelenmiş bir ada sahip değildir ve bu nedenle anlaşılması zor olabilir.
Bu (devam?) Akıl yürütme çizgisi, sınıfların şu anda yetersiz adlandırıldığına dair şüphelerimi pekiştiriyor. Yine, zayıf sınıf adlarına sahip olmak, her şeyin tam nitelikli bir sınıf adı kullanmasını istemek için iyi bir gerekçe değildir . Sınıf adının anlaşılması zorsa, tam sınıf adlarının düzeltebileceğinden çok daha fazla yanlış var.
Kodu Visual Studio'nun dışında (örneğin Notepad ++) görüntülerken veya düzenlerken, tam tür adını almak mümkün değildir.
Tüm nedenlerden dolayı, bu neredeyse içkimi tükürmeme neden oldu. Fakat yine de dalıyorum.
Ben sol merak ediyorum neden ekip sık düzenlerken veya Visual Studio dışında kod görüntülüyor? Ve şimdi, ad alanlarının sağlaması gerekenlere oldukça dik bir gerekçeye bakıyoruz. Bu bir takım destekli argümandır, oysa ad alanları koda örgütsel yapı sağlamak için vardır.
Takımın kendileri için ne sağlayabileceğinden faydalanmayan geliştiricilerin yanı sıra, kendi adınıza kötü adlandırma kurallarından muzdarip olan proje gibi geliyor. Ve bu gerçek sorunları çözmek yerine, belirtilerden birinin üzerine yara bandı eklemeyi denediler ve tam nitelikli sınıf isimleri istiyorlar. Bunu yanlış yönlendirilmiş bir yaklaşım olarak sınıflandırmanın güvenli olduğunu düşünüyorum.
Kötü adlandırılmış sınıflar olduğu ve yeniden canlandırıcı olamayacağı varsayılırsa, doğru cevap Visual Studio IDE'yi tam olarak kullanabilmektir. Muhtemelen VS PowerTools paketi gibi bir eklenti eklemeyi düşünün. Daha sonra, bakarken AtrociouslyNamedClass()
sınıf adına tıklayabilirim, F12 tuşuna basın ve ne yapmaya çalıştığını daha iyi anlamak için doğrudan sınıf tanımına alın. Aynı şekilde, kodda şu anda kullanmak zorunda kalan tüm noktaları bulmak için Shift-F12 tuşunu tıklayabilirim AtrociouslyNamedClass()
.
Dış takım endişeleriyle ilgili olarak - yapılacak en iyi şey onu durdurmaktır. Parçacıklar neye atıfta bulunacaklarını hemen belirlemezlerse ileri ve geri e-postayla göndermeyin. Visual Studio'nun dışındaki diğer araçları kullanmayın, çünkü bu araçlar ekibinizin ihtiyaç duyduğu kodu çevreleyen istihbarat içermez. Notepad ++ harika bir araçtır, ancak bu görev için uygun değildir.
Bu yüzden size sunulan üç özel gerekçeyle ilgili değerlendirmenize katılıyorum. Söylendiğini düşündüğüm şey, “Bu projede ele almayan / başaramayacağımız sorunların altındayız ve bu onları 'nasıl düzelttiğimizdir' dedi. Ve bu açıkça, takım içinde sizin için kırmızı bayraklar olarak hizmet edebilecek daha derin konulara değiniyor.