หลักเกณฑ์เนมสเปซและชื่อคลาส


15

ฉันมีปัญหาในการตั้งชื่อชั้นเรียนและบริการของฉันอย่างถูกต้องเมื่อมีส่วนร่วมและชั้นเรียนช่วยเหลืออื่น ๆ เข้ามาเกี่ยวข้อง

คุณจะจัดโครงสร้างต่อไปนี้อย่างไร:

EventService.cs
EventServiceUtils.cs
EventServiceValidators.cs
EventServiceCoordinator.cs

ฯลฯ ...

ฉันมีหลายบริการที่มีความต้องการเช่นเดียวกับบริการข้างต้น ความคิดหนึ่งคือการแยกสิ่งเหล่านี้ทั้งหมดออกเป็นเนมสเปซที่เหมาะสมทำให้มันเป็นดังนี้:

Services.EventService.EventService.cs //(the actual service)
Services.EventService.Validators.DateValidator.cs
Services.EventService.Validators.ParticipantValidator.cs
Services.EventService.Coordinators.ParticipantCoordinator.cs
Services.EventService.ExtensionMethods.Extensions.cs

และอื่น ๆ แน่นอนว่าเนมสเปซทุกรายการจะมีโฟลเดอร์แยกต่างหาก แต่นี่ไม่ได้รู้สึก 100% เนื่องจากมีDateValidatorsบริการอื่น ๆ อีกมากมายซึ่งอาจนำไปสู่การอ้างอิงที่ไม่พึงประสงค์ได้อย่างง่ายดาย

และยังServices.EventService.EventService.csรวมถึงชื่อคลาสในเนมสเปซซึ่งไม่ดีเช่นกัน คุณสามารถใช้Services.Event.EventService.csแต่มีหลักสูตรที่มีชื่อนั้นอยู่แล้ว

นี่คือรูปแบบโดเมน


"ฉันมีหลายบริการที่มีความต้องการเหมือนกับบริการด้านบน" นี่หมายความว่าบริการหลาย ๆ บริการใช้รหัสด้านบนหรือหลายบริการจำเป็นต้องระบุรุ่นของตนเองตามรูปแบบเดียวกันหรือไม่
นาธานาเอล

พวกเขาให้รูปแบบเดียวกันในแบบของตัวเอง
Mattias

คำตอบ:


5

ฉันคิดว่าสิ่งที่ยิ่งใหญ่ที่สุดที่คุณสามารถทำได้เพื่อปรับปรุงการกำหนดชื่อของคุณที่นี่คือการลบออกServiceจากEventServiceเนมสเปซของคุณ ฉันจะปรับเนมสเปซเป็นแบบนี้มากขึ้น:

Services.Events.EventService.cs //(the actual service)
Services.Events.EventExtensions.cs
Services.Events.ParticipantCoordinator.cs
Services.Validators.DateValidator.cs
Services.Validators.ParticipantValidator.cs

ฉันยังคิดว่าสามารถใช้การปรับปรุงบางอย่างได้

ฉันเคยชอบเนมสเปซ แต่ทุกวันนี้ฉันคิดว่าน้อยกว่ามาก การทำเนมสเปซอย่างลึกซึ้งสามารถทำให้โค้ดของคุณละเอียดเกินไปและการแบ่งสิ่งต่าง ๆ ออกเป็นส่วน ๆ จะช่วยลดความสามารถในการสืบทอด ในรหัสของคุณDateValidatorสามารถใช้คลาสได้อย่างง่ายดายดังนั้นจึงไม่ควรมีเนมสเปซอยู่ด้านบนเนื่องจากบริการอื่นนอกเหนือจาก EventService สามารถใช้ประโยชน์จากคลาส DateValidator เช่นเดียวกับวิธีการขยาย ไม่มีเวลา (ที่ฉันเห็น) ที่คุณต้องการดูวิธีการขยายทั้งหมดของคุณในเวลาเดียวกันดังนั้นจึงเหมาะสมกว่าที่จะจัดกลุ่มมันด้วยสิ่งที่เกี่ยวข้อง ในกรณีนี้EventExtensionsอาจเชื่อมโยงไปยังของคุณEventServiceดังนั้นเหตุผลพวกเขาควรนั่งด้วยกันในความคิดของฉัน


