Özet - Payment Processor
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 46 / 107.
Görev
KolayBu bölümdeki tüm polimorfizm kavramlarını bir araya getiren eksiksiz bir ödeme işleme sistemi oluşturalım. Birleşik bir arayüz üzerinden çalışan farklı ödeme yöntemleri, bağımlılık enjeksiyonu (dependency injection) yoluyla herhangi bir ödeme yöntemini kabul eden bir işlemci oluşturacak ve polimorfik bir koleksiyon aracılığıyla birden fazla ödemeyi işleyeceksiniz.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
payment.go: BirProcess(amount float64) stringmetodu gerektiren birPaymentMethodarayüzü tanımlayın. Bu, tüm ödeme türlerinin yerine getirmesi gereken sözleşmedir.methods.go: Her biriPaymentMethodarayüzünü uygulayan üç ödeme türü oluşturun:CardNumber(string) veHolderName(string) alanlarına sahipCreditCard—Processmetodu"Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]"döndürür.Emailalanına sahipPayPal—Processmetodu"PayPal payment of $[amount] from [Email]"döndürür.BankNameveAccountNumberalanlarına sahipBankTransfer—Processmetodu"Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])"döndürür.
processor.go: BirPaymentMethod(enjekte edilen bağımlılık) tutan birPaymentProcessoryapısı oluşturun. BirPaymentMethodkabul eden birNewPaymentProcessorkurucu fonksiyonu ekleyin. Enjekte edilen ödeme yöntemine delege eden birExecutePayment(amount float64) stringmetodu ekleyin. Ayrıca, dilimdeki (slice) her bir ödeme yöntemiyle aynı tutarı işleyen ve tüm sonuçları döndüren birProcessAll(payments []PaymentMethod, amount float64) []stringfonksiyonu oluşturun.main.go: Girdiden ödeme ayrıntılarını okuyun, üç ödeme türünü de oluşturun ve hem bağımlılık enjeksiyonunu hem de polimorfik koleksiyonları gösterin. İlk olarak, kredi kartıylaNewPaymentProcessorkullanın ve bir ödeme gerçekleştirin. Ardından üç ödeme yöntemini de bir dilimde toplayın ve ikinci bir tutarla hepsini işlemek içinProcessAllkullanın. Her sonucu kendi satırına yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Kredi kartı numarası (örneğin,
4532015112830366) - Satır 2: Kart sahibi adı
- Satır 3: PayPal e-postası
- Satır 4: Banka adı
- Satır 5: Hesap numarası (örneğin,
987654321) - Satır 6: İlk ödeme tutarı (tek işlemci için)
- Satır 7: İkinci ödeme tutarı (toplu işleme için)
Tutarları iki ondalık basamakla biçimlendirin. Örneğin, 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 ve 50 verildiğinde çıktınız şöyle olmalıdır:
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)İlk satır, enjekte edilen işlemci aracılığıyla yapılan tek ödemeyi gösterir. Kalan üç satır, polimorfik koleksiyon aracılığıyla yapılan toplu işlemeyi gösterir; aynı ProcessAll fonksiyonu tüm ödeme türlerini tek tip olarak işleyerek arayüzlerin nasıl esnek ve genişletilebilir ödeme sistemleri sağladığını kanıtlar.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Girdiyi oku
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: Üç ödeme türünü oluştur (CreditCard, PayPal, BankTransfer)
// TODO: NewPaymentProcessor kullanarak kredi kartı ile bir PaymentProcessor oluştur
// ve amount1 ile bir ödeme gerçekleştir, ardından sonucu yazdır
// TODO: Üç ödeme türünün tamamını içeren bir PaymentMethod dilimi (slice) oluştur
// TODO: Tüm ödemeleri amount2 ile işlemek için ProcessAll kullan
// ve her bir sonucu kendi satırında yazdır
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool