2

まだOOPを学び、手続き的な生き方から私の視点を変えようとしています。リファクタリングの際に多くの利点が見つかりましたが、今はパラダイムにとらわれています。

ショッピングカートをリファクタリングしています。チェックアウトに関しては、古いphpスクリプトの関数ファイルに、ユーザーをさまざまな支払い方法(PayPal、カード、送金など)に誘導する関数があり、それぞれに異なるアカウント、値、関数があります。 urlなど

では、「支払い方法」をクラスとして見ることはできますか?

以前のスクリプトでは、チェックアウトは直線的で、アクションごとに実行されていましたが、今では、人間の購入者のクリックに従わずに、支払いクラスを予約、後払い、サブスクリプションなどに再利用したいと考えています。これはOOPが輝いているときだと思いますね。

クラスには、合計、小計、割引、tpv選択、結果、エラーメッセージなどの属性を含めることができると思いますが、それらの一部はすでに私のバスケットクラスの一部です。

そして、それをどのように使用できますか?外部から関数を呼び出し、クレジットカードの要件などの多くのパラメータを送信しますか?または、設定ファイルで、クラスにそれらの値を外部で取得するように強制しますか?

お支払い方法ごとに異なるクラス、またはそれらすべてを含む大きなクラス...

本当に私はパラダイムを見ることができません...しかし、私はそれがそこにあるとほぼ確信しています:-)

4

2 に答える 2

2

質問は部分的に曖昧なので、この答えのいくつかは同様に必然的に曖昧です。

では、「支払い方法」をクラスとして見ることはできますか?

純粋なOOPでは、すべてがクラスまたはメソッドです。特に支払い方法が異なるため、支払い方法クラスは理にかなっています。

クラスには、合計、小計、割引、tpv選択、結果、エラーメッセージなどの属性を含めることができると思いますが、それらの一部はすでに私のバスケットクラスの一部です。

支払い方法を本質的な構成要素と行動にまで煮詰めます。次のような質問を自問してください。金額は実際に誰かが支払う方法の一部なのか、それとも支払われる金額の一部なのか。(この特定の質問への回答:これらは支払いの一部であり、支払い方法ではありません)支払いが行われると、支払い情報が必要になりますが、それを必要とする方法に渡すことができます(おそらく、買い手から売り手、Orderオブジェクト、またはOrderオブジェクトに送られる金額は、Paymentインターフェースを実装できますが、最後の金額は現実の世界を 注入的にモデル化することはできません)。

そして、それをどのように使用できますか?外部から関数を呼び出し、クレジットカードの要件などの多くのパラメータを送信しますか?または、設定ファイルで、クラスにそれらの値を外部で取得するように強制しますか?

支払要件が支払方法の一部である場合、それらは支払方法のプロパティである必要があります。支払い方法オブジェクトの初期化方法については、依存性注入手法(他の特定のクラスの中で、どの支払い方法をトランザクションに関与させて設定するかを別のクラスが決定する)を適用できますが、適用できません。 t常に最良の選択。また、構成データを読み取り、支払い方法オブジェクトを作成し、そのデータを支払い方法に渡すことで、ユーザーからのアクション(つまり、支払い方法の選択)に応答するコントローラーを作成することもできます。

支払い方法オブジェクトを使用するには、いくつかの有効なアプローチがあります。アクションに複数のオブジェクトが含まれ、1つが明確なアクター(つまり、アクションを実行する必要があるもの)でない場合は常に、適切なオブジェクトの必要なメソッドを呼び出す無料の関数(つまり非メソッド関数)を使用できます。関数の動作が複数のオブジェクトの実行時型によって異なる場合は、マルチメソッドを使用します(可能であれば、マルチメソッドをネイティブにサポートする言語は多くありませんが、次のような特定のパターンで多くの言語でシミュレートできます)。ダブルディスパッチとして)。他の可能性には、主なアクターとしてコントローラーを持つことが含まれます。

設計を実装するときに役立つ概念の1つは、機能プログラミングで明示的に作成されたアクセスルールです。オブジェクトは、作成した他のオブジェクトにアクセスできるか、既知の状態で作成された(つまり、コンストラクターに渡された)か、または導入されます。これらのルールは、依存性注入、Model-View-Controller(MVC)などの手法を通知します。

お支払い方法ごとに異なるクラス、またはそれらすべてを含む大きなクラス...

その間のどこかに。すべての支払い方法に共通するもの(アクションURLなど)はすべて基本クラスに入れる必要があります。支払い方法が一般的な動作をオーバーライドする必要がある場合、または他の方法がオーバーライドしないフィールドが必要な場合は、基本支払い方法をサブクラス化します。一貫性を保つために、すべての支払い方法の基本クラスを拡張できますが、一部のサブクラスは何もオーバーライドしない場合があります。

于 2011-03-05T02:12:53.543 に答える
1

あなたが説明していることに基づいて、私が適合すると思うOOPアーキテクチャはこれらの線に沿っているでしょう

  • ShoppingCart-購入を保存し、合計コスト/払い戻し/税金などを計算します。
  • 購入-購入したものとコストを保存します。
  • PaymentMethod-ショッピングカートを受け取り、購入を実行する支払い方法のインターフェース。
  • PayPalPaymentMethod-PayPalサービスを通じて購入を支払うPaymentMethodの派生クラス。
  • CreditCardPaymentMethod-クレジットカードを介して購入を支払うPaymentMethodの派生クラス。

ShoppingCartは、実際には、含まれている購入と使用可能な一連のPaymentMethodについて知る必要があるだけです。チェックアウトページで支払い方法を選択するときに、各PaymentMethodに名前とロゴを表示するように要求できます。また、各PaymentMethodに、一連の購入を処理するために必要な情報を提供するために必要なGUIを表示するメソッドを要求することもできます。

私はこれを、主にC ++ゲームプログラマーとして設計する方法に基づいて書いているので、Web開発のために私の用語と方法論のいくつかを適応させる必要があるかもしれません。

手続き上の考え方を問題と見なさないでください。特定の問題は、さまざまなパラダイムで最もよく解決されることを認識してください。この場合、オブジェクト指向のパラダイムはこの種の問題に適していると思います。すべてがOOPである必要はありませんが、すべてが手続き型である必要はありません。

于 2011-03-05T02:57:20.567 に答える