まとめ - 決済プロセッサ
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 46/107。
チャレンジ
簡単この章で学んだすべてのポリモーフィズムの概念を統合した、完全な決済処理システムを構築しましょう。統一されたインターフェースを通じて機能するさまざまな決済方法を作成し、依存性の注入(Dependency Injection)を介して任意の決済方法を受け入れるプロセッサを作成し、ポリモーフィックなコレクションを通じて複数の決済を処理します。
コードは以下の4つのファイルに分けて構成します:
payment.go:Process(amount float64) stringメソッドを必要とするPaymentMethodインターフェースを定義します。これは、すべての決済タイプが満たさなければならない契約です。methods.go:PaymentMethodインターフェースを実装する3つの決済タイプを作成します:CreditCard:CardNumber(string) とHolderName(string) フィールドを持ちます。そのProcessメソッドは"Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]"を返します。PayPal:Emailフィールドを持ちます。そのProcessメソッドは"PayPal payment of $[amount] from [Email]"を返します。BankTransfer:BankNameとAccountNumberフィールドを持ちます。そのProcessメソッドは"Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])"を返します。
processor.go:PaymentMethod(注入された依存関係)を保持するPaymentProcessor構造体を作成します。PaymentMethodを受け取るコンストラクタNewPaymentProcessorを含めます。注入された決済方法に処理を委譲するExecutePayment(amount float64) stringメソッドを追加します。また、スライス内の各決済方法で同じ金額を処理し、すべての結果を返す関数ProcessAll(payments []PaymentMethod, amount float64) []stringを作成します。main.go: 入力から決済の詳細を読み取り、3つの決済タイプすべてを作成し、依存性の注入とポリモーフィックなコレクションの両方を実演します。まず、クレジットカードでNewPaymentProcessorを使用し、決済を実行します。次に、3つの決済方法すべてをスライスにまとめ、ProcessAllを使用して2番目の金額ですべてを処理します。各結果をそれぞれの行に出力します。
以下の入力が提供されます:
- 1行目: クレジットカード番号 (例:
4532015112830366) - 2行目: カード名義人名
- 3行目: PayPalのメールアドレス
- 4行目: 銀行名
- 5行目: 口座番号 (例:
987654321) - 6行目: 1回目の決済金額 (単一プロセッサ用)
- 7行目: 2回目の決済金額 (一括処理用)
金額は小数点以下2桁でフォーマットしてください。例えば、4532015112830366、John Smith、john@email.com、Chase、987654321、99.99、50 が与えられた場合、出力は以下のようになります:
Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)最初の行は、注入されたプロセッサを介した単一の決済を示しています。残りの3行は、ポリモーフィックなコレクションを介した一括処理を示しています。同じ ProcessAll 関数がすべての決済タイプを一律に処理しており、インターフェースがいかに柔軟で拡張可能な決済システムを可能にするかを実証しています。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 入力を読み込む
cardNumber, _ := reader.ReadString('\n')
cardNumber = strings.TrimSpace(cardNumber)
holderName, _ := reader.ReadString('\n')
holderName = strings.TrimSpace(holderName)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
bankName, _ := reader.ReadString('\n')
bankName = strings.TrimSpace(bankName)
accountNumber, _ := reader.ReadString('\n')
accountNumber = strings.TrimSpace(accountNumber)
amount1Str, _ := reader.ReadString('\n')
amount1Str = strings.TrimSpace(amount1Str)
amount1, _ := strconv.ParseFloat(amount1Str, 64)
amount2Str, _ := reader.ReadString('\n')
amount2Str = strings.TrimSpace(amount2Str)
amount2, _ := strconv.ParseFloat(amount2Str, 64)
// TODO: 3つの支払いタイプ(CreditCard、PayPal、BankTransfer)を作成する
// TODO: NewPaymentProcessor を使用して、クレジットカードの PaymentProcessor を作成する
// そして amount1 で支払いを実行し、結果を出力する
// TODO: 3つの支払いタイプすべてを含む PaymentMethod のスライスを作成する
// TODO: ProcessAll を使用して、amount2 ですべての支払いを処理する
// そして各結果をそれぞれの行に出力する
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー