名前空間とその内部のクラスに同じ名前を使用すると問題が発生します。
名前空間に複数のクラスが含まれている場合、他のクラスがそこに配置されるのはなぜですか?名前空間の名前の目標は、1つだけでなく、その中のすべてのクラスを記述することであるため、正しくないと感じます。あなたが持っている場合たとえば、JsonSerialization
、BinarySerialization
およびXmlSerialization
名前空間のクラス、それはあなたの名前空間に名前を付けるために理にかなってXmlSerialization
?
通常起こることは、既存の名前空間からのクラスの抽出、または複数のクラス間のマージまたは他の再編成のために、あなたは主要なクラスを含む名前空間を見つけます。マイナークラスは、元のクラスとわずかに関連しているため、徐々に配置されます。たとえば、名前空間がLogParser
単一のクラスを含むことができLogParser
、その後、誰かプットLogConverter
それはかなりパーサに関連しているため、その後、LogSearcher
すぐによう:などをここでの問題は、名前空間の名前が変更されていなかったということですLogConverter
、追加されました名前は、LogsProcessing
または単に変更する必要がありますLogs
。
名前空間に含まれるクラスが1つだけの場合は、コード編成内の問題の兆候である可能性があります。
適切なSOLID原則を持つ単一のクラスがコードベースの他のものとは非常に異なり、したがって専用の名前空間に置かれる状況を数回見ましたが、そのようなケースはまれです。多くの場合、これは問題を示しています。同様に、単一のメソッドを含むクラスを持つことを妨げるものは何もありませんが、多くの場合、そのようなクラスは問題を示します。
名前空間に含まれるクラスが1つだけの場合でも、通常、クラスに名前を付けるときはより具体的に、名前空間に名前を付けるときはより一般的な方法があります。ある特定の瞬間に、ABC形式で記述されたファイルをDEF形式に変換するアプリケーションを想像してください。変換には、ビジネスオブジェクトへの、またはビジネスオブジェクトからの逆シリアル化/シリアル化は必要ありません。また、変換クラス自体の中に配置するのに十分短い一連の正規表現を適用することにより行われます。AbcToDefConverter
。変換ロジックはすべて、約10の相互依存メソッドで約80 LLOCかかります。既存のクラスを分割したり、追加のクラスを作成したりする必要がない状況のようです。アプリケーションの残りの部分は変換とは関係がないため、クラスを既存のネームスペース内の他のクラスとグループ化することはできません。したがって、という名前空間を作成しますAbcToDefConverter
。その点で本質的に問題はありませんが、などのより一般的な名前を使用することもできConverters
ます。より短い名前が優先され、繰り返しがスローされるPythonなどの言語では、になることさえありconverters.Abc_To_Def
ます。
したがって、名前空間に含まれるクラスとは異なる名前を使用してください。クラスの名前はクラスが何をしているかを示す必要がありますが、名前空間の名前はその中に置かれているすべてのクラスに共通することを強調する必要があります。
ちなみに、ユーティリティクラスは本質的に間違っています。任意精度の演算など、特定の何かを含む代わりに、他のクラスでは見つけられなかったすべてのものを含んでいます。これはMiscellaneous
、デスクトップ上のディレクトリのように、単に名前が間違っているだけです。これは、組織の欠如を示しています。
命名には理由があります:後で物を見つける必要があるときにあなたの人生を楽にするため。チャートを描画する必要がある場合は、「チャート」または「プロット」を検索してみてください。アプリが請求書を生成する方法を変更する必要がある場合は、「invoic [e / ing]」または「bill」を検索します。同様に、「ええと、この機能はおそらくその他にもあるはずです」と自分自身に言うケースを想像してみてください。できません。
.NET Frameworkを見てください。これらのクラスのほとんどはユーティリティクラスではありませんか?つまり、彼らはビジネスドメインとはほとんど関係がありません。金融アプリ、eコマースWebサイト、または次世代の教育プラットフォームで作業している場合、XMLのシリアル化やファイルの読み取り、SQLクエリの実行、トランザクションの実行などがすべてユーティリティです。ただし、これらは、UtilitySerialization
またはと呼ばれるUtilityTransaction
ことはなく、Utility
名前空間にはありません。それらは適切な名前を持っているので、必要なときに見つけることができます(簡単に、.NET開発者に感謝します!)。
アプリでよく再利用するクラスについても同じことが言えます。これらはユーティリティクラスではありません。それらは特定のことを行うクラスであり、実際に行うことはクラスの名前であるべきです。
ユニットとユニットの変換を処理するコードを作成したとします。名前を付けてUtility
同僚に嫌われるかもしれません。またはあなたはそれに名前を付けることUnits
とUnitsConversion
。