Powtórka — procesor płatności
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 46 z 107.
Wyzwanie
ŁatwyStwó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 interfejsPaymentMethod, który wymaga metodyProcess(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 interfejsPaymentMethod:CreditCardz polamiCardNumber(string) iHolderName(string). Jego metodaProcesszwracaCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]PayPalz polemEmail. Jego metodaProcesszwracaPayPal payment of $[amount] from [Email]BankTransferz polamiBankNameiAccountNumber. Jego metodaProcesszwracaBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
processor.go: Utwórz strukturęPaymentProcessor, która przechowujePaymentMethod(wstrzykniętą zależność). Dodaj konstruktorNewPaymentProcessor, który przyjmujePaymentMethod. 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żyjNewPaymentProcessorz kartą kredytową i wykonaj płatność. Następnie zbierz wszystkie trzy metody płatności w tablicy i użyjProcessAll, 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
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online