Çözümdeki klasörler ad alanıyla eşleşmeli mi?


129

Çözümdeki klasörler ad alanıyla eşleşmeli mi?

Ekiplerim projelerinden birinde, projede birçok alt klasörü olan bir sınıf kitaplığımız var.

Proje Adı ve Ad alanı: MyCompany.Project.Section.

Bu proje içinde, ad alanı bölümüyle eşleşen birkaç klasör vardır:

  • Klasörün ad alanında Vehiclessınıfları varMyCompany.Project.Section.Vehicles
  • Klasörün ad alanında Clothingsınıfları varMyCompany.Project.Section.Clothing
  • vb.

Aynı projenin içinde başka bir haydut klasör var

  • Klasörün ad alanında BusinessObjectssınıfları varMyCompany.Project.Section

Klasörlerin "organizasyonel kolaylık" için yapıldığı buna benzer birkaç durum vardır.

Sorum şu: Standart nedir? Sınıf kitaplıklarında klasörler genellikle ad alanı yapısıyla eşleşiyor mu yoksa karma bir torba mı?


9
Not: ReSharper, ad alanlarının klasör hiyerarşisiyle eşleşmemesi durumunda şikayet edecektir.
Fred

Yanıtlar:


77

Ayrıca, bir klasöre sınıf eklemek için yerleşik şablonları kullanırsanız, bunun varsayılan olarak klasör hiyerarşisini yansıtan bir ad alanına yerleştirileceğini unutmayın.

Sınıfları bulmak daha kolay olacak ve bu tek başına yeterince iyi nedenler olmalıdır.

Takip ettiğimiz kurallar:

  • Proje / derleme adı, .dll sonu dışında kök ad alanıyla aynıdır
  • Yukarıdaki kuralın tek istisnası, .Core biten bir projedir, .Core çıkarılır.
  • Klasörler, ad alanlarına eşittir
  • Dosya başına bir tür (sınıf, yapı, numaralandırma, temsilci vb.) Doğru dosyayı bulmayı kolaylaştırır

1
İçin 1 "Yukarıdaki kuralın tek istisnası, .Core sıyrılıp bir .Core biten bir projedir" yalnız. Bir MyProject.Core.dllmeclisim var ve tüm sınıflar ile başlıyor MyProject.Core. .CoreSoneki çıkarmak çok daha mantıklı.
Luiz Damim

2
Ekleyebileceğim bir başka istisna da İstisnalar'dır. İstisnalara zaten 'İstisna' eklenmiştir, bu nedenle ek bir ad alanı gereksizdir. Ayrıca, ad alanının bir kısmının Exception sözcüğüyle olması dağınık olabilir (System.Exception kafa karıştırıcı olabilir). Ancak, bunları klasörler halinde düzenlemek oldukça yararlıdır.
phillipwei

55

Hayır.

Hem single (ben) hem de bir geliştirici ekibi ile küçük ve büyük projelerde her iki yöntemi de denedim.

En basit ve en verimli yolun proje başına tek bir ad alanına sahip olmak olduğunu ve tüm sınıfların bu ad alanına gittiğini buldum. Ardından, sınıf dosyalarını istediğiniz proje klasörlerine koymakta özgürsünüz. Yalnızca tek bir ad alanı olduğundan, her zaman dosyaların üstüne using ifadeleri eklemekle ilgili bir karışıklık yoktur.

Kaynak dosyaları klasörler halinde düzenlemek önemlidir ve bence tüm klasörler bunun için kullanılmalıdır. Bu klasörlerin ad alanlarıyla da eşleşmesini şart koşmak gereksizdir, daha fazla çalışma yaratır ve eklenen yük düzensizliği teşvik ettiği için aslında organizasyon için zararlı olduğunu fark ettim.

Örneğin bu FxCop uyarısını alın:

CA1020: Birkaç türe sahip ad alanlarından kaçının
nedeni: Genel ad alanı dışındaki bir ad alanı beşten az tür içerir https://msdn.microsoft.com/en-gb/library/ms182130.aspx

Bu uyarı, yeni bir klasör oluşturmayı gerekçelendirmek için dört benzer sınıfınız olana kadar yeni dosyaların genel bir Project.General klasörüne veya hatta proje köküne atılmasını teşvik eder. Bu hiç olacak mı?

Dosyaları Bulmak

Kabul edilen yanıt, "Sınıfların bulunması daha kolay olacak ve bu tek başına yeterince iyi nedenler olmalı" diyor.

Cevabın, önerdiğim şeyden ziyade, tek bir ad alanına sahip bir proje olduğunu önerdiğimden ziyade, bir projede klasör yapısıyla eşleşmeyen birden çok ad alanına atıfta bulunduğundan şüpheleniyorum.

Her durumda, ad alanından bir sınıf dosyasının hangi klasörde olduğunu belirleyemezken, Visual Studio'daki Tanıma Git veya arama çözümü gezgini kutusunu kullanarak onu bulabilirsiniz. Ayrıca bence bu gerçekten büyük bir sorun değil. Geliştirme zamanımın% 0,1'ini bile optimize etmeyi haklı çıkarmak için dosya bulma sorununa harcamıyorum.

