Menu
Coddy logo textTech

Özet - Ödeme İşlemcisi

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 37 / 91.

challenge icon

Görev

Kolay

Polimorfizm hakkında öğrendiğiniz her şeyi bir araya getiren eksiksiz bir ödeme işleme sistemi kuralım. Farklı ödeme yöntemlerinin tek bir birleşik işlemci aracılığıyla işlenebildiği, arayüz tabanlı (interface-based) bir mimari oluşturacaksınız; bu, polimorfizmin kodu nasıl esnek ve genişletilebilir kıldığını gösterecektir.

Kodunuzu beş dosya halinde düzenleyeceksiniz:

  • PaymentMethod.php — İki metot imzasına sahip bir PaymentMethod arayüzü tanımlayın: ödemeyi işlemek için process(float $amount): string ve ödeme türü adını döndüren statik bir metot olan getMethodName(): string. Bu sözleşme, herhangi bir ödeme yönteminin tek tip olarak işlenebilmesini sağlar.
  • CreditCard.phpPaymentMethod arayüzünü uygulayan bir CreditCard sınıfı oluşturun. Arayüz dosyasını dahil edin. Sınıf, yapıcı (constructor) aracılığıyla ayarlanan özel bir $lastFourDigits özelliğine sahip olmalıdır. process() metodunu "Processing $[amount] via Credit Card ending in [lastFourDigits]" döndürecek şekilde uygulayın (tutarı 2 ondalık basamak olacak şekilde formatlayın). Statik getMethodName() metodunu, "Credit Card" döndürmek için geç statik bağlama (late static binding) kullanarak uygulayın.
  • PayPal.phpPaymentMethod arayüzünü uygulayan bir PayPal sınıfı oluşturun. Arayüz dosyasını dahil edin. Sınıf, yapıcı aracılığıyla ayarlanan özel bir $email özelliğine sahip olmalıdır. process() metodunu "Processing $[amount] via PayPal account [email]" döndürecek şekilde uygulayın (tutarı 2 ondalık basamak olacak şekilde formatlayın). Statik getMethodName() metodunu "PayPal" döndürecek şekilde uygulayın.
  • PaymentProcessor.php — Ödemeleri yöneten bir PaymentProcessor sınıfı oluşturun. Arayüz dosyasını dahil edin. Herhangi bir ödeme yöntemini kabul etmek için arayüz türü ipucunu (interface type hinting) kullanan bir executePayment(PaymentMethod $method, float $amount): string metodu ekleyin. Bu metot, ödeme yöntemi üzerindeki process() çağrısının sonucunu döndürmelidir. Geçilen ödeme yöntemi sınıfından statik getMethodName() metodunu kullanarak "Payment via: [methodName]" döndüren başka bir describeMethod(PaymentMethod $method): string metodu ekleyin.
  • main.php — Tüm ödeme sınıfı dosyalarını ve işlemciyi dahil edin. Bir PaymentProcessor örneği oluşturun. Üç girdi alacaksınız: bir kredi kartının son dört hanesi, bir PayPal e-posta adresi ve bir ödeme tutarı. İlgili tanımlayıcılarla hem bir CreditCard hem de bir PayPal örneği oluşturun. Tutarı float türüne dönüştürün. İşlemciyi kullanarak önce kredi kartıyla, ardından PayPal ile bir ödeme gerçekleştirin. Her sonucu kendi satırında yazdırın. Son olarak, PayPal ödeme yöntemi için yöntem açıklamasını yazdırın.

Bu tasarımın güzelliği, PaymentProcessor sınıfınızın kredi kartları veya PayPal hakkında özel bir şey bilmemesidir; o sadece PaymentMethod arayüzünü bilir. Yarın bir BankTransfer veya Cryptocurrency sınıfı ekleyebilirsiniz ve işlemci bunları hiçbir değişiklik yapmadan işleyebilir. İşte arayüz tabanlı polimorfizmin geç statik bağlama ile birleşen gücü budur!

Kendin dene

<?php
// Gerekli tüm dosyaları dahil et
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// Girdileri oku
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: Bir PaymentProcessor örneği oluştur

// TODO: Son dört haneyi kullanarak bir CreditCard örneği oluştur

// TODO: E-posta ile bir PayPal örneği oluştur

// TODO: Kredi kartı ile ödemeyi gerçekleştir ve sonucu yazdır

// TODO: PayPal ile ödemeyi gerçekleştir ve sonucu yazdır

// TODO: PayPal ödeme yöntemi için yöntem açıklamasını yazdır
?>

Nesne Yönelimli Programlama bölümündeki tüm dersler