요약 - 결제 프로세서
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 46번째.
챌린지
쉬움이 장에서 배운 모든 다형성 개념을 하나로 모으는 완전한 결제 처리 시스템을 구축해 봅시다. 통합된 인터페이스를 통해 작동하는 다양한 결제 수단을 만들고, 의존성 주입(dependency injection)을 통해 모든 결제 수단을 수용하는 프로세서를 만들며, 다형성 컬렉션을 통해 여러 결제 건을 처리하게 됩니다.
코드는 다음 네 개의 파일로 구성됩니다:
payment.go:Process(amount float64) string메서드를 요구하는PaymentMethod인터페이스를 정의합니다. 이것은 모든 결제 유형이 충족해야 하는 계약입니다.methods.go:PaymentMethod인터페이스를 각각 구현하는 세 가지 결제 유형을 만듭니다:CardNumber(string)와HolderName(string) 필드를 가진CreditCard—Process메서드는Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]를 반환합니다.Email필드를 가진PayPal—Process메서드는PayPal payment of $[amount] from [Email]를 반환합니다.BankName과AccountNumber필드를 가진BankTransfer—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: 입력에서 결제 세부 정보를 읽고, 세 가지 결제 유형을 모두 생성하며, 의존성 주입과 다형성 컬렉션을 모두 시연합니다. 먼저 신용카드로NewPaymentProcessor를 사용하여 결제를 실행합니다. 그런 다음 세 가지 결제 수단을 모두 슬라이스에 수집하고ProcessAll을 사용하여 두 번째 금액으로 모두 처리합니다. 각 결과를 별도의 줄에 출력합니다.
다음 입력이 제공됩니다:
- 1행: 신용카드 번호 (예:
4532015112830366) - 2행: 카드 소유자 이름
- 3행: PayPal 이메일
- 4행: 은행 이름
- 5행: 계좌 번호 (예:
987654321) - 6행: 첫 번째 결제 금액 (단일 프로세서용)
- 7행: 두 번째 결제 금액 (일괄 처리용)
금액은 소수점 둘째 자리까지 표시합니다. 예를 들어, 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)첫 번째 줄은 주입된 프로세서를 통한 단일 결제를 보여줍니다. 나머지 세 줄은 다형성 컬렉션을 통한 일괄 처리를 보여줍니다. 동일한 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: 세 가지 결제 유형(CreditCard, PayPal, BankTransfer)을 생성하세요.
// TODO: NewPaymentProcessor를 사용하여 신용카드로 PaymentProcessor를 생성하고
// amount1으로 결제를 실행한 후 결과를 출력하세요.
// TODO: 세 가지 결제 유형을 모두 포함하는 PaymentMethod 슬라이스를 생성하세요.
// TODO: ProcessAll을 사용하여 amount2로 모든 결제를 처리하고
// 각 결과를 별도의 줄에 출력하세요.
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서