İsim çatışmaları

Elbette birden çok ad alanı oluşturmak, projenin aynı ada sahip iki sınıfa sahip olmasına izin verir. Ama bu gerçekten iyi bir şey mi? Bunun mümkün olmasına izin vermemek belki daha mı kolay? Aynı ada sahip iki sınıfa izin vermek, işlerin% 90'ının belirli bir şekilde çalıştığı ve sonra aniden özel bir durumunuzun olduğunu fark ettiğiniz daha karmaşık bir durum yaratır. Ayrı ad alanlarında tanımlanmış iki Rectangle sınıfınız olduğunu varsayalım:

  • sınıf Project1.Image.Rectangle
  • sınıf Project1.Window.Rectangle

Bir kaynak dosyanın her iki ad alanını da içermesi gerektiği bir soruna ulaşmak mümkündür. Şimdi bu dosyanın her yerine tam ad alanını yazmanız gerekiyor:

var rectangle = new Project1.Window.Rectangle();

Veya bazı kötü kullanım ifadeleriyle uğraşın:

using Rectangle = Project1.Window.Rectangle;

Projenizde tek bir isim alanıyla farklı bir isim bulmak zorunda kalıyorsunuz ve daha açıklayıcı isimler şu şekilde:

  • sınıf Project1.ImageRectangle
  • sınıf Project1.WindowRectangle

Ve kullanım her yerde aynıdır, bir dosya her iki türü de kullandığında özel bir durumla uğraşmanıza gerek yoktur.

ifadeleri kullanma

using Project1.General;  
using Project1.Image;  
using Project1.Window;  
using Project1.Window.Controls;  
using Project1.Shapes;  
using Project1.Input;  
using Project1.Data;  

vs

using Project1;

Kod yazarken her zaman ad alanı eklemek zorunda kalmama kolaylığı. Gerçekten gereken zaman değil, bunu yapmak zorunda kalmanın ve sadece dosyaları çok sayıda kullanım ifadeleriyle doldurmanın akışındaki kesinti - ne için? Buna değer mi?

Proje klasör yapısını değiştirme

Klasörler ad alanlarına eşlenirse, proje klasörü yolu her kaynak dosyaya etkili bir şekilde sabit kodlanır. Bu, projedeki herhangi bir dosya veya klasörün yeniden adlandırılması veya taşınması için gerçek dosya içeriğinin değiştirilmesi gerektiği anlamına gelir. Hem o klasördeki dosyaların ad alanı bildirimi hem de o klasördeki sınıflara başvuran diğer bir grup dosyadaki ifadelerin kullanılması. Değişikliklerin kendileri araçlarla önemsiz olsa da, genellikle sınıfları bile değişmemiş birçok dosyadan oluşan büyük bir kaydetme ile sonuçlanır.

Projede tek bir ad alanıyla, proje klasör yapısını, herhangi bir kaynak dosyanın kendisi değiştirilmeden istediğiniz gibi değiştirebilirsiniz.

Visual Studio, yeni bir dosyanın ad alanını, oluşturulduğu proje klasörüne otomatik olarak eşler

Ne yazık ki, ad alanını düzeltme zahmetinin onlarla uğraşmaktan daha az olduğunu düşünüyorum. Ayrıca Add-> New kullanmak yerine mevcut bir dosyayı kopyalayıp yapıştırma alışkanlığı edindim.

Intellisense ve Nesne Tarayıcısı

Büyük projelerde birden çok ad alanı kullanmanın en büyük yararı, sınıfları bir ad alanı hiyerarşisinde görüntüleyen herhangi bir araçta sınıfları görüntülerken fazladan organizasyona sahip olmaktır. Hatta dokümantasyon. Açıkçası, projede yalnızca bir ad alanına sahip olmak, tüm sınıfların kategorilere ayrılmak yerine tek bir listede görüntülenmesiyle sonuçlanır. Bununla birlikte, kişisel olarak, bunun eksikliğinden dolayı asla şaşırmadım veya gecikmedim, bu yüzden birden fazla ad alanını haklı çıkarmak için yeterince büyük bir fayda görmüyorum.

Büyük bir halka açık sınıf kitaplığı yazıyor olsaydım , muhtemelen projede birden çok ad alanı kullanırdım, böylece montaj takım ve belgelerde düzgün görünüyordu.


30
Dürüst olmak gerekirse bu, önerildiğini duyduğum en kabus çözümlerinden biri. Küçük bir merhaba dünya projeleri üzerinde çalışıyorsanız, bu tavsiye işe yarar, ancak 1000'den fazla .cs dosyanız olduğunu hayal edin. O kadar çok soruna neden olur ki nereden başlayacağımı bilmiyorum.
BentOnCoding

10
"ancak 1000'den fazla .cs dosyanız olduğunu düşünün". Bu büyüklükteki projelerde tek bir isim alanıyla çalıştım. Bu iyi. Ne tür bir felaket olacağını düşünüyorsunuz?
Weyland Yutani

