Merit of Namepsaces / Paket


14

Beberapa bahasa pemrograman (misalnya Java dan C ++) memiliki fitur bahasa yang disebut "paket" atau "ruang nama". Seberapa bermanfaatkah memiliki ruang nama? Dimungkinkan untuk menandai fungsi dan kelas sebagai milik beberapa perpustakaan tertentu tanpa menggunakan fitur bahasa seperti itu, seperti yang dilakukan SDL (misalnya SDL_BlitSurface()). Apakah ruang nama tidak cukup bermanfaat untuk dimiliki? Apakah mereka berguna di perpustakaan tetapi tidak di aplikasi? Apakah mereka berguna di mana-mana kecuali untuk proyek-proyek kecil? Pikiran?

Jawaban:


16

Bukankah awalan nama sama dengan penempatan nama , kecuali bahwa itu dilakukan dengan cara yang kurang bermanfaat dan lebih sulit dibaca / diurai? Bukankah pertanyaan itu menjawab sendiri?


Hanya menempatkan awalan di awal nama pengidentifikasi tidak sama dengan menggunakan fitur bahasa seperti ruang nama. Misalnya, dalam C ++, Anda bisa mengatakan bahwa Anda adalah usingnamespace tertentu dan kemudian tidak harus meletakkan awalan di awal pengidentifikasi di namespace itu.
compman

2
@ user9521 - itu maksud saya ...
Nicole

+1 Satu keuntungan besar namespaces adalah Anda dapat melewati / mempersingkat awalan saat tidak diperlukan - di namespace tempat hal tertentu yang dirujuk didefinisikan, oleh using, oleh import xxxxxxxxx as yyy, dll.

1
Karena kebanyakan programmer malas, apakah Anda lebih suka menyatakan using SDL;atau harus mengetik di SDL_*semua tempat?
Berin Loritsch

2
+1, tetapi saya pikir Anda benar-benar bermaksud "kurang bermanfaat, lebih sulit dibaca, dan tidak diverifikasi oleh kompiler."
Larry Coleman

5

Sebagian besar (semua?) Bahasa dengan ruang nama cenderung berorientasi objek. Sering kali nama yang dapat dibaca manusia untuk suatu jenis pantas, meskipun ada beberapa implementasi yang tidak kompatibel. (ini memunculkan masalah lain pada penggunaan kembali berorientasi objek, tapi bukan itu pertanyaan ini tentang). Misalnya, di Jawa Anda memiliki Timer yang digunakan untuk tugas-tugas UI latar belakang, dan Timer yang digunakan untuk tugas-tugas aplikasi latar belakang (tidak terkait dengan AWT / Swing). Namespace memungkinkan Anda untuk memiliki objek dengan nama yang sama ini hidup di berbagai sub-API.

Alasan bahwa ruang nama muncul berkaitan dengan tugas yang tidak masuk akal untuk mengantisipasi apa yang pengembang lain akan beri nama objek mereka. C ++ memperkenalkan konsep (atau setidaknya adalah bahasa pertama yang saya kenal dengan konsep tersebut), dan itu sangat membantu meskipun tidak ada pedoman tentang praktik penggunaan terbaik. Java mengadaptasi konsep dan menambahkan beberapa "praktik terbaik" yang memasukkan nama perusahaan Anda di namespace. Dengan begitu Anda hanya perlu khawatir tentang perusahaan Anda sendiri.

Awalan bisa menjadi sangat berantakan. Kapan Anda menerapkannya? Kapan Anda tidak menerapkannya? Apakah struktur / kelas / metode global mendapatkan awalan? Bagaimana dengan metode? Bagaimana dengan properti di struct. Saya telah melihat semua ini dalam kode, meskipun untungnya tidak semuanya sekaligus. Namespaces menyediakan kemungkinan untuk semua pertanyaan ini, dan menjadikannya fitur bahasa daripada "praktik terbaik" pribadi.


Haskell memiliki ruang nama (modul) dan tidak berorientasi objek.
Jeremy Heiler

3

Saya pikir ruang nama adalah ide bagus. Mereka membantu mencegah konflik penamaan dengan membatasi ruang lingkup nama. Dalam paket Java, konvensi penamaan paket yang disarankan didasarkan pada nama domain, yang harus unik, yang membantu mencegah konflik penamaan atas pustaka kustom. Secara keseluruhan, mereka membuat penamaan yang sedikit lebih unik dalam arti luas, sementara masih memberi programmer sedikit lebih banyak kebebasan dalam menamai karya-karyanya tanpa harus mengikuti beberapa konvensi penamaan yang tidak jelas.


1
Namun, dalam kasus konvensi khusus Java, tidak semua orang memiliki situs web. Juga, jika Anda pernah memindahkan program Anda dari satu situs web ke situs web lain (misalnya Sourceforge ke Github), masuk akal tetapi tidak nyaman untuk mengubah paket jika hal lain bergantung pada kode Anda.
compman

1
Konvensi Java berlaku untuk organisasi Anda, bukan tempat diselenggarakannya. Anda dapat mendeklarasikan diri Anda sebagai organisasi dan selesai melakukannya. Ada juga masalah URL yang memungkinkan karakter yang tidak dapat digunakan dalam nama paket. Tapi kita tidak akan pergi ke sana. Jadi untuk Anda, cukup gunakan "me.user9521" sebagai nama paket Anda dan Anda sudah siap.
Berin Loritsch

1
Konvensi ini bukan tentang nama web, tetapi tentang nama domain. Anda dapat memiliki domain tanpa situs web.
David Thornley

1

Ruang nama / Modul / Paket berguna untuk menghindari konflik nama. Demikian juga awalan nama tetapi ruang nama memiliki kenyamanan tambahan untuk dapat mengimpor simbol ke namespace saat ini sehingga Anda tidak perlu repot dengan seluruh Namespace :: *.

Beberapa bahasa (seperti Python) memperluas kemampuan ini dengan memungkinkan Anda hanya mengimpor simbol tertentu ke modul Anda saat ini atau mengimpor simbol sebagai nama yang berbeda. Ini berguna jika Anda hanya tertarik pada beberapa kelas / fungsi / konstanta atau jika beberapa simbol bertentangan dengan simbol di namespace Anda tetapi beberapa tidak.

Beberapa bahasa (seperti Ruby) memungkinkan Anda untuk memasukkan metode modul ke dalam kelas Anda. Ini berguna untuk polimorfisme dan obat generik. Misalnya, jika Anda memiliki beberapa kelas yang memiliki iterator yang bertindak dengan cara yang sama, Anda bisa mencampur metode untuk semua kelas ini dari modul terpisah yang menyediakan metode untuk mengurutkan dan memfilter data dalam objek. Ini memungkinkan has ahubungan serta hubungan is a(warisan).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.