ชื่อแพคเกจที่เหมาะสมมีความหมายมากกว่า `ใช้ 'สำหรับสิ่งต่อไปนี้?


18

ในฐานะชาวฟางพิจารณาแพคเกจjava.utilมันเป็นพื้นทิ้งสำหรับชั้นเรียนต่างๆที่ในกรณีส่วนใหญ่ไม่แบ่งปันอะไรกันมากกว่าคนที่ทำให้พวกเขามีขี้เกียจหรือไม่มีปฏิภาณที่จะเกิดขึ้นกับชื่อแพคเกจที่ถูกต้องเชิงความหมายสำหรับชั้นเรียนของพวกเขา

เป็นตัวอย่างหนึ่ง แต่ให้ชั้นเรียนUUIDชื่อแพคเกจที่ถูกต้องทางความหมายสำหรับคลาสนั้นคืออะไร?

ฉันกำลังทำงานUUIDเพื่อทำให้ชั้นเรียนของฉันมีน้ำหนักเบาขึ้น ฉันไม่ต้องการใช้me.myproject.util.UUIDสำหรับชื่อแพ็คเกจ

ผมถือว่าแต่ที่ไม่ได้หมายความความหมายของการใช้me.myproject.rfc4122.UUIDUUID

ฉันก็คิดเช่นกันme.myproject.uuid.UUIDแต่ฉันไม่ชอบคำซ้ำซากในที่นั้นแม้ว่าจะเป็นวิธีที่นิยมใน Python ที่จะนำคลาสในโมดูลที่มีชื่อเดียวกันและpackagesใน Java นั้นไม่เทียบเท่ากับmodulesใน Python

ฉันยังพิจารณาme.myproject.UUIDแต่ปฏิเสธเพราะฉันไม่ต้องการสร้างมลภาวะเป็นส่วนหนึ่งของเนมสเปซกับสิ่งที่ไม่เกี่ยวข้อง นี่แค่ยกระดับปัญหาขึ้น

ฉันพิจารณาด้วยเช่นกันme.myproject.lib.UUIDแต่นี่ไม่มีความหมายเชิงความหมายมากไปกว่า.utilและเพียงแค่เปลี่ยนชื่อปัญหา

semanticsสาขาวิชาภาษาศาสตร์และตรรกะที่เกี่ยวข้องกับความหมาย


แล้วไงme.myproject.UUIDล่ะ หรือme.UUID
Robert Harvey

สำหรับฉันแล้วfrom me.myproject.uuid import UUID, GetUUIDInfoดูเหมือนว่าตกลง อาจมีสิ่งส่งออกมากกว่าหนึ่งรายการในโมดูล
9000

2
JXTA มีแพ็คเกจ 'id' สำหรับสิ่งที่ต้องทำกับรหัส
greg-449

@ greg-449 - ฉันโน้มตัวไปข้างหน้าidentityหรือidentifiersใส่คำแนะนำของคุณพร้อมคำอธิบายเพิ่มเติมเล็กน้อยเพื่อเป็นคำตอบที่อาจเป็นที่ยอมรับ

คำตอบ:


11

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

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

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

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


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

1

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

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

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


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

@Dunk นั้นเป็นจุดที่ดีมาก - การสร้างโครงสร้างแพ็กเกจที่ประดิษฐ์ขึ้นก่อนจะทำให้คุณเห็นองค์กรที่ดีกว่าและเป็นธรรมชาติมากขึ้นไปพร้อมกัน
qbd

1

ลุงบ๊อบมีแนวทางในการแยกบรรจุภัณฑ์

หลักการแพ็คเกจสามข้อแรกนั้นเกี่ยวกับการทำงานร่วมกันของแพคเกจพวกเขาบอกเราว่าควรใส่อะไรในแพ็คเกจ:

  1. แกรนูลของการใช้ซ้ำคือแกรนูลของการปล่อย
  2. คลาสที่เปลี่ยนแปลงด้วยกันจะถูกรวมเข้าด้วยกัน
  3. คลาสที่ใช้ร่วมกันจะถูกรวมเข้าด้วยกัน

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

ขึ้นอยู่กับคำตอบของคุณคุณอาจเรียกมันว่าแพ็คเกจme.myproject.identity , me.myproject.serialization package, me.myproject DTOหรืออย่างอื่นอย่างสิ้นเชิง บางทีชั้น UUID ควรจะเก็บไว้ด้วยกันกับรุ่นของคุณและคุณจะใส่มันในแพคเกจที่คุณมีอยู่แล้วเช่นme.myproject.models


1
dtoเป็นเรื่องเกี่ยวกับความหมายที่ไร้ประโยชน์เป็นlibหรือแนวคิดutilsทั้งหมดdtoเป็นรูปแบบการต่อต้านไร้เดียงสาจากช่วงกลางทศวรรษที่ 90 modelตกอยู่ในประเภททั่วไปไร้ประโยชน์เดียวกันเช่นกัน

เราไม่มีความรู้เพียงพอเกี่ยวกับโครงการของคุณเพื่อให้ชื่อที่มีประโยชน์มากขึ้นกับคุณ
Hbas

-2

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

  • คุณอาจเลือกที่จะแยกชั้นเรียนโดยค่า bussines ของพวกเขาเช่นcom.example.identifier;
  • com.example.uuidหรือตามมูลค่าทางเทคนิคของพวกเขาเช่น

ทำให้ไอทีง่ายขึ้น


2
ตัวอย่างของการเรียนตัวอักษรพิมพ์ในชวา: java.util.UUID, java.net.URL, java.util.zip.CRC32ฯลฯ
scriptin

@scriptin จะไม่ง่ายสำหรับนักพัฒนาถ้าเขาสามารถแยกความแตกต่างจากสไตล์แคปแบบคลาสจาก "ค่าคงที่" สมาชิกจากชื่อแพ็คเกจและอื่น ๆ ได้หรือไม่ ทำไมคุณคิดว่า CRC32, UUID เป็นชื่อที่ดีสำหรับชั้นเรียนเพียงเพราะ java ทำมันได้? หรือเพราะมันเป็นตัวย่อจาก "ตัวระบุที่ไม่ซ้ำกันในระดับสากล" หรือ "การตรวจสอบความซ้ำซ้อนแบบวนซ้ำ" ... แต่เดี๋ยวก่อน! java.util.zip.GZIPOutputStreamคลาสนี้มีอะไรบ้าง? GZIPย่อมาจาก ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.

1
คลาสเป็นประเภทค่าคงที่เป็นค่าไม่มีความสับสน ฉันไม่คิดว่าชื่อเหล่านั้นดีหรือไม่ดีฉันแค่ชี้ให้เห็นว่าสไตล์ (การเข้ารหัส) ที่คุณพูดถึงไม่บังคับให้ชั้นเรียนมีตัวอักษรพิมพ์เล็ก ใน Python UUIDก็เป็นตัวพิมพ์ใหญ่เช่นกัน
scriptin

หากคุณเห็น / รหัส mantain ทุกวันรูปแบบของมันจะสร้างความแตกต่างระหว่าง "ง่ายต่อการอ่าน" และ "ย้อนกลับไปข้างหน้า" เฟียสต้าแยกที่นี่เพียงแค่รูปแบบหมวกฉันคิดว่ามันมีค่ามากกว่าที่จะแสดงผ่าน ตัวพิมพ์ใหญ่ชนิดของสมาชิก (คลาส, ค่าคงที่, แพ็กเกจ ฯลฯ ) มากกว่าความจริงที่เป็นตัวย่อ
Tiberiu C.

1
คำถามเดิมไม่มีส่วนเกี่ยวข้องกับกรณีตัวอักษรที่จะใช้เมื่อเขียนชื่อแพ็คเกจ ความหมายของ UUID ไม่แตกต่างจาก Uuid, uuid, UuId, UuID หรือรูปแบบการใช้ประโยชน์อื่น ๆ ตามอำเภอใจที่คุณคิดว่าเป็น "ดีที่สุด"
Brandin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.