Sebagai seorang strawman mempertimbangkan paket java.util
itu 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 UUID
apa nama paket semantik yang benar untuk kelas itu?
Saya sedang berupaya mengimplementasikan UUID
kelas saya sendiri agar lebih ringan. Saya tidak ingin menggunakan me.myproject.util.UUID
nama paket saya.
Saya mempertimbangkan me.myproject.rfc4122.UUID
tetapi itu tidak menyiratkan semantik dari penggunaan UUID
.
Saya juga mempertimbangkan me.myproject.uuid.UUID
tetapi 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 packages
di Jawa tidak secara semantik setara dengan modules
di Python.
Saya juga mempertimbangkan me.myproject.UUID
tetapi 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.UUID
tetapi ini tidak memiliki makna semantik selain .util
dan hanya mengganti nama masalahnya.
semantics
: cabang linguistik dan logika yang berkaitan dengan makna .
me.myproject.UUID
? Ataume.UUID
from me.myproject.uuid import UUID, GetUUIDInfo
terlihat OK. Mungkin ada lebih dari satu hal yang diekspor dalam sebuah modul.identity
atauidentifiers
menaruh saran Anda dengan sedikit penjelasan lebih sebagai jawaban itu mungkin akan diterima.Jawaban:
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.
sumber
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").
sumber
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:
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 .
sumber
dto
hampir tidak berguna secara semantiklib
atauutils
, seluruhdto
konsep adalah anti-pola naif dari pertengahan 90-an,model
termasuk dalam kategori generalisasi yang tidak berguna yang sama jugaPertama-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:
com.example.identifier
;com.example.uuid
.Jaga TI tetap sederhana
sumber
java.util.UUID
,java.net.URL
,java.util.zip.CRC32
, dlljava.util.zip.GZIPOutputStream
kelas ini ?GZIP
kependekan dari ...? there is also a
java.util.zip.ZipOutputStream`UUID
huruf besar juga.