(Saya belum membaca Kode Bersih dan tidak tahu banyak tentang Java.)
Apakah masuk akal untuk menerapkan gagasan menciptakan banyak entitas kecil, masing-masing dengan tanggung jawab yang jelas, untuk ruang nama?
Ya, seperti halnya dengan refactoring ke dalam beberapa kelas dan beberapa fungsi.
Haruskah sekelompok kecil kelas terkait selalu dibungkus dalam namespace?
Tanpa benar-benar menjawab: ya, Anda setidaknya harus menggunakan satu namespace tingkat atas. Ini dapat didasarkan pada proyek, organisasi, atau apa pun yang Anda suka, tetapi menggunakan beberapa nama global akan mengurangi konflik nama. Satu namespace untuk mengelompokkan semua yang lain di bawahnya hanya memperkenalkan satu nama global. (Kecuali fungsi "C" eksternal, tapi itu karena interoperabilitas C dan hanya mempengaruhi fungsi "C" eksternal lainnya.)
Haruskah sekelompok kecil kelas terkait dibungkus dalam namespace yang didedikasikan untuk mereka? Mungkin. Terutama jika Anda menemukan diri Anda menggunakan awalan umum pada kelas-kelas tersebut - FrobberThing, FrobberThang, FrobberDoohickey - Anda harus mempertimbangkan namespace - frobber :: Thing dan sebagainya. Ini masih berada di bawah namespace root Anda atau namespace lain jika mereka merupakan bagian dari proyek yang lebih besar.
Apakah ini cara untuk mengelola kompleksitas memiliki banyak kelas kecil, atau apakah biaya mengelola banyak ruang nama akan menjadi penghalang?
Mengambil contoh di atas nama awalan, tidak sulit untuk mengelola frobber :: Thing daripada FrobberThing. Bahkan mungkin lebih mudah dengan beberapa alat, seperti dokumentasi dan penyelesaian kode. Ada perbedaan dengan ADL, tetapi ini dapat menguntungkan Anda: lebih sedikit nama dalam ruang nama terkait membuat ADL lebih mudah untuk diketahui, dan Anda dapat menggunakan deklarasi untuk menyuntikkan nama tertentu ke dalam satu namespace atau lainnya.
Alias Namespace memungkinkan Anda menggunakan nama yang lebih pendek untuk namespace yang lebih panjang dalam konteks tertentu, yang sekali lagi memungkinkan penggunaan yang lebih mudah:
void f() {
namespace CWVLN = Company_with_very_long_name; // Example from the standard.
// In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
namespace fs = boost::filesystem; // Commonly used.
}
Pertimbangkan Boost, yang memiliki ruang nama root tunggal, boost, dan kemudian banyak ruangnama - boost :: asio, boost :: io, boost :: filesystem, boost :: tuple, dll. - untuk berbagai perpustakaan. Beberapa nama "dipromosikan" ke root namespace:
Semua definisi ada di namespace :: boost :: tuple, tetapi nama yang paling umum diangkat ke namespace :: boost dengan menggunakan deklarasi. Nama-nama ini adalah: tuple, make_tuple, tie and get. Selanjutnya, ref dan cref didefinisikan langsung di bawah :: boost namespace.
Perbedaan terbesar dari bahasa dengan modul "nyata" adalah seberapa umum menggunakan struktur yang lebih datar, yang sebagian besar terjadi karena itulah cara kerjanya kecuali jika Anda mengambil upaya ekstra dan spesifik untuk mendefinisikan nama bersarang.