( Temiz Kod okumamıştım ve fazla Java bilmiyorum.)
Her biri açıkça tanımlanmış bir sorumluluğu olan çok sayıda küçük varlık yaratma fikrini ad alanlarına uygulamak mantıklı mıdır?
Evet, aynı çoklu sınıflara ve çoklu fonksiyonlara yeniden yapılanmada olduğu gibi.
Küçük bir grup ilgili sınıflar her zaman bir isim alanına sarılmalı mıdır?
Aslında cevap vermeden: evet, en azından bir üst seviye ad alanı kullanmalısınız. Bu, projeye, organizasyona veya istediğiniz her şeye bağlı olabilir, ancak birkaç genel ad kullanmak ad çakışmalarını azaltacaktır. Altındaki her şeyi gruplamak için tek bir ad alanı yalnızca bir genel ad tanıtır. (Harici "C" işlevlerinin haricinde, ancak bu, C'nin birlikte çalışabilirliği nedeniyledir ve yalnızca diğer dış "C" işlevlerini etkiler.)
Küçük bir ilgili sınıflar grubu, kendilerine ayrılmış bir ad alanına sarılmalı mıdır? Muhtemelen. Özellikle, kendinizi bu sınıflar üzerinde ortak bir önek kullanarak bulursanız - FrobberThing, FrobberThang, FrobberDoohickey - Bir ad alanını düşünmelisiniz - frobber :: Thing vb. Bu, eğer daha büyük bir projenin parçasıysa, kök ad alanınız veya başka bir ad alanın altında olacaktır.
Bu, çok sayıda minik sınıfa sahip olmanın karmaşıklığını yönetmenin yolu mu, yoksa çok sayıda isim alanı yönetmenin maliyeti yasaklayıcı mı olacak?
Yukarıdaki önek adlarına bakıldığında, FrobberThing'den frobber :: Thing'i yönetmek zor değildir. Belgeleme ve kod tamamlama gibi bazı araçlarla daha kolay olabilir. ADL ile bir fark var, ancak bu sizin lehinize işe yarayabilir: ilişkili isim alanlarındaki daha az sayıda isim, ADL'nin daha kolay anlaşılmasını sağlar ve belirli isimleri bir isim alanına ya da başka birine enjekte etmek için bildirimler kullanarak koyabilirsiniz.
Ad alanı takma adları, belirli bir bağlamda daha uzun bir ad alanı için daha kısa bir ad kullanmanıza izin verir;
void f() {
namespace CWVLN = Company_with_very_long_name; // Example from the standard.
// In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
namespace fs = boost::filesystem; // Commonly used.
}
Çeşitli kütüphaneler için tek bir kök ad alanına sahip, artır ve sonra birçok alt ad alanını içeren Boost'u düşünün - boost :: asio, boost :: io, boost :: filesystem, boost :: tuples, vs. Bazı isimler kök isim alanına "terfi" edilir:
Tüm tanımlar namespace :: boost :: tuples içindedir, ancak en yaygın isimler bildirimler kullanılarak namespace :: boost'a kaldırılmıştır. Bu isimler: tuple, make_tuple, kravat ve olsun. Ayrıca, ref ve cref doğrudan :: boost ad alanının altında tanımlanır.
"Gerçek" modülleri olan dillerden en büyük fark, yuvalanmış isimleri tanımlamak için fazladan ve özel bir çaba göstermediğiniz sürece nasıl çalıştığıdır, çünkü düz olan bir yapı kullanmak ne kadar yaygındır.