私は組織に夢中です-おそらくコーディングを楽しむ本当の理由です。だから私はすべてに名前空間を付けます。しかし、冗長であることによって私がそれを間違っているのかどうかだけ私は興味があります。
これは正しいと思います
namespace System {
class File {};
class Monitor {};
class Logger {};
}
これを考えてください。これは私がやっていることのようです
namespace System {
class SystemFile {};
class SystemMonitor {};
class SystemLogger {};
}
私は冗長ですか?それだけです、SystemFile
はシステム内のファイルです。 SystemMonitor
はシステムを監視します。
ユースケースでは、どちらを好みますか?
class Application {
public:
System::Monitor monitor;
// or
System::SystemMonitor monitor;
};
名前空間を間違って使用していますか?
間違って。副詞です。
そして答えはおそらくです。
ユースケースでは、どちらを好みますか?
いくつかの妥当なテストがあります。読みやすく、言いやすく、タイプしやすく、読みやすい式にフィットしやすく、それとも使いやすいですか。
わかりやすさ、読みやすさ、使いやすさ、正確さを損なうことなく、何かを取り出すことができますか?
System::SystemMonitor monitor;
だから、私の頭の中では、「システムシステムモニターモニター」のように聞こえます。
何故なの System::SystemMonitor systemMonitor
?またはSystem::SystemMonitor::Monitor systemMonitor
?追加の情報なしで入力を追加し、メリットなしを追加するためです。
逆に、System::SystemMonitor
およびsimplifyを取得するにはSystem::Monitor
-マイナス面はありますか?できません。明確かつ正確に保ちながら何かを簡略化できる場合は、一般的にIMOを使用する必要があります。
モジュール名をタイプの前に付けるには、いくつかの正当な理由があります。 1つはCを記述していること、もう1つは名前空間全体にusing
を注入することを期待していることです。あなたはすでにそれらの両方を除外しているので、タイプ名を悪化させる言い訳は残っていません。
もちろんそれはあなたの意図次第です。
名前の競合を回避し、主に修飾名を使用する場合、無駄のないアプローチの方が冗長性が低く、読みやすくなります。System::File
はSystem::SystemFile
よりも便利です。
反対に、完全な名前空間にusing
を注入したい場合は、もちろんSystemFile
があいまいになることはありません。しかし、特定の名前空間を最初に作成することは、後で何らかのグローバルマグマにそれらを溶解するためである場合、どのような意味がありますか。
次に、一貫性の問題があります。しばらくして、System
をPlatform
名前空間にネストすることにしたとします。リーンアプローチでは、心配する必要はありません。それはPlatform::System::File
になります。冗長なアプローチでは、SystemFile
を維持するか、Platform::System::PlatformSystemFile
を使用するかを決定する必要があります。したがって、あなたの名前は名前空間組織と結びつき始めます。これは、懸念の分離の原則に反します。
次に、より高度な名前空間戦略が登場します。実際には、MacOS
名前空間とWindowsOS
名前空間があり、それぞれがわずかに異なるFile
を実装しているとします。コンパイル時に namespace alias を使用して構成を行います。例えば:
namespace System = Platform::MacOs;
....
void doSomething() {
using System::File; // works regardless of alias choice
File xxx;
...
}
したがって、懸念事項を分離すること、つまり「アイテム」名を囲んでいる名前空間から独立させることで、柔軟性が大幅に向上します。