Menu
Coddy logo textTech

まとめ - 決済プロセッサ

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

challenge icon

チャレンジ

簡単

この章で学んだすべてのポリモーフィズムの概念を統合した、完全な決済処理システムを構築しましょう。統一されたインターフェースを通じて機能するさまざまな決済方法を作成し、依存性の注入(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: BankNameAccountNumber フィールドを持ちます。その 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桁でフォーマットしてください。例えば、4532015112830366John Smithjohn@email.comChase98765432199.9950 が与えられた場合、出力は以下のようになります:

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 ですべての支払いを処理する
	// そして各結果をそれぞれの行に出力する
}

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