Apa pentingnya nama domain terbalik untuk struktur paket java

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?


person Vaishak Suresh    schedule 19.03.2010    source sumber
comment
Ini sebenarnya lebih sejalan dengan konvensi di mana kiri ke kanan berpindah dari umum ke khusus -- pikirkan jalur file atau sistem desimal Dewey. Sebaliknya, Anda dapat bertanya mengapa nama domain melanggar konvensi ini (atau mengapa kami menulis tanggal dengan cara yang tidak ramah terhadap penyortiran).   -  person harpo    schedule 19.03.2010
comment
@harpo: Benar. Nama domain dan tanggal sebaiknya ditulis terbalik.   -  person Leo Jweda    schedule 19.03.2010
comment
Sintaks server.domain.tld merupakan cara berbahasa Inggris untuk mengekspresikan sesuatu (pengubah sebelum objek - bola merah). Bahasa Spanyol, misalnya, memiliki sintaks pengubah objek yang lebih logis (bola roja).   -  person dlchambers    schedule 02.07.2021


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.

person Laurence Gonsalves    schedule 19.03.2010
comment
DNS sebenarnya tidak ada hubungannya sama sekali dengan itu (+1) - person Fredrik; 19.03.2010
comment
@Fredrik tidak ada pencarian DNS yang benar-benar dilakukan, tetapi registri nama unik yang dikenal luas yang dirujuk dalam JLS adalah sistem nama domain. - person Laurence Gonsalves; 19.03.2010

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.

person Claudiu    schedule 19.03.2010
comment
+1. Perhatikan bahwa (sayangnya?) Java tidak mendukung sub-paket. Sebuah subpaket tidak lebih dekat dengan induknya (sejauh menyangkut visibilitas) dibandingkan dengan paket yang sama sekali tidak terkait. Hal ini tentu saja masih berguna untuk tujuan organisasi kode. - person Thilo; 19.03.2010
comment
Ini hanya menyiratkan bahwa org adalah paket konkret karena Anda tidak benar-benar menerapkan contoh Anda sepenuhnya. Bagaimana jika bagian pertama adalah paket betonnya? Apakah itu mustahil? -1 Strawman, negara-negara yang membaca dari kanan ke kiri tidak akan setuju di sini :P - person sinni800; 12.09.2013
comment
@ sinni800: -1 pada komentar Anda. ketika Anda menulis kode di Java, kode itu ditulis dari kiri ke kanan. Selanjutnya, jika Anda memiliki 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
comment
@Claudiu Tapi ada beberapa bagian bahasa (yang diwarisi dari sintaks gaya C) di mana, meskipun ada pembacaan dari kiri ke kanan, ada gaya kanan ke kiri (dalam hal kata, bukan karakter. Untuk contoh definisi fungsi. Tipe pengembalian diutamakan, meskipun sebagai manusia, Anda tidak akan mengutamakannya.). Saya hanya mencoba mengatakan bahwa tidak ada kebenaran universal bahwa sub-paket harus bergerak dari kiri ke kanan. Tapi saya tidak tahu tentang python. - person sinni800; 12.09.2013
comment
@ sinni800: hmm ya semuanya soal konvensi. kiri-›kanan menjadi umum-›lebih spesifik cukup umum... dapatkah Anda menyebutkan bahasa pemrograman apa pun yang memiliki paket dan tidak melakukannya dari kiri ke kanan? - person Claudiu; 12.09.2013
comment
@Claudiu saya tidak bisa, maaf. Itu hanyalah sebuah pemikiran dan upaya untuk melepaskan sedikit pemikiran konvensional tersebut. Tapi Golang, misalnya, dengan paket eksternal menggunakan nama host/proyek. github.com/youruser/yourproject, misalnya. Mereka tidak dibagi berdasarkan bagian dari nama host, melainkan dibagi berdasarkan nama host sebenarnya versus nama proyek. Golang benar-benar mengajari saya banyak hal tentang hal-hal ini, dan ini merupakan penyimpangan dari sintaks C biasa: var name string, func name(parameters) returnType... - person sinni800; 13.09.2013
comment
@ sinni800: saya telah menggunakan Haskell yang juga memiliki deklarasi tipe seperti yang Anda katakan (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
comment
@sinni800: atau jika Anda memiliki subkelas, 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
comment
@Claudiu Oke, bagaimana jika kita mencoba mengubahnya sedikit... account.project::AccountManager (ini masih terlihat buruk, tetapi perbedaannya ada di sini sekarang)... Semuanya mungkin ada solusinya, tapi solusinya adalah Anda disarankan sebenarnya tidak. Sejujurnya, saya tidak pernah ingin menyarankan hal seperti itu. - person sinni800; 13.09.2013
comment
mari kita melanjutkan diskusi ini di chat - person Claudiu; 13.09.2013
comment
Ini lebih masuk akal, kecuali Anda pernah menggunakan internet sebelumnya. Dalam hal ini, hal itu tidak perlu terlalu berlebihan. - person Erik Aronesty; 06.09.2018

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.

person saugata    schedule 19.03.2010

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.

person Padmarag    schedule 19.03.2010
comment
Pemuatan seperti apa yang Anda bicarakan? dan bagaimana cara memberi nama secara unik untuk mencegah kemungkinan tabrakan? Saya berasumsi bahwa konflik apa pun yang terjadi saat memuat, terjadi jika nama kelasnya juga sama. - person Vaishak Suresh; 19.03.2010
comment
@Vaishak: Asumsi itu salah. Nama unik yang mengidentifikasi kelas adalah paket + nama kelas. Jika Anda berada dalam paket yang sama atau jika Anda telah mengimpor paket secara khusus atau nama kelas yang sepenuhnya memenuhi syarat, Anda dapat menggunakan namanya saja. Sama seperti melakukan panggilan telepon, biasanya Anda tidak perlu menentukan kode area jika Anda sudah menggunakan nomor telepon yang sama, tetapi nomor telepon lengkap yang Anda berikan akan tetap menyertakan kode area. - person Fredrik; 19.03.2010
comment
@Fredrik Asumsi saya sejalan dengan penjelasan Anda :) Makanya saya bilang konflik terjadi jika nama kelasnya juga sama. Tapi pertanyaanku sudah terjawab sekarang. Terima kasih! - person Vaishak Suresh; 19.03.2010

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.

person Stephen C    schedule 19.03.2010

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.

person Kim L    schedule 19.03.2010