実装クラスで設計パターン名を使用するのは良い考えですか?[閉まっている]


28

最近、私はたくさんの適度に大きなPythonのコードベースに出くわしたMyClassAbstractFactoryMyClassManagerMyClassProxyMyClassAdapterなどのクラス。

一方で、それらの名前は、対応するパターンを調査し、学習するように私を指し示しましたが、クラス何をするのかをあまり説明していませんでした。

また、彼らはプログラミングの単語の禁止リストに収まるように見える:variableprocess_available_informationdataamountcompute:私たちの機能については何も教えていない、過度に広範な名前、単独で使用する場合

CommunicationManagerそれとも、あるべきPortListenerでしょうか?または、私は問題をまったく理解していないかもしれません...?


あなたは、パターンが何をするかに精通している場合、パターン名はまともな説明である、しかしちょうどパターン名は悪い考えで、それはなどMyClassFactory、FooAdapterを、持っている方が良いです
ラチェットフリーク

質問を編集して、クラスが単に「AbstractFactory」と呼ばれるのではなく、いくつかの説明的な言葉もそこにあることを示しました。
ヴォラック

1
...彼らはそれをのFctory代わりに真剣に呼んでいましたFactoryか、それとも単なるタイプミスですか?
イズカタ

@Izkata、笑、私の悪い。しかし、アダプターとアダプターがありました!
ヴォラック

回答:


47
  • AbstractFactory確かに名前の選択としては貧弱です。このファクトリーによって作成されたものを知る方法はありません。またAnimals を作成するエンティティーを探すと、対応するファクトリーを名前で見つけることはできません。

  • AnimalAbstractFactoryほとんどの言語では、署名のキーワードと重複するため、賢明な選択でもありませんabstract

    これは言われています、実際に含めるために、コメントによって強調されるいくつかの正当な理由があります Abstract名前があります。完全な署名を持たないコンテキストだけでなく、名前だけでなくAnimalFactory、インターフェースを維持することもあります。賢明な選択かもしれません(残念ながら、言語/フレームワークの慣例では、インターフェースの前にを付けますI)。

  • AnimalCreationUtilityまた、悪い選択です。それがファクトリーである場合、コードを読む人のために物事を簡単にし、工場それを呼び出します

  • abstract AnimalFactory大丈夫です。これは、冗長性を持っており、それがあることは明らかであるしない抽象その子への動物の代表者作成の工場。

そのため、デザインパターンの名前を含めることは良い考えですが、名前の一部にすぎず、署名の他の部分と重複してはいけません。


2
「このモジュールでは、MVCを実装しています。理由:...モデル:...ビュー:...コントローラー:...構造マップ:... API:。 .. "。
ヴォラック

37
@Vorac:明確な名前を付けることは、コメントに頼るよりも常に優れています。
アルセニムルゼンコ

2
@Voracは遅かれ早かれ、その顕著なコメントを更新せずに(またはその存在さえも知らずに)新しいクラスを追加します。アプリ全体で一貫して使用される命名規則を見落とすことははるかに困難です。
コンラッドモラウスキ

2
プロジェクトソリューションを参照しているときに、各クラスファイルを開いてその機能を確認しますか?いいえ。だからこそ、わかりやすい名前のクラス/ファイルを用意する方が常に良い考えです。
マトリックス

2
私は2番目の点に親切に同意したいと思います:AnimalAbstractFactoryは良い選択だと思います、それはクラス宣言では冗長ですが、子クラス宣言では非常に役立つでしょう:LionFactoryはAnimalAbstractFactoryを拡張し、素晴らしい情報です。
イゴール

11

特定の例に依存します。ほとんどの場合、Builderパターンはクラス* Builderに名前を付けることで最適に機能しますが、Singletonは通常そのように名前を付ける必要はありません。

クラス名にパターン名を入れない場合、そしてたぶんそうしても、特定のパターンを実装することを説明するコメントをクラスに入れる必要があります。


3
ここでは一貫性が重要です。一部のファクトリのみが呼び出されると...Factory、その命名規則が破られた場合にクラスがファクトリーであることに気付くのは非常に精神的に困難になるためです。
コンラッドモラウスキー

10

クラスでパターン名を使用することの全体的な目的は、クラスが何をするのかを理解しやすくすることです。クラスにAnimalFactoryという名前を付けると、そのクラスがAnimalインスタンスを作成することは明らかです。クラスの名前にパターンの名前が含まれていて、それが何をするのかを説明していない場合、間違ったパターンを選択したか、間違って実装したかのどちらかです。


1

本当にうまくいくと思います。例えば:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
これは質問にどう答えますか?私の読書では、あなたの「例」はクラス名とコードコメントの無用な重複のみを示しています
-gnat

コメントは、クラス名が明確でない場合に各クラスの目的を正当化するためのものです。これらを見ると、何かを行うコマンド、データを返すクエリ、既存の例外ログメカニズムに追加の動作を追加するデコレーター、およびアカウントフィルターを作成するファクトリーがあることがすぐにわかります。私の意見では、クラス名がわかりやすいほど、他の人がコードを読みやすくなります。デザインパターンを使用している場合は、そう言います-結局のところ、デザインパターンを持つことの目的は、他の人がコードを読みやすくすることです
-CodeART
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.