การใช้ชื่อเดียวกันสำหรับเนมสเปซและคลาสที่อยู่ภายในนั้นเป็นปัญหา
หากเนมสเปซมีมากกว่าหนึ่งคลาสทำไมคลาสอื่น ๆ ถึงต้องอยู่ที่นั่น? มันไม่ถูกต้องเพราะเป้าหมายของชื่อของเนมสเปซคือการอธิบายคลาสทั้งหมดที่อยู่ภายในไม่ใช่เพียงแค่คลาสเดียว ตัวอย่างเช่นถ้าคุณมีJsonSerialization
, BinarySerialization
และXmlSerialization
ชั้นเรียนใน namespace ก็จะทำให้รู้สึกถึงชื่อ namespace ของคุณXmlSerialization
?
สิ่งที่มักจะเกิดขึ้นคือเนื่องจากการแยกคลาสออกจากเนมสเปซที่มีอยู่หรือการผสานระหว่างหลายคลาสหรือการปรับโครงสร้างองค์กรอื่นคุณพบว่าคุณมีเนมสเปซที่มีคลาสหลัก ก้าวหน้าชั้นเรียนเล็ก ๆ น้อย ๆ จะถูกวางไว้เพราะพวกเขามีความสัมพันธ์เล็กน้อยกับชั้นเรียนเดิม ตัวอย่างเช่นเนมสเปซLogParser
อาจมีคลาสเดียวLogParser
แล้วมีใครบางคนใส่LogConverter
เพราะมันค่อนข้างเกี่ยวข้องกับ parser แล้วLogSearcher
ฯลฯ ปัญหาที่นี่คือชื่อของเนมสเปซไม่เปลี่ยน: ทันทีที่LogConverter
ถูกเพิ่มเข้ามา ชื่อควรจะมีการเปลี่ยนแปลงหรือเพียงLogsProcessing
Logs
หากเนมสเปซมีเพียงคลาสเดียวอาจเป็นสัญญาณของปัญหาภายในการจัดระเบียบรหัส
ในขณะที่ฉันเห็นสองสามครั้งในสถานการณ์ที่คลาสเดี่ยวที่มีหลักการโซลิดที่เหมาะสมนั้นแตกต่างจากสิ่งอื่น ๆ ในฐานรหัสและวางไว้ในเนมสเปซเฉพาะ บ่อยครั้งสิ่งนี้บ่งบอกถึงปัญหา ในทำนองเดียวกันไม่มีสิ่งใดที่ป้องกันไม่ให้คุณมีคลาสที่มีวิธีการเดียว แต่บ่อยกว่านั้นคลาสนั้นจะบ่งบอกถึงปัญหา
แม้ว่าเนมสเปซของคุณจะมีเพียงคลาสเดียว แต่โดยทั่วไปจะมีวิธีที่เฉพาะเจาะจงมากขึ้นเมื่อตั้งชื่อคลาสและโดยทั่วไปเมื่อตั้งชื่อ namespace ลองนึกภาพแอปพลิเคชั่นที่ควรแปลงไฟล์ที่เขียนในรูปแบบ ABC เป็นรูปแบบ DEF การแปลงไม่จำเป็นต้องมีการดีซีเรียลไลซ์เซชั่น / การทำให้เป็นอนุกรมจาก / วัตถุทางธุรกิจและทำได้โดยการใช้การแสดงออกปกติจำนวนมากซึ่งสั้นพอที่จะใส่ในคลาสการแปลงเองที่เรียกว่าAbcToDefConverter
. ตรรกะการแปลงทั้งหมดใช้เวลาประมาณ 80 LLOC ในวิธีการพึ่งพาซึ่งกันและกันประมาณสิบวิธี - ดูเหมือนว่าสถานการณ์ที่ไม่จำเป็นต้องแยกชั้นที่มีอยู่หรือสร้างชั้นเรียนเพิ่มเติม เนื่องจากส่วนที่เหลือของแอปพลิเคชันไม่มีส่วนเกี่ยวข้องกับการแปลงคลาสจึงไม่สามารถจัดกลุ่มกับคลาสอื่นในเนมสเปซที่มีอยู่ได้ ดังนั้นหนึ่งสร้าง namespace AbcToDefConverter
ที่เรียกว่า Converters
ขณะที่มีอะไรผิดปกติในเนื้อแท้ที่หนึ่งยังสามารถใช้ชื่อทั่วไปมากขึ้นเช่น ในภาษาเช่น Python ที่ต้องการชื่อที่สั้นกว่าและมีการใช้คำซ้ำซ้ำไปซ้ำconverters.Abc_To_Def
มา
ดังนั้นให้ใช้ชื่ออื่นสำหรับเนมสเปซมากกว่าคลาสที่มีอยู่ ชื่อของคลาสควรระบุว่าคลาสกำลังทำอะไรในขณะที่ชื่อของเนมสเปซควรเน้นสิ่งที่เป็นเรื่องธรรมดาในทุกชั้นที่อยู่ภายใน
โดยวิธีการที่อาคารเรียนมีความผิดโดยธรรมชาติแทนการที่มีบางสิ่งบางอย่างที่เฉพาะเจาะจงเช่นความแม่นยำทางคณิตศาสตร์โดยพลพวกเขาค่อนข้างมีทุกอย่างที่ยังไม่พบวิธีในชั้นเรียนอื่น ๆ นี่เป็นเพียงการตั้งชื่อไม่ดีเช่นเดียวกับMiscellaneous
ไดเรกทอรีบนเดสก์ท็อป - สิ่งที่บ่งบอกถึงการขาดองค์กร
การตั้งชื่อมีเหตุผล: เพื่อทำให้ชีวิตของคุณง่ายขึ้นเมื่อคุณต้องการค้นหาสิ่งต่าง ๆ ในภายหลัง คุณรู้ว่าถ้าคุณต้องการวาดแผนภูมิคุณอาจลองค้นหา "แผนภูมิ" หรือ "พล็อต" เมื่อคุณต้องการเปลี่ยนวิธีที่แอปสร้างใบแจ้งหนี้คุณจะค้นหา "ใบแจ้งหนี้ [e / ing]" หรือ "ใบเรียกเก็บเงิน" ในทำนองเดียวกันลองจินตนาการถึงกรณีที่คุณจะพูดกับตัวเองว่า: "หืมมมคุณลักษณะนี้น่าจะพบได้บ่อย" ฉันทำไม่ได้
ดู. NET Framework คลาสยูทิลิตี้คลาสเหล่านั้นไม่ได้ใช่หรือไม่ ฉันหมายความว่าพวกเขามีบางสิ่งที่ต้องทำกับโดเมนธุรกิจ ถ้าฉันทำงานในแอพทางการเงินหรือเว็บไซต์อีคอมเมิร์ซหรือแพลตฟอร์มการศึกษาต่อไปการทำให้เป็นอันดับ XML หรือการอ่านไฟล์หรือทำแบบสอบถาม SQL หรือการทำธุรกรรมเป็นสิ่งที่ยูทิลิตี้ทั้งหมด อย่างไรก็ตามพวกเขาไม่ได้เรียกUtilitySerialization
หรือหรือUtilityTransaction
พวกเขาไม่ได้อยู่ในUtility
namespace พวกเขามีชื่อที่เหมาะสมซึ่งทำให้เป็นไปได้ (และง่ายขอบคุณนักพัฒนา. NET!) เพื่อค้นหาพวกเขาเมื่อฉันต้องการ
เช่นเดียวกันสำหรับชั้นเรียนของคุณที่คุณนำมาใช้ซ้ำในแอป พวกเขาไม่ใช่คลาสยูทิลิตี้ พวกเขาเป็นชั้นเรียนที่ทำสิ่งบางอย่างและสิ่งที่พวกเขาทำจริงควรเป็นชื่อของชั้นเรียน
ลองนึกภาพคุณสร้างรหัสบางส่วนที่เกี่ยวข้องกับหน่วยและการแปลงหน่วย คุณอาจตั้งชื่อUtility
และเกลียดชังโดยเพื่อนร่วมงานของคุณ หรือคุณอาจจะชื่อมันและUnits
UnitsConversion