(ฉันยังไม่ได้อ่านClean Codeและไม่รู้ Java มาก)
มันสมเหตุสมผลไหมที่จะใช้แนวคิดในการสร้างเอนทิตีเล็ก ๆ จำนวนมากแต่ละอันมีหน้าที่กำหนดอย่างชัดเจนสำหรับเนมสเปซ
ใช่เช่นเดียวกับที่มีการปรับโครงสร้างใหม่ในหลาย ๆ คลาสและหลายฟังก์ชั่น
กลุ่มเล็ก ๆ ของคลาสที่เกี่ยวข้องควรถูกห่อในเนมสเปซหรือไม่?
โดยไม่ตอบรับจริง: ใช่อย่างน้อยคุณควรใช้เนมสเปซระดับบนสุดหนึ่งรายการ สิ่งนี้อาจเป็นไปตามโครงการองค์กรหรืออะไรก็ได้ที่คุณชอบ แต่การใช้ชื่อทั่วโลกเพียงไม่กี่ชื่อจะลดความขัดแย้งของชื่อ เนมสเปซเดี่ยวเพื่อจัดกลุ่มทุกอย่างอื่นภายใต้แนะนำชื่อเดียวทั่วโลก (ยกเว้นฟังก์ชั่น extern "C" แต่เกิดจากการทำงานร่วมกันของ C และมีผลกับฟังก์ชั่น "C" extern อื่นเท่านั้น)
กลุ่มเล็ก ๆ ของคลาสที่เกี่ยวข้องควรถูกห่อในเนมสเปซที่อุทิศให้กับพวกเขาหรือไม่? อาจ. โดยเฉพาะอย่างยิ่งถ้าคุณพบว่าตัวเองใช้คำนำหน้าทั่วไปในคลาสเหล่านั้น - FrobberThing, FrobberThang, FrobberDoohickey - คุณควรพิจารณา namespace - frobber :: Thing เป็นต้น สิ่งนี้จะยังคงอยู่ภายใต้รูทเนมสเปซของคุณหรือเนมสเปซอื่นหากเป็นส่วนหนึ่งของโครงการขนาดใหญ่
นี่เป็นวิธีการจัดการความซับซ้อนของการมีคลาสเล็ก ๆ จำนวนมากหรือค่าใช้จ่ายในการจัดการเนมสเปซมากมายเป็นสิ่งต้องห้ามหรือไม่?
จากตัวอย่างข้างต้นของชื่อที่มีคำนำหน้าการจัดการ frobber :: Thing ไม่ใช่ FrobberThing มันอาจจะง่ายขึ้นด้วยเครื่องมือบางอย่างเช่นเอกสารและการกรอกโค้ด มีความแตกต่างกับ ADL แต่สิ่งนี้สามารถทำงานได้ตามที่คุณต้องการ: ชื่อที่น้อยลงในเนมสเปซที่เชื่อมโยงกันทำให้ ADL ง่ายกว่าที่จะเข้าใจและคุณสามารถใส่การประกาศเพื่อฉีดชื่อเฉพาะลงในเนมสเปซหนึ่ง
นามแฝงของนามแฝงอนุญาตให้คุณใช้ชื่อที่สั้นกว่าสำหรับเนมสเปซที่ยาวขึ้นในบริบทเฉพาะซึ่งอนุญาตให้ใช้งานได้ง่ายขึ้นอีกครั้ง:
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.
}
พิจารณา Boost ซึ่งมีเนมสเปซรูทเดียวเพิ่มและจากนั้นหลายชื่อย่อย - เพิ่ม :: asio, เพิ่ม :: io, เพิ่ม :: ระบบไฟล์, เพิ่ม :: tuples, ฯลฯ - สำหรับไลบรารีต่างๆ ชื่อบางชื่อ "เลื่อน"เป็นรูทเนมสเปซ:
คำจำกัดความทั้งหมดอยู่ใน namespace :: boost :: tuples แต่ชื่อทั่วไปส่วนใหญ่จะถูกยกไปที่ namespace :: boost ด้วยการใช้การประกาศ ชื่อเหล่านี้คือ: tuple, make_tuple, tie และ get นอกจากนี้ ref และ cref ถูกกำหนดโดยตรงภายใต้ :: boost namespace
ความแตกต่างที่ใหญ่ที่สุดจากภาษาที่มีโมดูล "ของจริง" คือวิธีการทั่วไปที่จะใช้โครงสร้างอี๋ที่เกิดขึ้นเพราะส่วนใหญ่มันเป็นวิธีการทำงานเว้นแต่คุณจะใช้ความพยายามพิเศษในการกำหนดชื่อที่ซ้อนกัน