Ö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 aracılığıyla herhangi bir ödeme yöntemini kabul eden bir işlemci ve polimorfik bir koleksiyon üzerinden birden çok ödeme işlemi oluşturacaksın.
Kodunu dört dosyaya ayıracaksın:
payment.go:PaymentMethodmetodunu gerektiren birProcess(amount float64) stringarayüzü tanımla. Bu, tüm ödeme türlerinin yerine getirmesi gereken sözleşmedir.methods.go:PaymentMethodarayüzünü uygulayan üç ödeme türü oluştur:CreditCard;CardNumber(string) veHolderName(string) alanlarına sahip olsun.ProcessmetoduCredit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]döndürür.PayPal; birEmailalanına sahip olsun.ProcessmetoduPayPal payment of $[amount] from [Email]döndürür.BankTransfer;BankNameveAccountNumberalanlarına sahip olsun.ProcessmetoduBank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])döndürür.
processor.go: Enjekte edilen birPaymentProcessorbağımlılığını tutan birPaymentMethodyapısı oluştur. BirNewPaymentProcessorkabul edenPaymentMethodkurucusunu ekle. Enjekte edilen ödeme yöntemine devredenExecutePayment(amount float64) stringmetodunu ekle. Ayrıca dilimdeki her ödeme yöntemi üzerinden aynı tutarı işleyen ve tüm sonuçları döndürenProcessAll(payments []PaymentMethod, amount float64) []stringfonksiyonunu oluştur.main.go: Girdiden ödeme ayrıntılarını oku, üç ödeme türünü de oluştur ve hem bağımlılık enjeksiyonunu hem de polimorfik koleksiyonları göster. Önce kredi kartıylaNewPaymentProcessorkullanarak bir ödeme gerçekleştir. Ardından üç ödeme yönteminin tümünü bir dilimde topla ve ikinci bir tutarla hepsini işlemek içinProcessAllkullan. Her sonucu kendi satırına yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Kredi kartı numarası (ör.
4532015112830366) - 2. satır: Kart sahibinin adı
- 3. satır: PayPal e-posta adresi
- 4. satır: Banka adı
- 5. satır: Hesap numarası (ör.
987654321) - 6. satır: İlk ödeme tutarı (tek işlemci için)
- 7. satır: İkinci ödeme tutarı (toplu işleme için)
Tutarları iki ondalık basamakla biçimlendir. Örneğin 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 ve 50 verildiğinde çıktın şö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 üzerinden gerçekleştirilen tek ödemeyi gösterir. Kalan üç satır ise polimorfik koleksiyon üzerinden gerçekleştirilen toplu işlemeyi gösterir: aynı ProcessAll fonksiyonu tüm ödeme türlerini aynı şekilde işler ve arayüzlerin esnek, genişletilebilir ödeme sistemlerini nasıl mümkün kıldığını gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Girişi 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 tümünü içeren bir PaymentMethod dilimi oluştur
// TODO: Tüm ödemeleri amount2 ile işlemek için ProcessAll kullan
// ve her sonucu kendi satırına 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 PoolKendi başına pratik yap: Online Go derleyicisi