Nama paket yang secara semantik lebih sesuai daripada `util` untuk hal-hal berikut?

18

Sebagai seorang strawman mempertimbangkan paket java.utilitu adalah tempat pembuangan untuk berbagai kelas yang dalam kebanyakan kasus tidak berbagi kesamaan selain orang yang menempatkan mereka di sana malas atau tidak bersemangat untuk datang dengan nama paket yang secara semantik lebih benar untuk kelas mereka.

Sebagai satu contoh, ambil kelas UUIDapa nama paket semantik yang benar untuk kelas itu?

Saya sedang berupaya mengimplementasikan UUIDkelas saya sendiri agar lebih ringan. Saya tidak ingin menggunakan me.myproject.util.UUIDnama paket saya.

Saya mempertimbangkan me.myproject.rfc4122.UUIDtetapi itu tidak menyiratkan semantik dari penggunaan UUID.

Saya juga mempertimbangkan me.myproject.uuid.UUIDtetapi saya tidak suka tautologi dalam hal itu, meskipun itu adalah pendekatan yang populer di Python untuk menempatkan kelas dalam modul dengan nama yang sama, dan packagesdi Jawa tidak secara semantik setara dengan modulesdi Python.

Saya juga mempertimbangkan me.myproject.UUIDtetapi menolaknya karena saya tidak ingin mencemari bagian namespace dengan hal-hal yang tidak terkait. Ini hanya memindahkan masalah ke tingkat atas.

Saya juga mempertimbangkan me.myproject.lib.UUIDtetapi ini tidak memiliki makna semantik selain .utildan hanya mengganti nama masalahnya.

semantics: cabang linguistik dan logika yang berkaitan dengan makna .


sumber
Bagaimana dengan me.myproject.UUID? Ataume.UUID
Robert Harvey
Bagi saya, sesuatu seperti from me.myproject.uuid import UUID, GetUUIDInfoterlihat OK. Mungkin ada lebih dari satu hal yang diekspor dalam sebuah modul.
9000
2
JXTA memiliki paket 'id' untuk hal-hal yang berkaitan dengan id.
greg-449
@ greg-449 - Saya condong ke arah identityatau identifiersmenaruh saran Anda dengan sedikit penjelasan lebih sebagai jawaban itu mungkin akan diterima.

Jawaban:

11

Masalah dengan mencoba untuk menempatkan setiap kelas dalam sebuah paket yang memiliki nama semantik yang benar untuk kelas itu adalah bahwa ia cenderung mengarah ke paket yang berisi sangat sedikit kelas, atau kadang-kadang bahkan hanya satu kelas. Ini pada gilirannya mengarah ke banyak paket.

Pendekatan yang lebih pragmatis untuk penamaan paket adalah dengan hanya membantu Anda menemukan barang. Menyimpan barang-barang yang sering digunakan dan Anda selalu tahu di mana harus mencari semua barang di satu tempat membuat mereka terhindar dan karenanya memudahkan untuk menemukan barang-barang yang lebih jarang digunakan. Jadi, Anda tidak benar-benar membutuhkan nama paket yang secara semantik benar untuk masing-masing kelas yang dikandungnya, Anda hanya perlu nama paket yang tidak semantik salah. Jelas, nama paket 'util' dipilih sesuai dengan alur pemikiran ini: itu bukan nama yang secara semantik benar untuk kelas-kelas yang dikandungnya, tetapi juga secara semantik tidak salah, dan itu cukup bagus.

Jadi, jika jenis UUID Anda ini ditakdirkan untuk hanya digunakan oleh aplikasi spesifik ini, (sebagaimana dibuktikan oleh fakta bahwa Anda berencana untuk meletakkannya di bawah 'myproject',) maka itu mungkin merupakan bagian dari 'model' dari Anda proyek. Anda seharusnya sudah memiliki paket 'model', yang berisi sekumpulan semua kelas yang sesuai dengan entitas gigih Anda, banyak di antaranya mungkin memiliki hubungan di antara mereka, dengan UUID mungkin menjadi sarana untuk menerapkan hubungan ini. Juga, UUID Anda mungkin tahu cara bertahan diri, bukan? Dan juga, UUID Anda mungkin hanya dapat ditemukan sebagai anggota entitas model Anda, bukan? Jadi, paket model Anda mungkin merupakan tempat terbaik untuk itu.

Kalau tidak, jika jenis UUID Anda ini dapat digunakan dalam proyek lain juga, maka itu perlu dilihat sebagai bagian dari beberapa kerangka kerja. Jadi, ia dapat hidup di folder sumber root dari kerangka itu, atau dalam beberapa sub-paket 'tipe' seperti yang disarankan MainMa, atau bahkan dalam beberapa sub-paket kerangka itu yang disebut 'util' atau 'misc'. Tidak ada yang salah dengan itu.

Mike Nakis
sumber
2
Silakan coba batasi komentar dalam jawaban yang tidak benar-benar menambah kegunaan jawaban. Bagian komentar dicadangkan untuk penafian tersebut. Terima kasih.
maple_shaft
1

Tujuan paket adalah untuk mengelompokkan kelas berdasarkan beberapa kriteria (paket berdasarkan jenis / lapisan vs paket berdasarkan fitur, dll.). Saya tidak benar-benar melihat titik untuk membuat paket hanya untuk satu kelas - terutama jika Anda tidak berharap akan ada kelas lain dalam paket ini di masa depan.

Saya juga berpikir bahwa nama paket "util" tidak sepenuhnya tidak berarti - hanya mengelompokkan kelas berdasarkan kriteria tertentu - bagi saya kelas "util" berarti bahwa itu bukan bagian dari domain aplikasi, tetapi juga bukan bagian dari framework (tidak mempengaruhi struktur aplikasi). Ini pada dasarnya hanya perpanjangan (non) perpustakaan standar.

