คุณจะหลีกเลี่ยงความคล้ายคลึงกันของชื่อระหว่างชั้นเรียนกับคนพื้นเมืองได้อย่างไร [ปิด]


9

ฉันเพิ่งพบกับ "ปัญหาที่น่าสนใจ" ซึ่งฉันต้องการความคิดเห็นของคุณเกี่ยวกับ:

ฉันกำลังพัฒนาระบบและด้วยเหตุผลหลายประการ (ความหมาย: นามธรรมความเป็นอิสระทางเทคโนโลยี ฯลฯ ) เราสร้างประเภทของเราเองสำหรับการแลกเปลี่ยนข้อมูล

ตัวอย่างเช่น: หากมีวิธีการที่เรียกว่า SendEmail และถูกเรียกใช้โดยตรรกะทางธุรกิจก็จะมีพารามิเตอร์ประเภท OurCompany.EMailMessage ซึ่งเป็นวัตถุที่เป็นเทคโนโลยีที่สมบูรณ์และมีเพียง "ข้อมูลที่เกี่ยวข้องกับธุรกิจ" (สำหรับ ไม่มีการเข้ารหัสข้อมูลหัว abut)

ภายในฟังก์ชั่น SendEmail เราได้รับข้อมูลนี้จากวัตถุ EMailMEssage ของเราและสร้างวัตถุ MailMessage (อันนี้เป็นเทคโนโลยีเฉพาะ) เพื่อให้สามารถส่งผ่านเครือข่ายได้

อย่างที่คุณสามารถสังเกตุได้ว่าชั้นเรียนของเรามีชื่อคล้ายกับชั้นเรียนภาษา "ดั้งเดิม" ปัญหาคือ: นี่คือสิ่งที่พวกเขาเป็นข้อความอีเมลดังนั้นจึงยากที่จะหาชื่ออื่นที่มีความหมาย

คุณมีปัญหานี้บ่อยไหม? คุณจัดการได้อย่างไร

แก้ไข: @mgkrebbs เพิ่งแสดงความคิดเห็นเกี่ยวกับการใช้ชื่อที่ผ่านการรับรองโดยสมบูรณ์ นี่คือวิธีการในปัจจุบันของเรา แต่น้อยเกินไป verbose, IMHO ฉันอยากได้สิ่งที่สะอาดกว่านี้ถ้าเป็นไปได้


2
การใช้การรับรองเสมอดูเหมือนว่าจะเป็นวิธีแก้ปัญหาที่ใช้การได้ถ้าเป็น verbose ใช้ OurCompany.EMailMessage สำหรับประเภทหนึ่งและ SendEmailClass.EMailMessage (หรืออะไรก็ตาม) สำหรับอีกประเภทหนึ่ง มีปัญหาในการใช้วิธีนี้หรือไม่?
mgkrebbs

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

3
ชื่อมาในบริบท โดยปกติแล้วเนมสเปซหรืออะไรทำนองนั้น ดังนั้นจึงไม่ควรมีปัญหา
deadalnix

+1, ฉันชอบคำถามนี้ ฉันเคยถามคำถามนี้กับอาจารย์ผู้สอนเมื่อประมาณ 7 ปีที่แล้วและเขาคิดว่าฉันสมบูรณ์ ".... " :)
NoChance

คุณใช้ภาษาอะไร คำตอบคือเฉพาะภาษา โดยทั่วไปคำตอบคือ 'ใช้เนมสเปซ' ใน Java application เดียวเป็นเรื่องปกติที่จะมีชื่อคลาสเดียวกันที่ใช้โดยไลบรารีครึ่งโหล
วินไคลน์

คำตอบ:


3

นี่เป็นปัญหาเกี่ยวกับเนมสเปซที่คุณจะใช้สำหรับโครงการของคุณ

โดยพื้นฐานแล้ว namespace คือชุดคำหลักที่จัดทำโดยคลาสทั้งหมดของคุณและ / หรือคลาสทั้งหมดที่คุณต้องการใช้ในโครงการของคุณ (รวมถึงคลาสมาตรฐานที่มักจะมีให้กับภาษา / คอมไพเลอร์ / IDE)

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

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

หัวข้อถูกกล่าวถึงอย่างมากในเน็ตฉันสามารถแนะนำการค้นหาขั้นพื้นฐานด้วยคำว่า "เนมสเปซ [ภาษาของคุณ]" o บางอย่างเช่นนั้น ฉันไม่ได้ตอบคำถามของคุณโดยตรงเพราะคุณสามารถมีวิธีการที่แตกต่างกันสำหรับภาษาที่แตกต่างกัน


