9

(Python 3.2を使用していますが、それが重要かどうかは疑問です。)

、、およびクラスがclass Dataあります。クラスのインスタンスを表すために小文字を使用します。class RulesResult

オブジェクトには、オブジェクトに適用された場合にオブジェクトを作成できるrulesルールが含まれています。dataresult

ルールを実際にデータに適用する(かなり複雑で進化している)コードをどこに配置するかを決定しています。私は2つの選択肢を見ることができます:

  1. そのコードをクラスResultメソッド内に配置しますparse_rulesResultコンストラクターは引数としてrulesオブジェクトを取り、それをに渡しますself.parse_rules

  2. そのコードを新しいクラス内に配置しますResultFactoryResultFactoryシングルトンクラスになります。このクラスにはbuild_resultrules引数として新しく作成されたresultオブジェクトを返すメソッドなどがあります。

2つのアプローチの長所と短所は何ですか?

4

5 に答える 5

3

GRASP 設計原則は、オブジェクト指向設計でクラスとオブジェクトに責任を割り当てるためのガイドラインを提供します。たとえば、Creatorパターンは次のことを示唆しています。一般に、次の 1 つまたはできれば複数が当てはまる場合、クラス B はクラス A のインスタンスの作成を担当する必要があります。

  • B のインスタンスは、A のインスタンスを含むか、複合的に集約します
  • B のインスタンス A のレコード インスタンス
  • B のインスタンスは A のインスタンスを密接に使用します
  • B のインスタンスは、A のインスタンスの初期化情報を持っており、作成時にそれを渡します。

あなたの例では、データにルールを適用するための複雑で進化するコードがあります。これはFactory Patternの使用を示唆しています。

1) 結果は結果を作成しない、2) 結果は情報の専門家ではない (つまり、必要な知識のほとんどを持っていない) ため、コードをリザルトに入れることは禁忌です。

要するに、ResultFactoryは、データにルールを適用して結果を生成する方法に関する知識を集中させるのに適した場所のように思えます。このすべてのロジックをリザルトまたはルールのいずれかのクラス コンストラクターにプッシュしようとすると、密結合が発生し、結束が失われます。

于 2012-01-16T01:59:54.713 に答える
2

3 番目のシナリオ:

3 番目のシナリオを検討することをお勧めします。

  • メソッド内にコードを挿入しますRules.__call__。次のように
    インスタンス化します。Resultresult = rules(data)

長所:

  • ResultRuless は、それらを生成する をまったく認識していない可能性があります (元の も認識していない可能性がありますData)。
  • すべてRulesのサブクラスは、そのResult作成をカスタマイズできます。
  • それは(私にとって)自然に感じます:yieldRulesに適用されます。DataResult
  • そして、あなたの側にいくつかの GRASP 原則があります:
    • Creator : のインスタンスは のインスタンスRulesの初期化情報を持ち、Result作成時にそれを渡します。
    • 情報エキスパート: 情報エキスパートは、責任を遂行するために必要な情報が最も多いクラスに責任を課します。

副作用:

  • カップリングRules:との間のカップリングを上げますData:
    • データセット全体をすべてに渡す必要がありますRules
    • つまり、それぞれRulesが適用されるデータを決定できる必要があります。
于 2012-01-16T09:42:17.010 に答える
1

ルールを独自のクラスに入れてみませんか? RuleBase クラスを作成すると、そこから各ルールを派生させることができます。このように、データにルールを適用する必要がある場合にポリモーフィズムを使用できます。Data は、どの Rule インスタンスが適用されたかを知る必要も気にする必要もありません (Data 自体が、どのルールを適用する必要があるかを知っている場合を除きます)。

ルールを呼び出す必要がある場合、データ インスタンスはすべて RuleBase.ExecuteRules() を実行し、それ自体を引数として渡すことができます。データが必要なルールを知っている場合、ルールの正しいサブクラスをデータから直接選択できます。または、Chain of Responsibility のような他の設計パターンを使用することもできます。この場合、Data がパターンを呼び出して結果を返すことができます。

これは素晴らしいホワイトボード ディスカッションになります。

于 2012-01-16T02:09:02.357 に答える
1

ResultFactory を純粋な関数にすることはできますか? 必要なものが関数だけの場合、シングルトン オブジェクトを作成しても意味がありません。

于 2012-01-16T07:49:35.643 に答える
0

2 つ目は、特にすべてのシングルトン性を考慮すると、実にばかげています。Resultインスタンスを作成する必要がありRules、インスタンスなしでは作成できない場合は、それを の引数として受け取る必要があります__init__。パターンの買い物は必要ありません。

于 2012-01-16T02:00:01.913 に答える