วิธีจัดการกับ Classes ที่มีชื่อเดียวกัน (แพ็คเกจที่ต่างกัน)


9

ฉันและทีม R&D ของฉันรักษา codebase ขนาดใหญ่ เราได้แบ่งตรรกะทางธุรกิจของเราออกเป็นหลายแพ็คเกจ บางแห่งที่มีชั้นเรียนที่มีชื่อเหมือน

ในขณะที่คุณสามารถเดาได้ว่าชื่อนั้นขัดแย้งกันเมื่อมีการอ้างอิงทั้งสองคลาสในไฟล์ Java เดียวกัน


ตัวอย่างเช่น:

com.myapp.model (package)
 - Device (class)
 - ...

com.myapp.data (package)
 - Device (class)
 - ...

เราได้ถกเถียงกันว่าอะไรคือวิธีปฏิบัติที่ดีที่สุดในการรักษากรณีเหล่านี้และตัวเลือกต่อไปนี้เกิดขึ้น:

ตัวเลือกที่ 1

  • การเปลี่ยนชื่อชั้นเรียนโดยเพิ่มคำนำหน้า

    ModelDevice
    DataDevice

ตัวเลือกที่ 2

  • ใช้ชื่อเต็ม package + class เมื่อทั้งคู่ถูกอ้างอิง

    com.myapp.model.Device
    com.myapp.data.Device

มีอะไรที่ถูกต้องมากขึ้นในแง่ของการจัดการรหัสและความยืดหยุ่น?

ขณะนี้เรากำลังผสมทั้งแนวทางและเริ่มมีความไม่สอดคล้องกัน


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

คุณไม่มีความคิดว่าฉันไม่ชอบjava.util.Dateและjava.sql.Dateโดยเฉพาะอย่างยิ่งเนื่องจากjava.sql.Dateเป็นคลาสย่อยjava.util.Dateและหลุดออกมาจากชั้นข้อมูลอย่างมาก (และไม่ได้เรียงลำดับเป็นอย่างดีกับ JSON)

ตัวเลือก 2.1 เสมอใช้ชื่อที่มีคุณสมบัติครบถ้วนแม้ว่าอื่น ๆ ที่ไม่ได้อ้างถึง
Caleth

คำตอบ:


18

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


1

ณ ตอนนี้คุณมี ClassDevice หนึ่งคลาส (อุปกรณ์ในแพ็คเกจรุ่น) ถ้าคุณมี ModelDevice อีกประเภทหนึ่งสำหรับการจำแนกประเภทที่แตกต่างกัน ปัญหาอาจยังคงมีอยู่และค่าโสหุ้ยจะเพิ่มขึ้นอย่างต่อเนื่อง

แม้ว่าในขณะนี้คุณอาจพบว่าการเปลี่ยนชื่อคลาสเป็นความช่วยเหลือที่ดี แต่ในระยะยาวทางเลือกที่แนะนำก็คือให้ดำเนินการโดยนำหน้าชื่อแพ็คเกจซึ่งเป็นมาตรฐานอุตสาหกรรม


0

เพียงเพิ่มมุมมองที่ยังไม่ได้กล่าวถึง:

ดูรูปแบบการใช้งานเช่นซอร์ส Java ที่อ้างอิงคลาสหนึ่งหรือทั้งสองคลาส

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

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

แต่การเห็นทั้งคลาสอุปกรณ์ในแหล่งเดียวอาจเป็นคำใบ้ว่าแหล่งข้อมูลนั้นละเมิดหลักการความรับผิดชอบเดี่ยวโดยการผสมงานจากแบบจำลองและโลกข้อมูล

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