Menu
Coddy logo textTech

Powtórka — procesor płatności

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 46 z 107.

challenge icon

Wyzwanie

Łatwy

Stwórzmy kompletny system przetwarzania płatności, który łączy wszystkie pojęcia polimorfizmu z tego rozdziału. Utworzysz różne metody płatności działające za pośrednictwem wspólnego interfejsu, procesor przyjmujący dowolną metodę płatności przez wstrzykiwanie zależności oraz przetworzysz wiele płatności za pomocą polimorficznej kolekcji.

Rozmieścisz kod w czterech plikach:

  • payment.go: Zdefiniuj interfejs PaymentMethod, który wymaga metody Process(amount float64) string. To kontrakt, który muszą spełniać wszystkie typy płatności.
  • methods.go: Utwórz trzy typy płatności, z których każdy implementuje interfejs PaymentMethod:
    • CreditCard z polami CardNumber (string) i HolderName (string). Jego metoda Process zwraca Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]
    • PayPal z polem Email. Jego metoda Process zwraca PayPal payment of $[amount] from [Email]
    • BankTransfer z polami BankName i AccountNumber. Jego metoda Process zwraca Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
  • processor.go: Utwórz strukturę PaymentProcessor, która przechowuje PaymentMethod (wstrzykniętą zależność). Dodaj konstruktor NewPaymentProcessor, który przyjmuje PaymentMethod. Dodaj metodę ExecutePayment(amount float64) string, która przekazuje wywołanie do wstrzykniętej metody płatności. Utwórz również funkcję ProcessAll(payments []PaymentMethod, amount float64) []string, która przetwarza tę samą kwotę za pomocą każdej metody płatności z tablicy i zwraca wszystkie wyniki.
  • main.go: Odczytaj szczegóły płatności z wejścia, utwórz wszystkie trzy typy płatności i zademonstruj zarówno wstrzykiwanie zależności, jak i polimorficzne kolekcje. Najpierw użyj NewPaymentProcessor z kartą kredytową i wykonaj płatność. Następnie zbierz wszystkie trzy metody płatności w tablicy i użyj ProcessAll, aby przetworzyć je wszystkie z drugą kwotą. Wypisz każdy wynik w osobnym wierszu.

Podane zostaną następujące dane wejściowe:

  • Wiersz 1: Numer karty kredytowej (np. 4532015112830366)
  • Wiersz 2: Imię i nazwisko posiadacza karty
  • Wiersz 3: Adres e-mail PayPal
  • Wiersz 4: Nazwa banku
  • Wiersz 5: Numer konta (np. 987654321)
  • Wiersz 6: Kwota pierwszej płatności (dla pojedynczego procesora)
  • Wiersz 7: Kwota drugiej płatności (dla przetwarzania wsadowego)

Formatuj kwoty z dokładnością do dwóch miejsc po przecinku. Na przykład dla danych 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 i 50 wynik powinien wyglądać następująco:

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)

Pierwszy wiersz przedstawia pojedynczą płatność obsłużoną przez wstrzyknięty procesor. Pozostałe trzy wiersze przedstawiają przetwarzanie wsadowe za pomocą polimorficznej kolekcji: ta sama funkcja ProcessAll obsługuje wszystkie typy płatności w jednolity sposób, pokazując, jak interfejsy umożliwiają tworzenie elastycznych i rozszerzalnych systemów płatności.

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Odczytaj dane wejściowe
	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: Utwórz trzy rodzaje płatności (CreditCard, PayPal, BankTransfer)

	// TODO: Utwórz PaymentProcessor dla karty kredytowej za pomocą NewPaymentProcessor
	// i wykonaj płatność z kwotą amount1, a następnie wypisz wynik

	// TODO: Utwórz slice typu PaymentMethod zawierający wszystkie trzy rodzaje płatności

	// TODO: Użyj ProcessAll do przetworzenia wszystkich płatności z kwotą amount2
	// i wypisz każdy wynik w osobnym wierszu
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online