Menu
Coddy logo textTech

復習 - 支払い処理

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 37/91。

challenge icon

チャレンジ

簡単

ポリモーフィズムについて学んだすべてを組み合わせて、完全な支払い処理システムを構築しましょう。異なる支払い方法を、単一の統合されたプロセッサーで処理できるインターフェースベースのアーキテクチャを作成します。これにより、ポリモーフィズムによってコードが柔軟かつ拡張可能になることを示します。

コードを5つのファイルに整理します。

  • PaymentMethod.php:2つのメソッドシグネチャを持つ PaymentMethod インターフェースを Define します。支払いを処理するための process(float $amount): string と、支払いタイプ名を返す static メソッド getMethodName(): string です。この契約により、あらゆる支払い方法を統一的に処理できます。
  • CreditCard.phpPaymentMethod を implements する CreditCard クラスを Create します。インターフェースファイルを Include します。このクラスには、constructor を通じて設定される private な $lastFourDigits プロパティを持たせます。process() を Implement し、"Processing $[amount] via Credit Card ending in [lastFourDigits]" を返すようにします(amount は小数点以下2桁に Format します)。static な getMethodName() は late static binding を使用して "Credit Card" を返すように Implement します。
  • PayPal.phpPaymentMethod を implements する PayPal クラスを Create します。インターフェースファイルを Include します。このクラスには、constructor を通じて設定される private な $email プロパティを持たせます。process() を Implement し、"Processing $[amount] via PayPal account [email]" を返すようにします(amount は小数点以下2桁に Format します)。static な getMethodName()"PayPal" を返すように Implement します。
  • PaymentProcessor.php:支払いを調整する PaymentProcessor クラスを Create します。インターフェースファイルを Include します。インターフェースの型ヒントを使用して任意の支払い方法を accept する executePayment(PaymentMethod $method, float $amount): string メソッドを Add します。このメソッドは、支払い方法に対して process() を calling した結果を返します。さらに、渡された支払い方法のクラスから static な getMethodName() を使用して "Payment via: [methodName]" を返す describeMethod(PaymentMethod $method): string メソッドを Add します。
  • main.php:すべての支払いクラスのファイルとプロセッサーを Include します。PaymentProcessor の instance を Create します。3つの inputs、つまりクレジットカードの last four digits、PayPal の email アドレス、支払い amount を受け取ります。それぞれの identifier を使用して CreditCardPayPal の両方の instance を Create します。amount を float に変換します。プロセッサーを使用して、まずクレジットカードで支払いを Execute し、次に PayPal で Execute します。それぞれの結果を独自の行に Print します。最後に、PayPal の支払い方法のメソッドの説明を Print します。

この設計の優れた点は、PaymentProcessor がクレジットカードや PayPal について具体的には何も知らなくてよいことです。PaymentMethod インターフェースについてのみ知っています。明日 BankTransfer クラスや Cryptocurrency クラスを Add したとしても、プロセッサーは一切変更することなくそれらを処理できます。これが、インターフェースベースのポリモーフィズムと late static binding を組み合わせる power です。

自分で試してみよう

<?php
// 必要なファイルをすべてインクルードする
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// 入力を読み取る
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: PaymentProcessor のインスタンスを作成する

// TODO: 下4桁で CreditCard のインスタンスを作成する

// TODO: メールアドレスで PayPal のインスタンスを作成する

// TODO: クレジットカードで支払いを実行し、結果を出力する

// TODO: PayPal で支払いを実行し、結果を出力する

// TODO: PayPal 支払い方法のメソッドの説明を出力する
?>

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