Mengapa kami menggunakan nama domain terbalik seperti com.something. atau org.sesuatu. struktur untuk paket Java? Saya paham hal ini membawa keunikan, namun mengapa kita membutuhkan keunikan ini?
Apa pentingnya nama domain terbalik untuk struktur paket java
Jawaban (6)
Nama paket yang unik secara global menghindari tabrakan penamaan antar perpustakaan dari sumber berbeda. Daripada membuat database pusat baru yang berisi nama global, registri nama domain digunakan. Dari JLS:
Konvensi yang disarankan untuk menghasilkan nama paket unik hanyalah sebuah cara untuk mendukung konvensi penamaan paket di atas registri nama unik yang sudah ada dan dikenal luas daripada harus membuat registri terpisah untuk nama paket.
Tentang alasan kami melakukannya secara terbalik: Bayangkan Anda memiliki dua paket penting, paket akuntansi dan paket grafis. Jika Anda menentukannya dalam urutan 'lurus':
accounting.mycompany.org
graphics.mycompany.org
Maka itu berarti ada paket accounting
utama, yang subbagiannya ditujukan untuk mycompany
, dan subbagian dari paket itu disebut paket org
yang sebenarnya Anda gunakan. Namun, Anda menginginkan ini:
org.mycompany.accounting
org.mycompany.graphics
Ini lebih masuk akal. Dari semua paket dari organisasi (org
), Anda melihat mycompany
secara khusus, dan paket tersebut memiliki dua sub-paket, yaitu accounting
dan graphics
.
a.b.c.d
, itu berarti Anda memulai dengan kelas a
, menumpuk di bidangnya b
, menumpuk di c
bidang tersebut, lalu menumpuk di d
bidang tersebut. Secara analogi, organisasi paket harus bekerja dengan cara yang sama. Juga dalam sub-paket paket Python sebenarnya dilakukan seperti yang saya tulis di sini. Jadi itu bukan tidak mungkin, tapi itu sangat bodoh.
- person Claudiu; 12.09.2013
foo :: Int -> Int
berarti foo
memiliki tipe fungsi yang mengambil int dan mengembalikan int). saya melihat itu berhasil. tapi oke, pertimbangkan ini - katakanlah Anda memiliki paket sesuai urutan yang Anda sarankan, di Java. jadi accounting.project
adalah subbagian akuntansi dari project
, dan reporting.project
adalah subbagian pelaporan dari project
. sekarang kamu punya kelas masing-masing, accounting.project.AccountManager
dan reporting.project.ReportGenerator
... bukankah itu terlihat salah? Ini menggabungkan dua konvensi menjadi satu
- person Claudiu; 13.09.2013
account.project.AccountManager.FooBit
vs. reporting.project.ReportGenerator.ReportingSubsystem
. sekarang bagian kiri namanya bersifat spesifik-›generik, namun bagian kanannya bersifat generik-›spesifik. Saya dapat melihatnya berfungsi seperti yang Anda katakan jika sintaks untuk mengakses bidang juga berfungsi dengan menambahkan sesuatu di sisi kiri, tetapi tidak berfungsi seperti itu di Java.
- person Claudiu; 13.09.2013
Seperti yang Anda katakan, membalikkan nama domain sebagai nama paket dasar memastikan keunikan. Misalkan dua perusahaan dengan DN example.com dan example.org keduanya mendefinisikan kelas Karyawan dalam kerangka kerja mereka. Sekarang jika Anda menggunakan kedua kerangka kerja, Anda tidak akan dapat menentukan Karyawan mana yang ingin Anda gunakan dalam kode Anda, tetapi jika keduanya didefinisikan dalam paket com.example dan org.example, Anda dapat memberi tahu kompiler/JVM secara spesifik kelas mana Anda berada mengacu. Jika paket unik tidak ditentukan, Anda akan mendapatkan kesalahan kompilasi atau kesalahan runtime, mis. jika Anda menggunakan kelas karyawan com, tetapi kelas karyawan organisasi dimuat terlebih dahulu dari jalur kelas, Anda akan mendapatkan kesalahan runtime, karena kedua kelas karyawan mungkin tidak memiliki struktur yang sama.
Keunikan diperlukan untuk Pemuatan Kelas.
Ini membantu dengan menghindari tabrakan penamaan. Jika ada kelas dengan nama paket dan nama kelas yang sama, Tabrakan akan terjadi saat mencoba memuat kelas.
Hal ini biasanya terjadi jika ada beberapa perpustakaan (jar) yang berisi kelas dengan nama yang sama.
< br> Lihat juga ini.
Anda memerlukan keunikan jika Anda mungkin perlu mengintegrasikan kode Anda dengan perangkat lunak pihak ketiga, atau memberikannya kepada orang lain untuk diintegrasikan. Jika Anda tidak mengikuti aturan, Anda meningkatkan risiko bahwa suatu saat Anda akan mengalami tabrakan penamaan kelas, dan Anda perlu mengganti nama banyak kelas untuk mengatasinya. Atau lebih buruk lagi, pelanggan Anda harus melakukan penggantian nama kode.
Hal ini juga berlaku ketika kode diproduksi sebagai bagian dari proyek berbeda dalam suatu organisasi.
Seperti yang Anda katakan, ini membawa keunikan, sesuatu yang diperlukan terutama ketika bekerja dengan kode pihak ketiga. Misalnya, anggaplah Anda menggunakan perpustakaan yang saya buat. Saya telah menggunakan paket "foo" dan memiliki kelas bernama Bar di sana. Sekarang jika Anda juga menggunakan nama paket "foo" DAN Anda memiliki kelas bernama Bar, ini berarti implementasi Anda akan mengesampingkan implementasi Bar saya, sehingga implementasi saya tidak dapat diakses. Di sisi lain, jika paket saya adalah "com.mydomain.foo" dan saya memiliki kelas Bar di sana, maka Anda dapat dengan bebas menggunakan nama Bar di salah satu kelas Anda dan kedua kelas masih dapat diidentifikasi secara unik dan digunakan secara terpisah .
Mengapa menggunakan nama domain terbalik sebagai nama paket? Saya kira itu hanya sebuah konvensi untuk memastikan bahwa setiap orang menggunakan namespace yang unik, karena Anda tidak boleh menggunakan domain orang lain dalam nama paket Anda.