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 (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: Bir Process(amount float64) string metodu gerektiren bir PaymentMethod arayüzü tanımlayın. Bu, tüm ödeme türlerinin yerine getirmesi gereken sözleşmedir.
  • methods.go: Her biri PaymentMethod arayüzünü uygulayan üç ödeme türü oluşturun:
    • CardNumber (string) ve HolderName (string) alanlarına sahip CreditCardProcess metodu "Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]" döndürür.
    • Email alanına sahip PayPalProcess metodu "PayPal payment of $[amount] from [Email]" döndürür.
    • BankName ve AccountNumber alanlarına sahip BankTransferProcess metodu "Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])" döndürür.
  • processor.go: Bir PaymentMethod (enjekte edilen bağımlılık) tutan bir PaymentProcessor yapısı oluşturun. Bir PaymentMethod kabul eden bir NewPaymentProcessor kurucu fonksiyonu ekleyin. Enjekte edilen ödeme yöntemine delege eden bir ExecutePayment(amount float64) string metodu ekleyin. Ayrıca, dilimdeki (slice) her bir ödeme yöntemiyle aynı tutarı işleyen ve tüm sonuçları döndüren bir ProcessAll(payments []PaymentMethod, amount float64) []string fonksiyonu 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ıyla NewPaymentProcessor kullanı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çin ProcessAll kullanı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