ทำไมเราถึงใช้ชื่อโดเมนย้อนกลับเช่น com.something หรือ org.something โครงสร้างสำหรับแพ็คเกจ Java? ฉันเข้าใจว่าสิ่งนี้นำมาซึ่งความพิเศษบางอย่าง แต่ทำไมเราถึงต้องการความพิเศษนี้
ความสำคัญของชื่อโดเมนย้อนกลับสำหรับโครงสร้างแพ็คเกจ Java คืออะไร
คำตอบ (6)
ชื่อแพ็คเกจที่ไม่ซ้ำกันทั่วโลกหลีกเลี่ยงการตั้งชื่อการชนกันระหว่างไลบรารีจากแหล่งที่ต่างกัน แทนที่จะสร้างฐานข้อมูลกลางใหม่ของชื่อสากล จะใช้การลงทะเบียนชื่อโดเมน จาก JLS:
แบบแผนที่แนะนำสำหรับการสร้างชื่อแพ็คเกจที่ไม่ซ้ำใครเป็นเพียงวิธีหนึ่งในการนำแบบแผนการตั้งชื่อแพ็คเกจกลับคืนมา นอกเหนือจากการลงทะเบียนชื่อเฉพาะที่มีอยู่และเป็นที่รู้จักกันอย่างแพร่หลาย แทนที่จะต้องสร้างรีจิสทรีแยกต่างหากสำหรับชื่อแพ็คเกจ
เกี่ยวกับสาเหตุที่เรากลับรายการ: ลองนึกภาพคุณมีแพ็คเกจที่สำคัญสองแพ็คเกจ ได้แก่ แพ็คเกจการบัญชี และแพ็คเกจกราฟิก หากคุณระบุสิ่งเหล่านี้ตามลำดับ 'ตรง':
accounting.mycompany.org
graphics.mycompany.org
จากนั้นก็บอกเป็นนัยว่ามีแพ็คเกจ accounting
หลัก ซึ่งส่วนย่อยมีไว้สำหรับ mycompany
และส่วนย่อยของแพ็คเกจ นั้น เรียกว่าแพ็คเกจ org
ที่คุณใช้จริง อย่างไรก็ตาม คุณต้องการสิ่งนี้:
org.mycompany.accounting
org.mycompany.graphics
สิ่งนี้สมเหตุสมผลมากขึ้น จากแพ็คเกจทั้งหมดจากองค์กร (org
) คุณดูที่ mycompany
โดยเฉพาะ และมีสองแพ็คเกจย่อยคือ accounting
และ graphics
a.b.c.d
หมายความว่าคุณเริ่มต้นด้วยคลาส a
โดยซ้อนลงในฟิลด์ b
ซ้อนกับ c
ของฟิลด์นั้น จากนั้นซ้อนกับ d
ของฟิลด์นั้น การจัดระเบียบแพ็คเกจแบบอะนาล็อกควรทำงานเหมือนกัน นอกจากนี้ในแพ็คเกจย่อยของแพ็คเกจ Python จริง ๆ แล้วทำตามที่ฉันเขียนไว้ที่นี่ ดังนั้นมันจึงเป็นไปไม่ได้แต่มันจะเป็นเรื่องปัญญาอ่อน
- person Claudiu; 12.09.2013
foo :: Int -> Int
หมายถึง foo
มีประเภทฟังก์ชันที่รับ int และส่งกลับ int) ฉันเห็นว่ามันได้ผลไม่ทางใดก็ทางหนึ่ง แต่โอเค ลองพิจารณาสิ่งนี้ - สมมติว่าคุณมีแพ็คเกจตามลำดับที่คุณแนะนำใน Java ดังนั้น accounting.project
เป็นส่วนย่อยทางบัญชีของ project
และ reporting.project
เป็นส่วนย่อยของการรายงานของ project
ตอนนี้คุณมีคลาสในแต่ละ accounting.project.AccountManager
และ reporting.project.ReportGenerator
... ดูไม่ผิดเหรอ? เป็นการผสมผสานสองแบบแผนไว้ในที่เดียว
- person Claudiu; 13.09.2013
account.project.AccountManager.FooBit
กับ reporting.project.ReportGenerator.ReportingSubsystem
ตอนนี้ครึ่งซ้ายของชื่อเป็นแบบเจาะจง -> ทั่วไป แต่ครึ่งขวาเป็นชื่อทั่วไป -> เฉพาะ ฉันเห็นว่ามันทำงานตามที่คุณพูดถ้าไวยากรณ์สำหรับการเข้าถึงฟิลด์นั้นทำงานโดยนำสิ่งต่าง ๆ ไว้ข้างหน้าทางด้านซ้าย แต่มันไม่ทำงานแบบนั้นใน Java
- person Claudiu; 13.09.2013
อย่างที่คุณพูด การกลับชื่อโดเมนเป็นชื่อแพ็คเกจพื้นฐานจะทำให้มั่นใจถึงความเป็นเอกลักษณ์ สมมติว่าสองบริษัทที่มี DN example.com และ example.org ต่างก็กำหนดคลาส Employee ในกรอบงานของตน ตอนนี้หากคุณใช้ทั้งสองเฟรมเวิร์ก คุณจะไม่สามารถระบุได้ว่า Employee คนไหนที่คุณต้องการใช้ในโค้ดของคุณ แต่หากถูกกำหนดไว้ในแพ็คเกจ com.example และ org.example ตามลำดับ คุณสามารถบอกคอมไพเลอร์/JVM โดยเฉพาะว่าคุณอยู่ในคลาสใด อ้างถึง. หากไม่ได้กำหนดแพ็คเกจเฉพาะ คุณจะได้รับข้อผิดพลาดในการคอมไพล์หรือข้อผิดพลาดรันไทม์ เช่น หากคุณใช้คลาสพนักงาน com แต่คลาสพนักงานขององค์กรถูกโหลดก่อนจาก classpath คุณจะได้รับข้อผิดพลาดรันไทม์ เนื่องจากคลาสพนักงานทั้งสองคลาสอาจมีโครงสร้างไม่เหมือนกัน
การโหลดคลาสต้องมีเอกลักษณ์เฉพาะตัว
ซึ่งช่วยได้โดยการหลีกเลี่ยงการชนกันของชื่อ หากมีคลาสที่มีชื่อแพ็กเกจและชื่อคลาสเหมือนกัน การชนกันจะเกิดขึ้นขณะพยายามโหลดคลาส
โดยทั่วไปจะเกิดขึ้นหากมีไลบรารีหลายรายการ (jar) ที่มีคลาสที่มีชื่อเหมือนกัน
< br> โปรดดูสิ่งนี้ด้วย
คุณต้องการความเป็นเอกลักษณ์หากคุณอาจจำเป็นต้องรวมโค้ดของคุณเข้ากับซอฟต์แวร์ของบริษัทอื่น หรือมอบให้กับบุคคลอื่นเพื่อการบูรณาการ หากคุณไม่ปฏิบัติตามกฎ คุณจะเพิ่มความเสี่ยงที่การตั้งชื่อคลาสขัดแย้งกันในบางครั้ง และคุณจะต้องเปลี่ยนชื่อคลาสจำนวนมากเพื่อแก้ไข หรือแย่กว่านั้นคือลูกค้าของคุณจะต้องทำการเปลี่ยนชื่อรหัส
นอกจากนี้ยังใช้เมื่อมีการสร้างโค้ดโดยเป็นส่วนหนึ่งของโปรเจ็กต์ต่างๆ ในองค์กร
อย่างที่คุณพูด มันนำมาซึ่งความเป็นเอกลักษณ์ ซึ่งเป็นสิ่งที่จำเป็นโดยเฉพาะอย่างยิ่งเมื่อทำงานกับโค้ดของบุคคลที่สาม ตัวอย่างเช่น พิจารณาว่าคุณกำลังใช้ไลบรารีที่ฉันสร้างขึ้น ฉันใช้แพ็คเกจ "foo" และมีคลาสชื่อ Bar อยู่ที่นั่น ตอนนี้ หากคุณใช้ชื่อแพ็คเกจ "foo" และคุณมีคลาสชื่อ Bar นี่หมายความว่าการใช้งานของคุณจะแทนที่การใช้งาน Bar ของฉัน ทำให้การใช้งานของฉันไม่สามารถเข้าถึงได้ ในทางกลับกัน หากแพ็คเกจของฉันคือ "com.mydomain.foo" และฉันมีโดยคลาส Bar ที่นั่น คุณสามารถใช้ชื่อ Bar ในคลาสใดคลาสหนึ่งของคุณได้อย่างอิสระ และทั้งสองคลาสยังคงสามารถระบุและใช้แยกกันได้โดยไม่ซ้ำกัน .
เหตุใดจึงใช้ชื่อโดเมนย้อนกลับเป็นชื่อแพ็คเกจ ฉันเดาว่านั่นเป็นเพียงแบบแผนเพื่อให้แน่ใจว่าทุกคนใช้เนมสเปซที่ไม่ซ้ำกัน เนื่องจากคุณไม่ควรใช้โดเมนของคนอื่นในชื่อแพ็คเกจของคุณ