14
Düşünmek için +1. Ad alanlarımı proje başına bir adıma indirmeye hazır olduğumu sanmıyorum, ancak geniş bir çerçeve üzerinde çalıştıktan sonra ifadelerin kullanım sayısını azaltmak ve genişletme yöntemlerinin keşfedilebilirliğine yardımcı olmak için ad alanlarının sayısını azaltmayı araştırıyorum. Bu cevabın düşünceye iyi bir yiyecek verdiğini düşünüyorum. Teşekkürler.
Lee Gunn

3
@WeylandYutani Geç kaldığımı biliyorum ama bu cümlenin you can find it by using Go To Definition or the search solution explorer box in Visual Studioher zaman doğru olmadığını belirtmem gerekiyor . Çok fazla miras ve Arayüz fısıldayan deneyin ... doğru dosyayı bulmada bol şans.
Emmanuel M.

11
Bu, gördüğüm en iyi tavsiyelerden biridir. Ad alanları yalnızca çatışma çözümü içindir, sınıfları düzenlemek için değildir. Ad alanlarını yalnızca bunları kullanmanın mantıklı olduğu yerlerde kullanın, örneğin projenizi kullanan diğer projelerle adlandırma çakışmaları olmasını beklediğiniz, belirli ad alanlarının dahil edilmesine veya ifadelerin kullanılmasına izin vermemesine izin verin. Sık kullanılan 3 veya 4 veya daha fazla ad alanına sahip bir projeye sahip olmak korkunç, çünkü her zaman eklemeniz, eklemeniz ve eklemeniz gereken saçma sayıda ifadeyle sonuçlanır. Projelerinizi parçalara ayırın.
Triynko

31

Bence .NET içindeki standart, bunu mümkün olduğunda yapmaya çalışmaktır, ancak sadece buna sıkı bir kural olarak uymak için gereksiz derin yapılar oluşturmamaktır. Projelerimden hiçbiri ad alanı == yapı kuralına% 100 uymuyor, bazen bu tür kurallardan kopmak daha temiz / daha iyi.

Java'da başka seçeneğiniz yok. Buna teoride neyin işe yaradığına karşı pratikte neyin işe yaradığına dair klasik bir vaka derim.


1
"Bir şeyin kendi ad alanında olmasını gerçekten istediğinizde yapın" derdim. Bilinçli bir karar olmalı. Projeleriniz uygun şekilde izole edilmişse proje başına bir ad alanı olmalıdır. Sınıfınız bir ad alanı içindeyse, bu ad alanına sahip bir klasörde VEYA en az ad alanı kadar belirli bir alt klasör konumunda olmalıdır . Car.Ford.Fusion gibi bir sınıf (Car.Ford tek ad alanınızsa), Car / Ford gibi bir klasörde VEYA Car / Ford / Sedans gibi daha derin bir klasörde bulunmalıdır, öyle ki klasör en az ad alanı kadar özeldir. Sadece Car / Unrelated / Ford'a koymayın; bu kafa karıştırıcı.
Triynko

25

@lassevk: Bu kurallara katılıyorum ve ekleyeceğim bir tane daha var.

Sınıfları iç içe geçirdiğimde, onları yine de dosya başına bir tane olacak şekilde ayırıyorum. Bunun gibi:

// ----- Foo.cs
partial class Foo
{
    // Foo implementation here
}

ve

// ----- Foo.Bar.cs
partial class Foo
{
    class Bar
    {
        // Foo.Bar implementation here
    }
}

5

Evet derdim.

İlk olarak, ad alanlarını takip ederek gerçek kod dosyalarını bulmak daha kolay olacaktır (örneğin, birisi size çıplak bir istisna çağrısı yığını e-posta gönderdiğinde). Klasörlerinizin ad alanlarıyla senkronize edilmesine izin verirseniz, büyük kod tabanlarındaki dosyaları bulmak yorucu hale gelir.

İkinci olarak, VS, kendi ana klasör yapısının aynı ad alanına sahip klasörlerde oluşturduğunuz yeni sınıflar oluşturur. Buna karşı yüzmeye karar verirseniz, yeni dosyalar eklerken günlük yapmanız gereken bir tesisat işi daha olacaktır.

Tabii ki, xis klasörü / ad alanı hiyerarşisinin ne kadar derin olduğu konusunda ihtiyatlı olunması gerektiğini söylemeye gerek yok.


4

Evet olmalı, aksi takdirde kafa karışıklığına yol açar.


2

Standart nedir?

Resmi bir standart yoktur, ancak geleneksel olarak klasörden ad alanına eşleme modeli en yaygın şekilde kullanılır.

Sınıf kitaplıklarında klasörler genellikle ad alanı yapısıyla eşleşiyor mu yoksa karma bir torba mı?

Evet, çoğu sınıf kitaplığında, klasörler organizasyon kolaylığı için ad alanıyla eşleşir.

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.