(私はClean Codeを読んでおらず、Javaについてあまり知りません。)
それぞれが明確に定義された責任を持つ多くの小さなエンティティを作成するというアイデアを名前空間に適用することは理にかなっていますか?
はい、複数のクラスと複数の関数へのリファクタリングと同様に。
関連するクラスの小さなグループは常に名前空間でラップされるべきですか?
実際に答えずに:はい、少なくとも1つのトップレベル名前空間を使用する必要があります。これは、プロジェクト、組織、またはあなたが好きなものに基づいて行うことができますが、少数のグローバル名を使用すると、名前の競合を減らすことができます。その下にある他のすべてをグループ化する単一の名前空間は、1つのグローバル名のみを導入します。(extern "C"関数を除きますが、これはCの相互運用性のためであり、他のextern "C"関数にのみ影響します。)
関連するクラスの小さなグループを専用の名前空間でラップする必要がありますか? 多分。特に、FrobberThing、FrobberThang、FrobberDoohickeyなどのクラスで共通のプレフィックスを使用していることに気付いた場合は、名前空間(frobber :: Thingなど)を考慮する必要があります。これは、より大きなプロジェクトの一部である場合、ルート名前空間または別の名前空間の下にあります。
これは、多くの小さなクラスを持つ複雑さを管理する方法ですか、それとも多くの名前空間を管理するコストは法外なものでしょうか?
接頭辞付きの名前の上記の例を取ると、frobber :: Thingの管理はFrobberThingより難しくありません。文書化やコード補完などの一部のツールを使用するとさらに簡単になる場合があります。ADLには違いがありますが、これは有利です。関連付けられた名前空間の名前が少ないため、ADLの把握が簡単になり、宣言を使用して特定の名前を1つの名前空間に挿入できます。
名前空間エイリアスを使用すると、特定のコンテキストで長い名前空間に短い名前を使用できます。これにより、再び簡単に使用できるようになります。
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.
}
さまざまなライブラリーに対して、単一のルート名前空間、ブースト、そして多くのサブ名前空間(boost :: asio、boost :: io、boost :: filesystem、boost :: tuplesなど)を持つBoostを検討してください。 一部の名前は、ルート名前空間に「昇格」されます。
すべての定義は名前空間:: boost :: tuplesにありますが、最も一般的な名前は、宣言を使用して名前空間:: boostに引き上げられます。これらの名前は、tuple、make_tuple、tieおよびgetです。さらに、refおよびcrefは:: boost名前空間で直接定義されます。
「実際の」モジュールを備えた言語との最大の違いは、よりフラットな構造を使用することです。これは、ネストされた名前を定義するための特別な努力をしない限り機能するためです。