Menu
Coddy logo textTech

Итоги — Обработчик платежей

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 46 из 107.

challenge icon

Задание

Легко

Давайте создадим полноценную систему обработки платежей, которая объединит все концепции полиморфизма из этой главы. Вы создадите различные способы оплаты, работающие через единый интерфейс, процессор, который принимает любой способ оплаты через внедрение зависимостей (dependency injection), и обработаете несколько платежей через полиморфную коллекцию.

Вы организуете свой код в четырех файлах:

  • payment.go: Определите интерфейс PaymentMethod, который требует метод Process(amount float64) string. Это контракт, который должны выполнять все типы платежей.
  • methods.go: Создайте три типа платежей, каждый из которых реализует интерфейс PaymentMethod:
    • CreditCard с полями CardNumber (string) и HolderName (string) — его метод Process возвращает "Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]"
    • PayPal с полем Email — его метод Process возвращает "PayPal payment of $[amount] from [Email]"
    • BankTransfer с полями BankName и AccountNumber — его метод Process возвращает "Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])"
  • processor.go: Создайте структуру PaymentProcessor, которая содержит PaymentMethod (внедренная зависимость). Включите конструктор NewPaymentProcessor, который принимает PaymentMethod. Добавьте метод ExecutePayment(amount float64) string, который делегирует выполнение внедренному методу оплаты. Также создайте функцию ProcessAll(payments []PaymentMethod, amount float64) []string, которая обрабатывает одну и ту же сумму через каждый метод оплаты в срезе и возвращает все результаты.
  • main.go: Считайте данные о платежах из входных данных, создайте все три типа платежей и продемонстрируйте как внедрение зависимостей, так и полиморфные коллекции. Сначала используйте NewPaymentProcessor с кредитной картой и выполните платеж. Затем соберите все три метода оплаты в срез и используйте ProcessAll для их обработки со второй суммой. Выведите каждый результат на отдельной строке.

Будут предоставлены следующие входные данные:

  • Строка 1: Номер кредитной карты (например, 4532015112830366)
  • Строка 2: Имя владельца карты
  • Строка 3: Email PayPal
  • Строка 4: Название банка
  • Строка 5: Номер счета (например, 987654321)
  • Строка 6: Первая сумма платежа (для одного процессора)
  • Строка 7: Вторая сумма платежа (для пакетной обработки)

Форматируйте суммы с двумя знаками после запятой. Например, для входных данных 4532015112830366, John Smith, john@email.com, Chase, 987654321, 99.99 и 50, ваш вывод должен быть следующим:

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)

Первая строка показывает одиночный платеж через внедренный процессор. Остальные три строки показывают пакетную обработку через полиморфную коллекцию — одна и та же функция ProcessAll единообразно обрабатывает все типы платежей, демонстрируя, как интерфейсы позволяют создавать гибкие и расширяемые платежные системы.

Попробуйте сами

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Чтение входных данных
	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: Создайте три типа оплаты (CreditCard, PayPal, BankTransfer)

	// TODO: Создайте PaymentProcessor с кредитной картой, используя NewPaymentProcessor
	// и выполните платеж с amount1, затем выведите результат

	// TODO: Создайте слайс PaymentMethod, содержащий все три типа оплаты

	// TODO: Используйте ProcessAll для обработки всех платежей с amount2
	// и выведите каждый результат на отдельной строке
}

Все уроки раздела Объектно-ориентированное программирование