Menu
Coddy logo textTech

まとめ - 決済プロセッサ

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

challenge icon

チャレンジ

簡単

この章で学んだポリモーフィズムの概念をすべて組み合わせた、完全な支払い処理システムを構築しましょう。統一されたインターフェースを通じて動作するさまざまな支払い方法、依存性注入によって任意の支払い方法を受け入れるプロセッサ、そしてポリモーフィックなコレクションを通じて複数の支払いを処理する仕組みを作成します。

コードを4つのファイルに分けて整理します。

  • payment.go: Process(amount float64) string メソッドを必要とする PaymentMethod インターフェースを Define します。これは、すべての支払いタイプが満たさなければならない契約です。
  • methods.go: それぞれが PaymentMethod インターフェースを実装する3つの支払いタイプを Create します。
    • CreditCardCardNumber(string)と HolderName(string)の fields を持ちます。その Process メソッドは Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName] を返します。
    • PayPalEmail field を持ちます。その Process メソッドは PayPal payment of $[amount] from [Email] を返します。
    • BankTransferBankNameAccountNumber fields を持ちます。その 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) []string function も Create します。
  • 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)

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

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

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