まとめ - 決済プロセッサ
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 46/107。
チャレンジ
簡単この章で学んだポリモーフィズムの概念をすべて組み合わせた、完全な支払い処理システムを構築しましょう。統一されたインターフェースを通じて動作するさまざまな支払い方法、依存性注入によって任意の支払い方法を受け入れるプロセッサ、そしてポリモーフィックなコレクションを通じて複数の支払いを処理する仕組みを作成します。
コードを4つのファイルに分けて整理します。
payment.go:Process(amount float64) stringメソッドを必要とするPaymentMethodインターフェースを Define します。これは、すべての支払いタイプが満たさなければならない契約です。methods.go: それぞれがPaymentMethodインターフェースを実装する3つの支払いタイプを Create します。CreditCard。CardNumber(string)とHolderName(string)の fields を持ちます。そのProcessメソッドはCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]を返します。PayPal。Emailfield を持ちます。そのProcessメソッドはPayPal payment of $[amount] from [Email]を返します。BankTransfer。BankNameとAccountNumberfields を持ちます。そのProcessメソッドはBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])を返します。
processor.go:PaymentMethod(注入された dependency)を保持するPaymentProcessor構造体を Create します。PaymentMethodを accepts コンストラクターNewPaymentProcessorを含めます。注入された支払い方法に処理を委譲するExecutePayment(amount float64) stringメソッドを Add します。さらに、スライス内の各支払い方法を通じて同じ金額を処理し、すべての結果を返すProcessAll(payments []PaymentMethod, amount float64) []stringfunction も Create します。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)1行目は、注入されたプロセッサを通じた単一の支払いを示します。残りの3行は、ポリモーフィックなコレクションを通じた一括処理を示しています。同じ ProcessAll function がすべての支払いタイプを一様に処理しており、インターフェースによって柔軟で拡張可能な支払いシステムを実現できることを示しています。
自分で試してみよう
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復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