Zusammenfassung – Payment Processor
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 46 von 107.
Aufgabe
EinfachLassen Sie uns ein vollständiges Zahlungssystem aufbauen, das alle Polymorphismus-Konzepte aus diesem Kapitel zusammenführt. Sie werden verschiedene Zahlungsmethoden erstellen, die über eine einheitliche Schnittstelle funktionieren, einen Prozessor, der jede Zahlungsmethode über Dependency Injection akzeptiert, und mehrere Zahlungen über eine polymorphe Sammlung verarbeiten.
Sie werden Ihren Code in vier Dateien organisieren:
payment.go: Definieren Sie einPaymentMethodInterface, das eineProcess(amount float64) stringMethode erfordert. Dies ist der Vertrag, den alle Zahlungstypen erfüllen müssen.methods.go: Erstellen Sie drei Zahlungstypen, die jeweils dasPaymentMethodInterface implementieren:CreditCardmit den FeldernCardNumber(string) undHolderName(string) — seineProcessMethode gibt"Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]"zurück.PayPalmit einemEmailFeld — seineProcessMethode gibt"PayPal payment of $[amount] from [Email]"zurück.BankTransfermit den FeldernBankNameundAccountNumber— seineProcessMethode gibt"Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])"zurück.
processor.go: Erstellen Sie einPaymentProcessorStruct, das einePaymentMethod(injected dependency) hält. Fügen Sie einen KonstruktorNewPaymentProcessorhinzu, der einePaymentMethodakzeptiert. Fügen Sie eine MethodeExecutePayment(amount float64) stringhinzu, die an die injizierte Zahlungsmethode delegiert. Erstellen Sie 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: Lesen Sie die Zahlungsdetails aus der Eingabe ein, erstellen Sie alle drei Zahlungstypen und demonstrieren Sie sowohl Dependency Injection als auch polymorphe Sammlungen. Verwenden Sie zuerstNewPaymentProcessormit der Kreditkarte und führen Sie eine Zahlung aus. Sammeln Sie dann alle drei Zahlungsmethoden in einem Slice und verwenden SieProcessAll, um sie alle mit einem zweiten Betrag zu verarbeiten. Geben Sie 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
- Zeile 4: Bankname
- Zeile 5: Kontonummer (z. B.
987654321) - Zeile 6: Erster Zahlungsbetrag (für den einzelnen Prozessor)
- Zeile 7: Zweiter Zahlungsbetrag (für die Stapelverarbeitung)
Formatieren Sie Beträge mit zwei Dezimalstellen. Zum Beispiel, gegeben 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 und 50, sollte Ihre Ausgabe wie folgt 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 durch den injizierten Prozessor. Die verbleibenden drei Zeilen zeigen die Stapelverarbeitung durch die polymorphe Sammlung — dieselbe ProcessAll Funktion verarbeitet alle Zahlungstypen einheitlich und demonstriert, wie Interfaces flexible, 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, drucke dann das Ergebnis
// TODO: Erstelle ein slice von PaymentMethod, das alle drei Zahlungsarten enthält
// TODO: Verwende ProcessAll, um alle Zahlungen mit amount2 zu verarbeiten
// und drucke jedes Ergebnis in einer eigenen Zeile
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool