Zusammenfassung – Zahlungsprozessor
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 46 von 107.
Aufgabe
EinfachErstellen wir ein vollständiges Zahlungsabwicklungssystem, das alle Polymorphie-Konzepte aus diesem Kapitel zusammenführt. Du wirst verschiedene Zahlungsmethoden erstellen, die über eine einheitliche Schnittstelle funktionieren, einen Prozessor, der jede Zahlungsmethode per Abhängigkeitsinjektion akzeptiert, und mehrere Zahlungen über eine polymorphe Sammlung verarbeiten.
Du wirst deinen Code auf vier Dateien verteilen:
payment.go: Definiere einePaymentMethod-Schnittstelle, die eine MethodeProcess(amount float64) stringerfordert. Dies ist der Vertrag, den alle Zahlungsarten erfüllen müssen.methods.go: Erstelle drei Zahlungsarten, die jeweils diePaymentMethod-Schnittstelle implementieren:CreditCardmit den FeldernCardNumber(string) undHolderName(string). IhreProcess-Methode gibtCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]zurück.PayPalmit einem FeldEmail. IhreProcess-Methode gibtPayPal payment of $[amount] from [Email]zurück.BankTransfermit den FeldernBankNameundAccountNumber. IhreProcess-Methode gibtBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])zurück.
processor.go: Erstelle einePaymentProcessor-Struktur, die einePaymentMethod(injizierte Abhängigkeit) enthält. Füge einen KonstruktorNewPaymentProcessorhinzu, der einePaymentMethodakzeptiert. Füge eine MethodeExecutePayment(amount float64) stringhinzu, die die Verarbeitung an die injizierte Zahlungsmethode delegiert. Erstelle außerdem eine FunktionProcessAll(payments []PaymentMethod, amount float64) []string, die denselben Betrag über jede Zahlungsmethode im Slice verarbeitet und alle Ergebnisse zurückgibt.main.go: Lies die Zahlungsdetails aus der Eingabe ein, erstelle alle drei Zahlungsarten und demonstriere sowohl Abhängigkeitsinjektion als auch polymorphe Sammlungen. Verwende zuerstNewPaymentProcessormit der Kreditkarte und führe eine Zahlung aus. Sammle anschließend alle drei Zahlungsmethoden in einem Slice und verwendeProcessAll, um sie alle mit einem zweiten Betrag zu verarbeiten. Gib jedes Ergebnis in einer eigenen Zeile aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Kreditkartennummer (z. B.
4532015112830366) - Zeile 2: Name des Karteninhabers
- Zeile 3: PayPal-E-Mail-Adresse
- Zeile 4: Name der Bank
- Zeile 5: Kontonummer (z. B.
987654321) - Zeile 6: Erster Zahlungsbetrag (für den einzelnen Prozessor)
- Zeile 7: Zweiter Zahlungsbetrag (für die Stapelverarbeitung)
Formatiere die Beträge mit zwei Dezimalstellen. Wenn beispielsweise 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 und 50 angegeben werden, sollte deine Ausgabe folgendermaßen aussehen:
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)Die erste Zeile zeigt die einzelne Zahlung über den injizierten Prozessor. Die verbleibenden drei Zeilen zeigen die Stapelverarbeitung über die polymorphe Sammlung: Dieselbe Funktion ProcessAll verarbeitet alle Zahlungsarten einheitlich und demonstriert, wie Schnittstellen flexible und erweiterbare Zahlungssysteme ermöglichen.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Eingabe lesen
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: Erstelle die drei Zahlungsarten (CreditCard, PayPal, BankTransfer)
// TODO: Erstelle einen PaymentProcessor mit der Kreditkarte unter Verwendung von NewPaymentProcessor
// und führe eine Zahlung mit amount1 aus, dann gib das Ergebnis aus
// TODO: Erstelle einen Slice von PaymentMethod, der alle drei Zahlungsarten enthält
// TODO: Verwende ProcessAll, um alle Zahlungen mit amount2 zu verarbeiten
// und gib jedes Ergebnis in einer eigenen Zeile aus
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler