Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - معالج الدفع

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 46 من 107.

challenge icon

التحدي

سهل

لنقم ببناء نظام معالجة مدفوعات كامل يجمع بين جميع مفاهيم تعدد الأشكال (polymorphism) من هذا الفصل. ستقوم بإنشاء طرق دفع مختلفة تعمل من خلال واجهة (interface) موحدة، ومعالج يقبل أي طريقة دفع عبر حقن التبعية (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 يفوض العمل لتابع Process الخاص بطريقة الدفع المحقونة. قم أيضاً بإنشاء دالة ProcessAll(payments []PaymentMethod, amount float64) []string تعالج نفس المبلغ من خلال كل طريقة دفع في الشريحة (slice) وتعيد جميع النتائج.
  • main.go: اقرأ تفاصيل الدفع من المدخلات، وأنشئ جميع أنواع الدفع الثلاثة، واستعرض كلاً من حقن التبعية والمجموعات متعددة الأشكال. أولاً، استخدم NewPaymentProcessor مع بطاقة الائتمان ونفذ عملية دفع. ثم اجمع طرق الدفع الثلاثة في شريحة واستخدم ProcessAll لمعالجتها جميعاً بمبلغ ثانٍ. اطبع كل نتيجة في سطر مستقل.

سيتم توفير المدخلات التالية:

  • السطر 1: رقم بطاقة الائتمان (مثلاً، 4532015112830366)
  • السطر 2: اسم حامل البطاقة
  • السطر 3: بريد 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 مع جميع أنواع الدفع بشكل موحد، مما يوضح كيف تمكن الواجهات (interfaces) من بناء أنظمة دفع مرنة وقابلة للتوسع.

جرّب بنفسك

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: إنشاء slice من PaymentMethod يحتوي على جميع أنواع الدفع الثلاثة

	// TODO: استخدام ProcessAll لمعالجة جميع عمليات الدفع باستخدام amount2
	// وطباعة كل نتيجة في سطر منفصل
}

جميع دروس Object Oriented Programming