多すぎる“パターンサフィックス” -デザインの匂い?
-
02-07-2019 - |
質問
" InstructionBuilderFactoryMapFactory"というクラスを作成しているところを見つけました。それは4つの「パターンサフィックス」です。 1つのクラスで。すぐにこのことを思い出しました:
http://www.jroller.com/landers/entry/the_design_pattern_facade_pattern
これはデザインの匂いですか?この数に制限を課すべきですか?
一部のプログラマーは、他のことに対して同様のルールを持っていることを知っています(たとえば、CでNレベル以下のポインター間接参照)
すべてのクラスが必要なようです。文字列から工場への(修正された)マップがあります-私はいつも何かをしています。リストは長くなっているので、ビルダーを使用するクラスのコンストラクター(マップから取得したファクトリーによって作成されます...)から移動したいと思います。通常どおり、シングルトンは避けています。
解決
私はそれをデザインの匂いだと思っています-抽象化のすべてのレベルが十分な重量を引き出しているかどうかを考えさせられます。
クラスに「InstructionBuilderFactoryMapFactory」という名前を付けたい理由がわかりませんか?他の種類の工場があります-InstructionBuilderFactoryMapを作成しないものはありますか?または、マッピングする必要がある他の種類のInstructionBuildersFactoriesがありますか?
これらは、このようなクラスの作成を開始する際に考慮すべき質問です。これらのさまざまなファクトリファクトリをすべて1つに集約してから、ファクトリを作成するための個別のメソッドを提供することができます。それらの工場工場を別のパッケージに入れて、より簡潔な名前を付けることもできます。これを行う別の方法を考えてください。
他のヒント
良いヒント:クラスのパブリックAPI(およびその名前を含む)は、実装ではなく意図を明らかにする必要があります。私は(クライアントとして)ビルダーパターンを実装したかファクトリパターンを実装したかを気にしません。
クラス名の見た目が悪いだけでなく、クラス名が何をするかについても何も伝えません。名前は、その実装と内部構造に基づいています。
(時には)ファクトリを除き、クラスでパターン名を使用することはほとんどありません。
編集:
Coding Horrorの命名に関する興味深い記事を見つけました。チェックしてください!
クラス名のパターンの多くは、間違いなく匂いですが、匂いは明確な指標ではありません。これは、「1分間停止して設計を再考する」ための信号です。何回も座って、より明確な解決策が明らかになると思うとき。時々、手元の制約(技術/時間/人力など)により、今のところ臭いを無視する必要があることを意味します。
具体的な例としては、ピーナッツギャラリーからの提案は、文脈がなければ良いアイデアだとは思いません。
私は同じことを考えてきました。私の場合、豊富な工場は「テスト容易性のために構築」によって引き起こされます。たとえば、次のようなコンストラクタがあります:
ParserBuilderFactoryImpl(ParserFactory psF) {
...
}
ここにパーサーがあります-必要な究極のクラスです。 パーサーは、ビルダーでメソッドを呼び出すことによって構築されます。 ビルダー(ビルドする必要のあるパーサーごとに新しいビルダー)は、ビルダーファクトリから取得されます。
今、ParserFactoryとは何ですか?ああ、私はあなたが尋ねてくれてうれしいです!パーサービルダーの実装をテストするには、そのメソッドを呼び出して、どのようなパーサーが作成されたかを確認する必要があります。ビルダーが作成している特定のパーサークラスのカプセル化を壊さずにそれを行う唯一の方法は、パーサーが作成される直前にインターセプションポイントを配置して、コンストラクターに何が入るかを確認することです。したがって、ParserFactory。これは、パーサーのコンストラクターに渡されるものを単体テストで観察するための単なる方法です。
これをどのように解決するかはよくわかりませんが、ファクトリよりもクラスを渡す方が良いと感じています。また、静的メンバーではなく適切なクラスメソッドがあれば、Javaの方がうまくいくと思います。