Dalam hal ini saya tidak akan memiliki masalah dengan menempatkan kelas UUID ini ke dalam paket "util". Jika akan ada beberapa kelas utilitas terkait UUID lainnya (seperti kelas terpisah untuk menghasilkan UUID), mudah untuk membuat ulang dan membuat paket "util.uuid" untuk mereka (kecuali jika Anda membuat perpustakaan dan UUID akan menjadi bagian dari antarmuka yang terbuka) , maka Anda harus sedikit "berpikiran maju").

qbd
sumber
1
Ini pendekatan saya. Tidak masuk akal untuk membuat paket yang tidak memiliki tujuan yang jelas. Jika kelas tidak dapat dengan mudah ditugaskan ke paket yang bermakna maka 'util' baik-baik saja dan bahkan mungkin lebih disukai. Biasanya yang terjadi ketika Anda mengikuti adalah bahwa cukup kelas berakhir di util yang terkait dan mereka mudah untuk refactor dari util (setidaknya selama pengembangan) menjadi paket yang bermakna. Jika Anda mencoba membuat paket unik untuk setiap kelas yang tidak Anda ketahui kemana ia pergi maka Anda dapat dengan mudah kehilangan hubungan tersebut dan kesempatan untuk merefleksikan arsitektur yang lebih bersih.
Dunk
@Dunk, itu sebenarnya poin yang sangat bagus - membuat struktur paket yang agak matang akan mencegah Anda melihat organisasi yang lebih baik dan lebih alami.
qbd
1

Paman Bob memiliki beberapa pedoman tentang pemisahan paket.

Tiga prinsip paket pertama adalah tentang kohesi paket, mereka memberi tahu kami apa yang harus dimasukkan ke dalam paket:

  1. Granule reuse adalah granul rilis
  2. Kelas yang berubah bersama dikemas bersama
  3. Kelas yang digunakan bersama dikemas bersama

Jadi, menjawab pertanyaan Anda, siapa / apa yang akan menggunakan kelas UUID, memilikinya sebagai atribut atau menjalankan operasi di dalamnya? Bagaimana grafik ketergantungan Anda ? UUID akan digunakan bersama dengan kelas apa lagi ?

Tergantung pada jawaban Anda, mungkin Anda harus menyebutnya me.myproject.identity paket, yang me.myproject.serialization paket, me.myproject. DTO atau bahkan sesuatu yang lain sama sekali. Mungkin, kelas UUID harus disimpan bersama dengan model Anda dan Anda akan memasukkannya ke dalam paket yang sudah Anda miliki, seperti saya.myproject.models .

HBA
sumber
1
dtohampir tidak berguna secara semantik libatau utils, seluruh dtokonsep adalah anti-pola naif dari pertengahan 90-an, modeltermasuk dalam kategori generalisasi yang tidak berguna yang sama juga
Kami tidak cukup tahu tentang proyek Anda untuk memberi Anda nama yang lebih berguna
Hbas
-2

Pertama-tama, UUID (dengan huruf besar) sepertinya ide yang sangat buruk untuk nama paket atau nama kelas bagi saya, dari semua gaya yang diberlakukan dengan satu atau lain cara semua nama huruf besar dikaitkan dengan "konstanta". Paket dimaksudkan untuk mengatur hal-hal, cara termudah untuk memberi nama suatu paket adalah dengan nilai kelas yang dimilikinya:

  • Anda dapat memilih untuk memisahkan kelas dengan nilai bisnis mereka, misalnya com.example.identifier;
  • atau dengan nilai teknisnya, misalnya com.example.uuid.

Jaga TI tetap sederhana

Tiberiu C.
sumber
2
Contoh kelas ALLCAPS di Jawa: java.util.UUID, java.net.URL, java.util.zip.CRC32, dll
scriptin
@scriptin Tidakkah akan lebih mudah bagi pengembang jika ia dapat membedakan hanya dari gaya topi kelas dari "konstan", anggota dari nama paket dan sebagainya? Mengapa Anda berpikir bahwa CRC32, UUID adalah nama yang bagus untuk sebuah kelas, hanya karena java yang melakukannya? Atau karena ini adalah akronim dari "Pengidentifikasi unik universal" atau "cek redundansi siklik" ... tapi tunggu sebentar! Ada apa dengan java.util.zip.GZIPOutputStreamkelas ini ? GZIPkependekan dari ... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.
1
Kelas adalah tipe, konstanta adalah nilai, tidak ada kebingungan. Saya tidak berpikir nama-nama itu baik atau buruk, saya hanya menunjukkan bahwa (pengkodean) gaya yang Anda bicarakan tidak memaksa kelas untuk memiliki huruf kecil. Dalam Python UUIDhuruf besar juga.
scriptin
Jika Anda melihat / mantain kode setiap hari, gaya itu membuat perbedaan antara pesta "mudah dibaca" dan "kembali dan maju", mengisolasi di sini hanya dengan gaya topi, saya pikir itu lebih berharga untuk diungkapkan melalui topi, jenis anggota (kelas, konstan, paket, dll) daripada fakta yang merupakan akronim.
Tiberiu C.
1
Pertanyaan aslinya tidak ada hubungannya dengan huruf apa yang digunakan ketika menulis nama paket. Secara semantik UUID tidak berbeda dengan Uuid, uuid, UuId, UuID, atau skema kapitalisasi sewenang-wenang apa pun yang menurut Anda adalah "terbaik".
Brandin