요약 - 결제 프로세서
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 46번째.
챌린지
쉬움이 장에서 다룬 모든 다형성 개념을 하나로 모아 완전한 결제 처리 시스템을 만들어 보겠습니다. 통합 인터페이스를 통해 작동하는 다양한 결제 방법, 의존성 주입을 통해 모든 결제 방법을 허용하는 프로세서, 그리고 다형적 컬렉션을 통해 여러 결제를 처리하는 기능을 만들게 됩니다.
코드를 네 개의 파일로 구성합니다:
payment.go:PaymentMethod인터페이스를 정의하고,Process(amount float64) string메서드를 요구하도록 합니다. 이는 모든 결제 유형이 충족해야 하는 계약입니다.methods.go: 각각PaymentMethod인터페이스를 구현하는 세 가지 결제 유형을 만듭니다: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구조체를 만듭니다.PaymentMethod를 accepts하는NewPaymentProcessorconstructor를 포함합니다. 주입된 결제 방법에 위임하는ExecutePayment(amount float64) string메서드를 추가합니다. 또한 slice의 각 결제 방법을 통해 동일한 amount를 처리하고 모든 결과를 반환하는ProcessAll(payments []PaymentMethod, amount float64) []stringfunction을 만듭니다.main.go: 입력에서 결제 세부 정보를 읽고, 세 가지 결제 유형을 모두 만들며, dependency injection과 다형적 컬렉션을 모두 보여 줍니다. 먼저 신용 카드와 함께NewPaymentProcessor를 사용하여 결제를 실행합니다. 그런 다음 세 가지 결제 방법을 모두 slice에 모으고ProcessAll을 사용하여 두 번째 amount로 모두 처리합니다. 각 결과를 한 줄씩 출력합니다.
다음 입력이 제공됩니다:
- 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 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: 세 가지 결제 유형 생성 (CreditCard, PayPal, BankTransfer)
// TODO: NewPaymentProcessor를 사용하여 신용 카드로 PaymentProcessor 생성
// 그리고 amount1로 결제를 실행한 다음 결과를 출력
// TODO: 세 가지 결제 유형을 모두 포함하는 PaymentMethod 슬라이스 생성
// TODO: ProcessAll을 사용하여 amount2로 모든 결제 처리
// 그리고 각 결과를 한 줄씩 출력
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러