ดูเหมือนว่าคุณกำลังเลือกที่จะใช้คำศัพท์มากเกินไปทั้ง "namespace" และ "module" ไม่น่าแปลกใจเลยที่คุณเห็นว่าสิ่งนั้นเป็น "ทางอ้อม" เมื่อสิ่งเหล่านั้นไม่ตรงกับคำจำกัดความของคุณ
ในภาษาส่วนใหญ่ที่รองรับเนมสเปซรวมถึง C #, เนมสเปซไม่ใช่โมดูล เนมสเปซเป็นวิธีการกำหนดขอบเขตชื่อ โมดูลเป็นวิธีการกำหนดขอบเขตพฤติกรรม
โดยทั่วไปขณะที่. Net สนับสนุนแนวคิดของโมดูล (ด้วยคำจำกัดความที่แตกต่างกันเล็กน้อยกว่าที่คุณใช้โดยปริยาย) มันค่อนข้างใช้งานบ่อย ฉันเพิ่งเห็นว่ามันใช้ในโครงการที่สร้างขึ้นใน SharpDevelop ส่วนใหญ่เพื่อให้คุณสามารถสร้าง DLL เดียวจากโมดูลที่สร้างขึ้นในภาษาต่างๆ แต่เราสร้างห้องสมุดโดยใช้ห้องสมุดที่เชื่อมโยงแบบไดนามิก
ใน C # เนมสเปซจะแก้ปัญหาโดยไม่มี "เลเยอร์ของการอ้อม" ใด ๆ ตราบใดที่มันอยู่ในไบนารีเดียวกัน ความต้องการทางอ้อมใด ๆ เป็นความรับผิดชอบของคอมไพเลอร์และลิงเกอร์ที่คุณไม่ต้องคิดมาก เมื่อคุณเริ่มสร้างโครงการที่มีการขึ้นต่อกันหลายครั้งคุณจะอ้างอิงไลบรารีภายนอก เมื่อโครงการของคุณทำการอ้างอิงไปยังไลบรารีภายนอก (DLL) คอมไพเลอร์จะค้นหาให้คุณ
ใน Scheme หากคุณต้องการโหลดไลบรารี่ภายนอกคุณต้องทำอะไรอย่าง(#%require (lib "mylib.ss"))
ก่อนหรือใช้อินเทอร์เฟซฟังก์ชั่นต่างประเทศโดยตรงตามที่ฉันจำได้ หากคุณใช้ไบนารีภายนอกคุณมีจำนวนงานเท่ากันเพื่อแก้ไขไบนารีภายนอก โอกาสที่คุณจะใช้ห้องสมุดเป็นส่วนใหญ่จึงมักใช้ว่ามี shim-based shim ที่เป็นนามธรรมซึ่งมาจากคุณ แต่ถ้าคุณต้องเขียนการรวมของคุณเองกับไลบรารี่ของบุคคลที่สามคุณจะต้องทำงานบางอย่างเพื่อ "โหลด " ห้องสมุด.
ใน Ruby, Modules, Namespaces และ File Names นั้นมีการเชื่อมต่อน้อยกว่าที่คุณคิด LOAD_PATH ทำให้สิ่งต่าง ๆ ซับซ้อนเล็กน้อยและการประกาศโมดูลสามารถทำได้ทุกที่ Python อาจใกล้เคียงกับการทำสิ่งต่าง ๆ ในแบบที่คุณคิดว่าคุณเห็นใน Scheme ยกเว้นว่าไลบรารี่ของบุคคลที่สามใน C ยังคงเพิ่มรอยย่น (เล็ก)
นอกจากนี้ภาษาที่พิมพ์แบบไดนามิกเช่น Ruby, Python และ Lisp มักไม่มีวิธีการ "สัญญา" ที่เหมือนกันกับภาษาที่พิมพ์แบบคงที่ ในภาษาที่พิมพ์แบบไดนามิกคุณมักจะสร้าง "ข้อตกลงของสุภาพบุรุษ" รหัสนั้นจะตอบสนองต่อวิธีการบางอย่างและถ้าชั้นเรียนของคุณดูเหมือนจะพูดภาษาเดียวกันทุกอย่างจะดี ภาษาที่พิมพ์แบบคงที่มีกลไกเพิ่มเติมเพื่อบังคับใช้กฎเหล่านี้ในเวลารวบรวม ใน C # การใช้สัญญาดังกล่าวช่วยให้คุณสามารถรับประกันการยึดมั่นกับอินเทอร์เฟซเหล่านี้อย่างน้อยมีประโยชน์ในระดับปานกลางซึ่งช่วยให้คุณสามารถรวมปลั๊กอินและการแทนที่ด้วยการรับประกันระดับสามัญของคอมมอนเพราะคุณรวบรวมกับสัญญาเดียวกัน ใน Ruby หรือ Scheme คุณตรวจสอบข้อตกลงเหล่านี้ด้วยการเขียนการทดสอบที่ใช้งานได้จริง
มีประโยชน์ประสิทธิภาพที่วัดได้จากการรับประกันเวลารวบรวมเหล่านี้เป็นวิธีการภาวนาไม่จำเป็นต้องส่งสองครั้ง เพื่อให้ได้รับประโยชน์เหล่านี้ในบางสิ่งบางอย่างเช่น Lisp, Ruby, JavaScript หรือที่อื่น ๆ สิ่งที่ตอนนี้ยังคงเป็นกลไกที่แปลกใหม่เล็กน้อยของการรวบรวมคลาสในแบบคงที่เพียงครั้งเดียวใน VMs เฉพาะ
สิ่งหนึ่งที่ระบบนิเวศของ C # ยังคงมีการสนับสนุนที่ค่อนข้างอ่อนคือการจัดการของการพึ่งพาไบนารีเหล่านี้ Java มี Maven เป็นเวลาหลายปีในการจัดการเพื่อให้แน่ใจว่าคุณมีการพึ่งพาที่จำเป็นทั้งหมดในขณะที่ C # ยังคงมีวิธีการแบบดั้งเดิมที่ค่อนข้างเหมือนกันที่เกี่ยวข้องกับการวางไฟล์ในตำแหน่งที่ถูกต้องล่วงหน้า