一般的なシステムでの名前空間とクラスの命名に関するベスト プラクティスについては、多くの適切なガイダンスがあります。
利用可能なガイダンスでは対処されない問題を引き起こすシステムをモデル化しています (少なくとも私はそれを見つけることができません)。システムには当然、同じ名前を共有するいくつかのクラスがあります。
簡単にするために、問題の本質を捉えたドメインの例を使用します。
オプション 1: 名前空間と名前空間のエイリアシングを使用して、コード内のクラスを区別できます。クラスは、名前空間全体での重複を気にせずに命名されます。
サッカー.攻撃.戦術
class Play { }
サッカー.ディフェンス.戦術
Class Play { }
Offensive = Football.Offense.Tactics の使用
ディフェンシブ = Football.Defensive.Tactics の使用
{
Offensive.Play offensivePlay = new Offensive.Play();
Defensive.Play defensivePlay = new Defensive.Play();
}
オプション 1 問題:
- ジュニア開発者を混乱させる可能性があります。
- 名前空間を消費するすべてのものにエイリアスを追加すると、オーバーヘッドが発生します。
- エイリアシングを使用しないと、誰にとっても混乱するコードになります。
オプション 2: 名前空間を使用する代わりに、本質的に名前空間のセマンティクスを組み込んだクラスに名前を付けます。(オフェンシブプレーとディフェンシブプレー)。
オプション 2 問題:
- 長いクラス名の可能性。例: OffensivePresnapAdjustmentType
名前空間のセマンティクスをクラス名に埋め込むと、クラス名が繰り返されます。
- オフェンシブベースプレイ
- オフェンシブフォーメーション
- オフェンシブプレー
- オフェンシブプレイヤー
- 攻撃的なパッケージ
- オフェンシブPresnapAdjustment
- オフェンシブPresnapAdjustmentType
- (そして、さらに多くの防御的同等物に加えて。)
- あまり効果のないインテリセンス (Visual Studio)
オプション 3: Football.Offense と Football.Defense の 2 つのアセンブリを作成します。(これはオプション 1 と同じで、さらにきれいに分離できる可能性があります)
オプション 3 問題:
- オプション 1 と同じ問題。
- 複数のアセンブリの複雑さを紹介します。
私は 1 番目または 3 番目のオプションに傾倒していますが、将来のリリースで多くの面倒な名前空間とクラス名のリファクタリングが必要になるかどうかを判断するのに十分な実務経験がありません。
名前空間を設計し、クラスに適切な名前を付けて、いくつかのメジャー リリースでの時間の試練に耐えられるようにしたいと考えています。
この状況でのベストプラクティスについてどう思いますか?