โครงการมีขนาดใหญ่เกินไปที่จะไม่ทำลายลงในระดับหนึ่ง DateValidator ภายใต้เนมสเปซเหตุการณ์จะจัดการกับกรณีและเหตุการณ์เฉพาะเท่านั้นดังนั้นจึงไม่สามารถใช้ที่อื่นได้ ฉันชอบบริการ กิจกรรม . EventService ฉันจะไม่คิดอย่างนั้นได้อย่างไร ฉันคิดว่าถึงเวลาแล้วที่จะทำการรีแฟคเตอร์!
Mattias

@Mattias - มันยุติธรรม เท่าที่ฉันสามารถเห็นการกำหนดชื่อ (นอกเหนือจากหลักเกณฑ์พื้นฐานเช่นที่กล่าวไว้ใน Saeed ด้านล่าง) เป็นเรื่องของรสนิยม
Karl Nicoll


2

การออกแบบเนมสเปซที่เหมาะสมจะพิจารณาทั้งการออกแบบเชิงตรรกะและทางกายภาพ

แม้ว่าเหตุผลดั้งเดิมสำหรับเนมสเปซนั้นส่วนใหญ่จะป้องกันการปะทะกันของชื่อระหว่างวัตถุและชื่อเมธอดมันได้กลายเป็นองค์ประกอบสำคัญในสถาปัตยกรรมโซลูชันและการออกแบบโดยรวม ไม่เพียง แต่คุณต้องการให้ลำดับชั้นความคิดและการออกแบบเชิงตรรกะของคุณเหมาะสมคุณอาจต้องการให้โค้ดของคุณนั้นถูกจัดเป็นชุดในไลบรารีที่ออกแบบมาอย่างดีและนำมาใช้ซ้ำได้ง่ายซึ่งสามารถรวมเข้ากับโครงการและผลิตภัณฑ์อื่น ๆ ได้ในภายหลัง นั่นอาจเป็นผลลัพธ์ที่ต้องการจากการออกแบบทางกายภาพที่ดีกว่า

ดู. NET Framework และวิธีการให้หน่วยงานที่เกี่ยวข้องกับคุณในขนาดที่เหมาะสม คุณสามารถวางในการอ้างอิงและคำสั่งการใช้งานและทันใดนั้นคุณมีฟังก์ชั่นที่เกี่ยวข้องพร้อมใช้งานโดยไม่ต้องลากอ่างครัวจำนวนเท่าใดก็ได้ นี่เป็นเพราะการออกแบบทางกายภาพของ. NET Framework รวมถึงการกำหนดชื่ออัจฉริยะ - ได้จัดทำแพคเกจรหัสที่เกี่ยวข้องกับเหตุผลในหน่วยที่เกี่ยวข้องกับการปรับใช้ทางกายภาพ โดยการสร้างการแมปที่ยอดเยี่ยมระหว่างเนมสเปซกับแอสเซมบลีสถาปนิกและนักพัฒนาของกรอบงาน. NET ของ Microsoft ทำให้งานของคุณง่ายขึ้นอย่างมาก (แน่นอนว่าบางคนอาจเถียงเป็นอย่างอื่น แต่ฉันค่อนข้างพอใจกับสิ่งที่ทำ)

การกำหนดชื่อใน C # นั้นค่อนข้างที่จะเป็นไปได้ คุณสามารถใส่เนมสเปซในสถานที่ที่แปลกที่สุดในแอสเซมบลีที่ห่างไกลจากกัน ระเบียบวินัยที่เป็นประโยชน์ใด ๆ ในด้านนี้คือการมีส่วนร่วมของคุณต่อผลิตภัณฑ์ซอฟต์แวร์ที่จัดระเบียบอย่างดี ฉันจะไม่กล้าแนะนำคุณว่าจะทำอย่างไรในแต่ละกรณี สิ่งที่ฉันหวังว่าจะทำให้สำเร็จในคำตอบนี้คือให้คุณคิดถึงการออกแบบทางกายภาพและการออกแบบเชิงตรรกะเมื่อคุณกำหนดเนมสเปซของคุณ ยิ่งคุณเก็บสิ่งต่าง ๆ ที่เกี่ยวข้องในเชิงตรรกะและสามารถนำไปใช้งานได้ (ทางร่างกาย) สิ่งที่ง่ายขึ้นจะมาภายหลังทั้งคุณและคนอื่น ๆ ที่อาจจำเป็นต้องจัดการกับรหัสของคุณในบางวัน

ดังนั้นโปรดคิดด้วยว่าโค้ดของคุณจะถูกบรรจุในชุดประกอบและส่วนประกอบอย่างไรเมื่อคุณแก้ไขปัญหาการกำหนดเนมสเปซของคุณ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.