3

ทีมพัฒนาเก่าของฉันใช้ต่อท้ายตัวย่อของแอปพลิเคชันในแต่ละคลาสที่กำหนดเอง เรามีตัวอย่างเช่นคลาสABCEmail

ฉันคิดว่ามันตรงไปตรงมามากกว่าการพึ่งพาเนมสเปซ แต่ก็สามารถเป็นทางออกเสริมในการใช้เนมสเปซได้

สุดท้าย แต่ไม่ท้ายสุดเนื่องจากคุณสร้างวัตถุใหม่หมายความว่าวัตถุดั้งเดิมไม่ตอบสนองความต้องการของคุณดังนั้นชื่อของไฟล์อีเมลของคุณอาจเป็นCustomizedEmail , AdvancedEmail ... ฯลฯ


1
ตกลงที่จะจุดสุดท้ายของคุณ แต่ทำไมจะOAEmailต้องดีกว่าOurApplication.Email? OAEMailมีผลกระทบกับทุกส่วนของซอฟต์แวร์ในขณะที่โน้ตเนมสเปซมีผลต่อการแปลงและการใช้คลาสทั้งสองในไฟล์ต้นฉบับเดียวกัน
Steven Jeuris

1
ฉันคิดว่าคำนำหน้าเป็นความคิดที่ดีเมื่อภาษาของคุณไม่สนับสนุนเนมสเปซ แต่ถ้าภาษารองรับรูปแบบบางอย่างในการกำหนดระยะห่างจากนั้นให้ใช้ (นี่คือปัญหาที่เนมสเปซถูกออกแบบมาเพื่อแก้ปัญหา!) '
Martin York เมื่อ

@Steven Jeuris: ควรเลือกชื่อคลาสเมื่อสร้างแล้ว หลังจากนั้นฉันคิดว่ามันเป็นการปฏิบัติที่ไม่ดีที่จะเปลี่ยนมัน ... เพราะผลกระทบที่ไม่จำเป็นทั้งหมด
Amine

@ Loki Astari: ฉันไม่รู้ว่าคุณใช้ IDE ใด แต่ฉันพบว่าชื่อคลาสอื่นนั้นง่ายต่อการจัดการเมื่อค้นหาหรือเปิดคลาสที่กำหนด ฉันเห็นโปรเจ็กต์ที่มี "อีเมล" เวอร์ชันที่กำหนดเองและทุกครั้งที่ฉันต้องการเปิดไฟล์ ประเด็นของคุณยังคงใช้ได้ฉันคิดว่ามันเป็นเรื่องขององค์กรแพ็คเกจว่าจะมีการสร้างคลาสที่กำหนดเองได้กี่คลาส
Amine

1
@Amine: ฉันไม่ได้ตระหนักว่าคุณกำลังโต้เถียงกับ namespaces ฉันขอแนะนำให้คุณอ่านเพิ่มเติมเกี่ยวกับ namespaces เพื่อดูข้อดีทั้งหมดของการใช้: encapsulation, กำจัดความกำกวม, ความซ้ำซ้อนน้อยกว่า, ... Ps: IDE สมัยใหม่ส่วนใหญ่มีคุณสมบัติการค้นหาที่ช่วยให้คุณค้นหาไฟล์ต้นฉบับได้อย่างรวดเร็วโดยไม่ต้องเรียกดู ลำดับชั้น ตามที่คุณแสดงความคิดเห็นกับฉัน: การปรับโครงสร้างอย่างต่อเนื่องเป็นส่วนหนึ่งของการพัฒนาซอฟต์แวร์ เมื่อคุณสามารถสร้างชื่อที่เหมาะสมกว่ามีผลกระทบใหญ่หรือไม่คุณควรพิจารณาเปลี่ยนชื่อ อย่างไรก็ตามมันเป็นการดีที่สุดที่จะพูดคุยเรื่องนี้กับเพื่อนร่วมงานก่อน
Steven Jeuris

3

คุณใช้ภาษาอะไร คำตอบคือเฉพาะภาษา โดยทั่วไปคำตอบคือ 'ใช้เนมสเปซ' ฉันแทบจะไม่ยั้งชื่อประเภทเพื่อหลีกเลี่ยงความขัดแย้งกับเนมสเปซภายนอก

