Menu
Coddy logo textTech

Özet - Payment Processor

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 46 / 107.

challenge icon

Görev

Kolay

Bu 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: PaymentMethod metodunu gerektiren bir Process(amount float64) string arayüzü tanımla. Bu, tüm ödeme türlerinin yerine getirmesi gereken sözleşmedir.
  • methods.go: PaymentMethod arayüzünü uygulayan üç ödeme türü oluştur:
    • CreditCard; CardNumber (string) ve HolderName (string) alanlarına sahip olsun. Process metodu Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName] döndürür.
    • PayPal; bir Email alanına sahip olsun. Process metodu PayPal payment of $[amount] from [Email] döndürür.
    • BankTransfer; BankName ve AccountNumber alanlarına sahip olsun. Process metodu Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber]) döndürür.
  • processor.go: Enjekte edilen bir PaymentProcessor bağımlılığını tutan bir PaymentMethod yapısı oluştur. Bir NewPaymentProcessor kabul eden PaymentMethod kurucusunu ekle. Enjekte edilen ödeme yöntemine devreden ExecutePayment(amount float64) string metodunu ekle. Ayrıca dilimdeki her ödeme yöntemi üzerinden aynı tutarı işleyen ve tüm sonuçları döndüren ProcessAll(payments []PaymentMethod, amount float64) []string fonksiyonunu 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ıyla NewPaymentProcessor kullanarak bir ödeme gerçekleştir. Ardından üç ödeme yönteminin tümünü bir dilimde topla ve ikinci bir tutarla hepsini işlemek için ProcessAll kullan. 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

Kendi başına pratik yap: Online Go derleyicisi