Şirin önleme adlandırma sınıflarından ad alanlarından kaçınma problemleri


39

Şirin isimlendirme terimini buradan çektim (sayı 21). Sorun tanıdık değil kimseyi kurtarmak için, "Bir ile bitirmek böylece, Şirin adlandırma ortak bir önek ile ilgili sınıflar, değişkenler, vb bir demet prefixing eylemidir SmurfAccountViewbir geçer SmurfAccountDTOiçin SmurfAccountController" vb

Buna genel olarak duyduğum çözüm, bir şirin ad alanı yapmak ve şirin önekleri bırakmaktır. Bu genellikle bana iyi hizmet etti, ancak iki sorunla karşılaşıyorum.

  1. ConfigurationSınıflı bir kütüphane ile çalışıyorum . Bu adlandırılan olabilirdi WartmongerConfigurationama Wartmonger ad alanında, bu yüzden sadece deniyor Configuration. Aynı şekilde Configurationçağrılabilecek bir sınıfa da sahibim SmurfConfiguration, ancak bunun için Şirin olmalı. Benim kodunda yer vardır Smurf.Configurationyanında görünür Wartmonger.Configurationve tam isimlerini yazarak aksak ve kod az okunabilir hale getirir. Bir ile başa çıkmak daha güzel olurdu SmurfConfiguration(benim kodum olsaydı ve bir kütüphane değil) WartmongerConfiguration.

  2. ServiceŞirin ad alanımda denilen bir sınıf var SmurfService. ServiceBir olan cephe Smurf işlerini çalışan bir kompleks Şirin kütüphanede üstünde. Şirin bir önek olmadan çok inanılmaz bir genel SmurfServiceçünkü daha iyi bir isim gibi görünüyor Service. Bunun SmurfServicezaten genel, işe yaramaz bir isim olduğunu kabul edebilirim ve şirinleri uzaklaştırmak bunu daha belirgin hale getirdi. Ama isimlendirilebilirdi Runner, Launchervb. Ve hala ne “ SmurfLauncherne yaptığını bilmiyorum Launcher, ama ne yaptığını biliyorum SmurfLauncher. Yaptıklarının Smurf.Launcher, tıpkı kadar belirgin olması gerektiğini savunabilirsin.Smurf.SmurfLauncher, ama `Smurf.Launcher 'ın şirinleri başlatan bir sınıftan ziyade kurulumla ilgili bir tür sınıf olduğunu görebiliyordum.

Bunlardan biriyle başa çıkmak için açık ve kapalı bir yol varsa, bu harika olurdu. Olmazsa, sıkıntılarını hafifletmek için bazı yaygın uygulamalar nelerdir?


3
Smurf.LauncherŞirinleri fırlatıyor mu , yoksa fırlatıyor mu SmurfJob? Belki çağrılabilirdi Smurf.JobLauncher?
Blorgbeard

2
Sınıf XService, XManager, vb. Adlandırmak için kod kokusu. Bunlar bir şey ifade etmiyor. Bir Util gibi. Dosya adlarını gözden geçiriyorsanız, içeride herhangi bir şey olabilir veya oradan eksik olabilir. İçeriye bakmadıkça bilmenin yolu yok. Bunu SmurfService'den tamamen başka bir şeye yeniden adlandırırdım.
Daniel Kaplan

1
Aslında SmurfJobs'yi başlatıyor veya teknik olarak Smurf belgelerinin dili ile tutarlı olmaları için çalıştırıyor. Bunun ve diğer cevapların ışığında, adını SmurfServicedeğiştireceğim SmurfJobRunner. Görünüşe göre 1 numara beklediğim gibi hiçbir dilde agnostik en iyi çözünürlüğe sahip değil. Ile gitmek SmurfConfigurationdoğru çağrı olacağını örnekleri görebilirsiniz , ama benim durumumda Configurationbile güçlük ile bile en iyisi olduğunu düşünüyorum Wartmonger.Configuration.
Daniel Koverman

6
Hem Wartmongers'ı hem de Şirinleri yapılandırmayı önemseyen tek bir sınıfa sahip olduğunuzu anlamaya çalışıyorum.
Donal Fellows,

Neden Smurf.Configurationve SmurfConfigurationfarklı hissediyor? Elbette bu fazladan değil, değil mi? ( ConfigBoy uzunluğu sorun ise kısalır .) Sorunu olmayan bir sorunu Smurf.Configurationvar mı SmurfConfiguration?
Pablo H,

Yanıtlar:


16

Bazı iyi puanlar yükseltiyorsun.

  1. Yinelenen sınıfların olması ile ilgili olarak, C # 'daki sınıfların diğer adını kullanabilirsiniz. Örneğin kullanın StackOverflow'ta bu yazıyausing ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme; bakın . Programlama dilinizi belirtmediniz ancak yazdıklarınızdan çıkardım. Böylece, iki farklı projeyle uğraşıyorsanız, onları iki adla takma adlandırabilir ve her iki sınıfı da tüketirken belirsizliği serbest bırakabilirsiniz .SmurfConfigurationWartmongerConfiguration

  2. Bir hizmet harici uygulamalara maruz kaldığından, hizmeti uygulama adınızla markalamakta hiçbir sorun görmüyorum, bu durumda, bu durumda SmurfServicealıcı uygulamadaki hizmet gruplarını gerçekten dezavantajlı kılacağı için geçerli olacaktır.

Bu adlandırma tarzını önlemek için ad alanlarının kullanılması gerektiğini düşünüyorum. Kodu okurken ve bir sınıfın MyCompanyMyProductMyAreaClassName'i okumadan ne olduğunu yüz değerinde görmeyi zorlaştırır. Aliasing tekniğini kullanmak gerektiğinde belirsizliği azaltmanıza olanak sağlar. Karmaşıklığı isminize eklemeniz gerektiğini düşündüğüm tek zaman, # 2'de işaret ettiğim gibi, insanların ne zaman hizmet alacağı. Bu, bu tür bir adlandırma tarzına sahip olmanın tam anlamıyla mantıklı olduğu yerdir, çünkü tüketici çeşitli hizmetlere sahipse, belirsizliği tüketmek kafa karıştırıcı olabilir.


5
takma adlar işleri karıştırır. Smurf.Service yerine şimdi SmurfService = Smurf.Service var. Öyleyse, en başta, ilk başta işin adı olarak SmurfService'e sahip olabilirsiniz. Bir yeri var, ama bu özel konu için değil. Bununla birlikte, muhtemelen cevabı olmayan bir sorunun en iyi cevabı :)
gbjbaanb

Benim içimdeki C # sorumla ortaya çıktı, ama aslında şu anda java ve org.apache.smurfville.wartmonger.configuration. Bu ne yazık ki takma adları dışlar. 2 sağlam bir nokta, bu yüzden Smurf'u Hizmet için markalaştıracağım.
Daniel Koverman

25

Ad alanlarının amacı, aynı addaki sınıfları farklı kütüphanelerden çarpışmadan alabilmenizdir. Aynı adlandırılmış sınıfı her ikisinden de kullanmanız gerektiğinde, bir veya her ikisini de ad alanı kapsamıyla ön ekleyerek belirsizliği gidermeniz gerekir.

Bununla birlikte, eğer Smurf size sınıfla ilgili belirli bir şey söylerse, bir grup Smurf sınıfına sahip olmak o kadar da kötü değildir. Sınıf adları, sınıfın ne yaptığı hakkında size bazı bilgiler verecek kadar açıklayıcı olmalıdır.

      Session
       ^   ^
      /     \
DBSession   HttpSession

Benzer şekilde, DBSessionbir DBRequestnesne geri dönen bir DBResponsenesneyi alabilir. Aynı HttpSessionzamanda üzerinde çalışabilir HttpRequestve HttpResponsenesneler.

Bunlar bir amaç için Şirin sınıflarıdır.

Onlar yaşabileceğinize MyCompanyad ancak MyCompanyHttpSessionve MyCompanyDBSessiondaha önce olduğundan daha size başka bilgi vermez. Bu durumda Şirin'i bırakıp bir ad alanı yapın.

MyCompany.HttpSession

3

Daha önce bu aynı kafa karışıklığına karşı koştum ve bu genellikle gerçekten isminin bir parçası olduğu türünü dahil etmemizle ilgili bir soru.

Sen söz SmurfConfigurationve WartmongerConfigurationyapılandırmaları potansiyel türlü olarak. Sıfatını (türünü) kendi ad alanına kaldırdığınızı ve böylelikle geride bıraktığınız şeyin sadece vanilya olduğunu belirtirsiniz Configuration. Bunu yapmaktan kaçınırdım.

Çilekli dondurmanın çilekli isim alanındaki ve aynı şekilde çikolata içeren bir dondurma olduğuna karar vermek gibi bir şey, ama olan şey, kimliğini veren sıfattan kendinden ayrıldığın. Çilek kategorisinde dondurma değil. Çilekli dondurma - bir çeşit dondurma.

Uygulamanızda, Strawberry.IceCreamsınıfı içe aktardığınızı ve ardından doğrudan başlatmaya başladığınızı düşünelim IceCream.

var ic = new IceCream(); //actually I'm strawberry ice cream

Başka bir IceCreamsınıfa geçtiğiniz sürece, bu iyi ve güzel görünebilir . Şimdi bir şekilde aralarında ayrım yapmak zorunda kalmanın asıl sorununa geri dönüyorsunuz, ki bu problemlidir. Baştan beri istediğin şeydi:

var sic = new StrawberryIceCream();
var cic = new ChocolateIceCream();

Üçüncü şahıslar arasında tesadüfen aynı kavramları kütüphanelerinde temsil edebilecek potansiyel çatışmalardan kaçınmak için isim alanları bırakılmalıdır. Ancak bir geliştirici bir kütüphane veya proje oluşturduğunda, her bir konsepti benzersiz şekilde adlandırmalı ve ad alanlarını yalnızca organizasyon için klasörler olarak kullanmalıdır. Genellikle klasörün adı düzenlediği kavramlar adına bulunur ve sorun olmaz.


2

Bir grup ders için ortak bir ön ekiniz varsa, muhtemelen kendi ad alanlarına gitmeyi hak ettikleri kesinlikle iyi bir kuraldır. Sorunla başa çıkmak için, iki ad alanından benzer şekilde adlandırılmış sınıfları kullanmanız gerektiğinde:

1) Ad alanlarını takma adlar, kısa ve noktaya değinmeme rağmen, herhangi bir doğal kısaltma, belki de sadece 1 harf:

using Sm = Smurf;
using W = Wartmonger;

Ardından, kullanıldıkları yerde daima önek verin ve örnekleri uygun şekilde adlandırın:

Sm::Configuration smConf; 
W::Configuration wConf;

2) Diğer cevaplarda önerildiği gibi sınıfın diğer adı.

using SmConf = Smurf.Configuration;

3) Kontrol ettiğiniz herhangi bir kütüphane, 'Konfigürasyon' terimini kullanmamaya dikkat edin. Eş anlamlılar sözlüğünü kullanın: örneğin 'Ayarlar', 'Model', 'Parametreler'. Yine de bağlam için daha anlamlı olabilir: Örneğin, eğer Smurf bir çeşit sayısal analiz modülü olsaydı, belki 'Parametreler' yazdıysanız konfigürasyonu için daha iyi olurdu. Diğer ad alanlarına karıştırıldığında bile benzersizliği sağlayan benzersiz isimler bulmak için bir modülün içeriğiyle ilgili özel kelimeleri kullanın. Bunun OP soru 2'ye bir cevap olabileceğini düşünüyorum.

4) Yeniden yapılandırma kodu, böylece yapılandırma kullanımını iki farklı yerden karıştırmanız gerekmez. Bunun detayları size kalmış.

5) Sınıfınıza geçmeden önce iki konfigürasyonu bir tanede birleştirin. Temsil etmek için kombine bir conf sınıfı kullanın:

struct Conf {
    SmurfConfiguration smurf;
    WartmongerConfiguation wart;
}

Kısa üye değişken isimleri şimdi sınıf / isim alanını takma adlarla aynı şeyi başarıyor.


0

Sizi rahatsız eden isme bir nokta eklemenin garip görünüyor.

Wartmonger.Configuration configuration = Wartmonger.Configuration .new();

// vs

WartmongerConfiguration configuration = WartmongerConfiguration.new();

Her ikisi de Smurfve Wartmongeryapılandırmalar bir yerde bir arada kullanılırsa, ancak ayrı olarak birden çok yerde kullanılırsa - ad alanı kesinlikle iyi bir yaklaşımdır.

Ad alanına sahip olmak, iç kodda "temiz" adlar kullanma olanağını verir; burada iç kodun SmurfConfigurationiçini kullanarak öneklerle sonlanırsanız SmurfService, bu kod her açıldığında can sıkıcı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.