3

いくつかの異なる方法でクライアントに請求する請求書モデルがあります。簡潔にするために、インプレッションあたりのコストと電話問い合わせあたりのコストの 2 つに焦点を当てます。私の考えは、これら (およびその他) を戦略として実装し、それらを請求書クラスに動的に混合することでした。

インプレッション/コールの数を決定するために使用されるさまざまな情報源があるため、これは適切と思われます。Invoiceこれは、基本的な式をクラスに保持しながら、戦略にカプセル化できます。

インプレッション単価の計算は簡単ですnum impressions X cost per impression

電話での問い合わせの計算はもう少し複雑ですnum calls X cost per call

class Invoice
  def self.strategy
    self.class_eval <<-EOS
    include #{billing_type}
    EOS
  end

  def invoice_amount
    # this will used the module mixed in above
    self.rate * calculate_impressions
  end
end

次に、モジュールは次のようになります。

module PerImpressionCalculation
  def calculate_impressions
     # get the number of impessions from source a...
  end
end

module PerInquiryCalcuation
  def calculate_impressions
     # get the number of impessions from source b...
  end
end

ただし、通話がカウントされるかどうかは通話の長さに基づいており、これはモデルによって異なります。したがって、電話ログを検索するときは、この値が必要です。

私の質問は、この値はどこに保存されるのですか? 10 秒の呼び出しに基づく請求書の戦略と、30 秒の呼び出しに基づく別の戦略を作成することはできますが、それは無駄に思えます。しきい値を 15 秒にするという取引が成立した場合、新しい戦略を作成する必要があります。この問題を解決するための最良の設計選択は何ですか?

4

2 に答える 2

3

戦略をモジュール mixin として実装しないでください。public メソッドを使用して本格的なクラスとしてそれらを実装し、コンストラクターを使用しPerInquiryCalculationて適切なクラスをクラスに挿入します。Invoice

このようにして、各戦略クラスは、構築中に設定された独自の状態変数を持つことができます。のコンストラクターは、メソッドが料金を計算するために使用するPerInquiryStrategy期間のしきい値を取ることができます。PerInquiryCalculation

于 2009-12-04T05:25:50.370 に答える
0

class メソッドを使用して、すべての混合モジュールと基本クラスを取得できますancestors。したがって、インスタンスがある場合はmyInvoice、単に使用できますmyInvoice.class.ancestors。含まれているかどうかを確認できるように、定数の配列を返します。

ところで、この文脈では、この場合は従来の構成/集約がより適切であると思います。複数の異なる戦略が同時に共存する場合は、より安全です。基本クラスに影響を与えたため、すべての請求戦略を変更して終わりたくありません...

于 2009-12-03T07:43:16.397 に答える