23

現在、Python で Factory デザイン パターンを実装していますが、いくつか質問があります。

  1. 実際の具象クラスの直接インスタンス化を防ぐ方法はありますか? たとえば、Vehicles を生成する VehicleFactory がある場合、ユーザーはそのファクトリを使用するだけで済み、誰かが誤って Car() または Truck() を直接インスタンス化するのを防ぐことができます。おそらくinit ()で例外をスローできますが、それはファクトリがそのインスタンスを作成できないことも意味します...

  2. 工場が中毒性を増しているように思えます。内部実装を変更してもクライアント コードが変更されないように、すべてがファクトリになる必要があるようです。実際にファクトリを使用する必要があるのはいつで、いつ使用するのが適切でないのか知りたいです。たとえば、私は Window クラスを持っているかもしれませんが、現在このタイプは 1 つしかありません (PlasticWindow、ReinforcedWindow などはありません)。その場合、将来さらに多くの種類の Windows を追加する可能性がある場合に備えて、クライアントにファクトリを使用して Window を生成する必要がありますか?

  3. 工場を呼び出す通常の方法があるかどうか疑問に思っています。たとえば、Vehicle ファクトリを Vehicles と呼んでいるので、コードは Vehicles.create(...) のようになります。VehicleFactory のように多くのチュートリアルが実行されているのを目にしますが、長すぎて、実装も公開されているように感じます。

編集:「実装を公開する」とは、それが工場であることを人々に知らせることです。私が感じたのは、クライアントはそれがファクトリであることを知る必要はなく、オブジェクトを返すことができる何らかのクラスとして知る必要があるということでした (これはもちろんファクトリですが、クライアントに明示的に伝える必要はないのでしょうか?)。ソースコードが簡単に公開されることは知っているので、「ソースコードで機能が実装されている方法を公開する」という意味ではありませんでした。

ありがとう!

4

3 に答える 3

23

Pythonic であること。不要なレベルの抽象化を追加する「エンタープライズ」言語 (Java など) ソリューションでコードを過度に複雑にしないでください。

コードはシンプルで直感的でなければなりません。別のクラスをインスタンス化するために別のクラスに委任する必要はありません。

于 2010-08-18T10:39:15.610 に答える
12
  1. クラスを公開しないでください(たとえば、クラスをプライベート__MyClassにしたり、直接使用したくないことを明らかにしたりします_MyClass)。このように、ファクトリ関数を介してのみインスタンス化できます。
  2. おそらく、キーワード引数の使用と継承を確認する必要があります。これらを見落としているように思われますが、これにより、一般的に複雑な工場への依存度が低下します(正直なところ、工場が必要になることはめったにありません)。
  3. Pythonでは、実装の公開を簡単に防ぐことはできません。PythonのZenに反します。(それはどの言語でも同じです、決心した個人は彼らが最終的に望むものを手に入れることができます)。せいぜい、コードのユーザーが誤って間違ったことをしないようにする必要がありますがエンドユーザーがコードで何を達成することを決定するかを推測することは絶対にしないでください。わかりにくく、扱いにくいものにしないでください。
于 2010-08-18T10:31:54.287 に答える
6

実際の具象クラスの直接インスタンス化を防ぐ方法はありますか?

なんで?あなたのプログラマーは、ルールに従うことを拒否する邪悪なソシオパスですか? ファクトリを提供し、そのファクトリが人々の必要とすることを行う場合、彼らはそのファクトリを使用します。

何も「防ぐ」ことはできません。覚えて。これは Python です。ソースがあります。

将来さらに多くの種類の Windows を追加する可能性がある場合に備えて、クライアントがウィンドウを生成するためにファクトリを使用する必要がありますか?

うーん。良くも悪くもありません。クラス階層とファクトリの詳細をすべて管理するのは面倒です。

工場を追加するのは難しくありません。これは Python です。いつでもすべてのソースを入手できます。これを使用grepして、クラス コンストラクターを見つけ、必要に応じてファクトリに置き換えることができます。

を使用grepして間違いを見つけて修正できるため、Java や C++ の場合のように、この種のことを事前に計画する必要はありません。

VehicleFactory のように多くのチュートリアルでそれを行っているのを見てきましたが、長すぎて、実装も公開されているように感じました。

"長すぎる"?ほとんど使用されないため、ほとんど問題になりません。長い名前を使用してください。他の人があなたのしていることを理解するのに役立ちます。これは、最小限のキーストロークで勝つコード ゴルフではありません。

「実装を公開する」?まず、何も公開しません。次に、これは Python です。常にすべてのソースがあり、すべてが公開されています。

予防やプライバシーについて考えるのはやめましょう。役に立ちません。

于 2010-08-18T11:00:24.780 に答える