Hem "ad alanı" hem de "modül" terminolojisini aşırı yüklemeyi seçtiğiniz anlaşılıyor. Tanımlarınıza uymadıklarında şeyleri "dolaylı" olarak görmeniz sürpriz olmamalıdır.
C # dahil ad alanlarını destekleyen çoğu dilde, ad alanı bir modül değildir. Bir ad alanı, isimleri kapsamasının bir yoludur. Modüller bir kapsam belirleme davranışıdır.
Genel olarak, .Net çalışma zamanı bir modül fikrini desteklerken (örtük olarak kullandığınızdan biraz farklı bir tanımla), nadiren kullanılır; Ben sadece SharpDevelop inşa projelerde kullanılan gördüm, çoğunlukla farklı dillerde inşa modüller tek bir DLL inşa edebilirsiniz. Bunun yerine, dinamik olarak bağlı bir kitaplık kullanarak kitaplıklar oluşturuyoruz.
C # 'da, ad alanları, hepsi aynı ikili dosyada olduğu sürece herhangi bir "dolaylı katman" olmadan çözümlenir; gereken herhangi bir dolaylama, çok düşünmeniz gerekmeyen derleyici ve bağlayıcıların sorumluluğundadır. Birden çok bağımlılığı olan bir proje oluşturmaya başladığınızda, harici kitaplıklara başvurursunuz. Projeniz bir dış kitaplığa (DLL) başvurduğunda, derleyici onu sizin için bulur.
Şemada, harici bir kitaplık yüklemeniz gerekiyorsa (#%require (lib "mylib.ss"))
, hatırladığım gibi, ilk gibi bir şey yapmanız veya doğrudan yabancı işlev arabirimini kullanmanız gerekir. Harici ikili dosyalar kullanıyorsanız, harici ikili dosyaları çözmek için aynı miktarda işiniz vardır. Büyük olasılıkla, çoğunlukla sizden soyutlayan bir Şema tabanlı şim var, ancak üçüncü taraf bir kütüphane ile kendi entegrasyonunuzu yazmak zorunda kalırsanız, "yüklemek için biraz iş yapmanız gerekecek" " kütüphane.
Ruby'de, Modüller, Ad Alanları ve Dosya Adları aslında sandığınızdan çok daha az bağlantılıdır; LOAD_PATH işleri biraz karmaşık hale getirir ve Modül bildirimleri her yerde olabilir. Python muhtemelen Şema'da gördüğünüz şekilde bir şeyler yapmaya daha yakındır, ancak C'deki üçüncü taraf kütüphaneleri hala (küçük) bir kırışıklık ekler.
Ayrıca, Ruby, Python ve Lisp gibi dinamik olarak yazılan diller genellikle statik olarak yazılan dillerle "sözleşmeler" ile aynı yaklaşıma sahip değildir. Dinamik olarak yazılan dillerde, genellikle yalnızca kodun belirli yöntemlere yanıt vereceği bir tür "Centilmenlik anlaşması" oluşturur ve sınıflarınız aynı dili konuşuyor gibi görünüyorsa, her şey yolunda demektir. Statik olarak yazılan diller, derleme zamanında bu kuralları uygulamak için ek mekanizmalara sahiptir. C # 'da, böyle bir sözleşme kullanmak, bu arabirimlere en azından orta derecede kullanışlı bağlılık garantisi vermenizi sağlar; Ruby veya Scheme'de, çalışma zamanında çalışan testler yazarak bu sözleşmeleri doğrularsınız.
Bir yöntem çağırma işlemi çift dağıtım gerektirmediğinden, bu derleme zamanı garantilerinden ölçülebilir bir performans avantajı vardır. Bu avantajları Lisp, Ruby, JavaScript veya başka bir yerde elde etmek için, şimdi uzman VM'lerde tam zamanında statik olarak derleme sınıflarının biraz egzotik mekanizmaları olan şey gereklidir.
C # ekosisteminin hala nispeten olgunlaşmamış desteğe sahip olduğu bir şey, bu ikili bağımlılıkların yönetimi; Java, gerekli tüm bağımlılıklara sahip olduğunuzdan emin olmak için birkaç yıldır Maven'e sahipken, C #, dosyaları stratejik olarak vaktinden önce doğru yere yerleştirmeyi içeren oldukça ilkel bir MAKE benzeri yaklaşıma sahiptir.