ในแอปพลิเคชัน Java เดียวเป็นเรื่องปกติที่จะมีชื่อคลาสเดียวกัน (เช่น "Date") ที่กำหนดในเนมสเปซครึ่งโหล หากคลาสหนึ่งต้องการใช้คลาส Date แยกกันสองคลาสคลาส Date จะต้องผ่านการรับรองโดยสมบูรณ์ในทุกที่ที่ปรากฎเนื่องจาก Java ไม่รองรับนามแฝงประเภท ในชีวิตของ C ++ นั้นง่ายกว่า คุณสามารถเปลี่ยนชื่อหนึ่งในนั้นด้วย typedef


ผมกำลังจะโพสต์คำตอบที่คล้ายกัน แต่แทนที่จะของ C ++ ตัวอย่างนามแฝงอยากจะพูดถึง C # 's สั่งใช้นามแฝง
Steven Jeuris

@ สตีเว่น: ฉันจะพูดถึง C # แทน C ++ แต่ไม่กี่ปีที่ผ่านมาตั้งแต่ฉันได้ตั้งโปรแกรมใน C # และไม่แน่ใจ
วินไคลน์

2

คุณมีปัญหานี้บ่อยไหม? คุณจัดการได้อย่างไร

มันขึ้นอยู่กับภาษาที่คุณใช้จริงๆ ใน c ++ และ java ปัญหานี้แก้ไขได้โดยใช้เนมสเปซ ฉันกำลังใช้ c ++ และมันเกิดขึ้นว่าฉันมีคลาสที่แตกต่างด้วยชื่อเดียวกัน ไม่ใช่ปัญหาเนื่องจากอยู่ในเนมสเปซที่ต่างกัน

ในภาษาอื่นไม่มีวิธีใดนอกจากให้ชื่อต่างกัน


สำหรับคอมพิวเตอร์นั้นไม่ใช่ปัญหา แต่สำหรับนักพัฒนาอาจเป็นเพราะคุณมี EmailMessage และ MailMessage เป็นต้น
JSBach

@Oscar เห็นได้ชัดว่า สำหรับคอมพิวเตอร์มันสามารถxyz123และยังคงทำงานเหมือนเดิม ฉันไม่เห็นวิธีอื่นแล้วจะ verbose (คุณพูดในความคิดเห็นที่คุณพยายามหลีกเลี่ยง)
BЈовић

2

คำถามของคุณดีมาก ถ้าคุณนำหน้าวิธีการของคุณด้วยคำนำหน้าเช่น U (หรือ u) หรือ cls (ย่อมาจาก class) ตัวอย่าง:

clsEMailMEssage หรือ uEMailMEssage

สิ่งนี้ไม่ต้องการการพิมพ์จำนวนมากและคุณสามารถบอกได้ทันทีว่าประเภทนั้นเป็น 'ของคุณ'

แก้ไข - ตามความคิดเห็นของ 2 ความคิดเห็นแรก:

ฉันต้องการที่จะชี้ให้เห็นความสนใจของผู้อ่านถึงความจริงที่ว่า:: ไม่ได้สร้างสัญลักษณ์ฮังการีทั้งหมดเท่ากัน เราควรแยกความแตกต่างระหว่างSystem HungarianและApps Hungarianฉันคิดว่าคำแนะนำข้างต้นเป็นไปตามประเภทของ Apps Hungarian ซึ่งไม่เป็นอันตราย

อันตรายที่เกี่ยวข้องกับสัญกรณ์ระบบฮังการีเช่นในการตั้งชื่อ ID intID ไม่ปรากฏในคำแนะนำข้างต้น

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ดูได้ที่: การสร้างรหัสผิดดูผิด - โจเอลกับซอฟต์แวร์


3
ทุกครั้งที่มีคนแนะนำสัญกรณ์ฮังการีพระเจ้าจะฆ่าลูกแมว
Konamiman

2
BIgHUmpCAmelCA กำลังใช้งานไม่ได้ผล
Steven Jeuris

ความคิดเห็นข้างต้นได้รับการชื่นชม โปรดดูการแก้ไขของฉันแม้ว่าฉันรู้ว่าพวกเราบางคนจะไม่เปลี่ยนใจหลังจากที่ทุกคนต้องการให้ลูกแมวถูกฆ่า? :)
NoChance

ฉันลบการลงคะแนนในขณะนี้ที่คุณเพิ่มเหตุผลที่ถูกต้อง อย่างไรก็ตามฉันไม่ยอมรับว่าแอพ Hungarian มีความเหมาะสมมากกว่าเนมสเปซในสถานการณ์นี้ เมื่อภาษารองรับนามแฝงนั่นเป็นทางออกที่เหมาะสมกว่า ดูเควินไคลน์คำตอบ
Steven Jeuris

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