Menu
Coddy logo textTech

Repaso: procesador de pagos

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 37 de 91.

challenge icon

Desafío

Fácil

Construyamos un sistema completo de procesamiento de pagos que reúna todo lo que has aprendido sobre polimorfismo. Crearás una arquitectura basada en interfaces en la que se puedan procesar diferentes métodos de pago mediante un único procesador unificado: demostrando cómo el polimorfismo hace que el código sea flexible y extensible.

Organizarás tu código en cinco archivos:

  • PaymentMethod.php: Define una interfaz PaymentMethod con dos firmas de método: process(float $amount): string para gestionar el pago, y un método estático getMethodName(): string que devuelve el nombre del tipo de pago. Este contrato garantiza que cualquier método de pago pueda procesarse de manera uniforme.
  • CreditCard.php: Crea una clase CreditCard que implemente PaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada $lastFourDigits establecida mediante el constructor. Implementa process() para que devuelva "Processing $[amount] via Credit Card ending in [lastFourDigits]" (formatea el importe con 2 decimales). Implementa el método estático getMethodName() mediante enlace estático tardío para que devuelva "Credit Card".
  • PayPal.php: Crea una clase PayPal que implemente PaymentMethod. Incluye el archivo de la interfaz. La clase debe tener una propiedad privada $email establecida mediante el constructor. Implementa process() para que devuelva "Processing $[amount] via PayPal account [email]" (formatea el importe con 2 decimales). Implementa el método estático getMethodName() para que devuelva "PayPal".
  • PaymentProcessor.php: Crea una clase PaymentProcessor que coordine los pagos. Incluye el archivo de la interfaz. Añade un método executePayment(PaymentMethod $method, float $amount): string que use la declaración de tipo de la interfaz para aceptar cualquier método de pago. Este método debe devolver el resultado de llamar a process() en el método de pago. Añade otro método describeMethod(PaymentMethod $method): string que devuelva "Payment via: [methodName]" usando el método estático getMethodName() de la clase del método de pago proporcionado.
  • main.php: Incluye todos los archivos de las clases de pago y el procesador. Crea una instancia de PaymentProcessor. Recibirás tres entradas: los últimos cuatro dígitos de una tarjeta de crédito, una dirección de correo electrónico de PayPal y un importe de pago. Crea una instancia de CreditCard y otra de PayPal con sus identificadores correspondientes. Convierte el importe a un valor float. Usa el procesador para ejecutar primero un pago con la tarjeta de crédito y después uno con PayPal. Imprime cada resultado en su propia línea. Finalmente, imprime la descripción del método correspondiente al método de pago de PayPal.

La ventaja de este diseño es que tu PaymentProcessor no sabe nada específicamente sobre las tarjetas de crédito ni sobre PayPal. Solo conoce la interfaz PaymentMethod. Mañana podrías añadir una clase BankTransfer o Cryptocurrency, y el procesador las gestionaría sin ninguna modificación. ¡Ese es el poder del polimorfismo basado en interfaces combinado con el enlace estático tardío!

Pruébalo tú mismo

<?php
// Incluir todos los archivos requeridos
require_once 'CreditCard.php';
require_once 'PayPal.php';
require_once 'PaymentProcessor.php';

// Leer las entradas
$lastFourDigits = trim(fgets(STDIN));
$paypalEmail = trim(fgets(STDIN));
$amount = floatval(trim(fgets(STDIN)));

// TODO: Crear una instancia de PaymentProcessor

// TODO: Crear una instancia de CreditCard con los últimos cuatro dígitos

// TODO: Crear una instancia de PayPal con el email

// TODO: Ejecutar el pago con tarjeta de crédito e imprimir el resultado

// TODO: Ejecutar el pago con PayPal e imprimir el resultado

// TODO: Imprimir la descripción del método para el método de pago de PayPal
?>

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online