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

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

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 46 من 107.

challenge icon

التحدي

سهل

لنبنِ نظامًا متكاملًا لمعالجة المدفوعات يجمع جميع مفاهيم تعدد الأشكال من هذا الفصل. ستنشئ طرق دفع مختلفة تعمل من خلال واجهة موحّدة، ومعالجًا يقبل أي طريقة دفع عبر حقن dependency، وستعالج مدفوعات متعددة من خلال مجموعة متعددة الأشكال.

ستنظّم التعليمة البرمجية عبر أربعة ملفات:

  • payment.go: Define واجهة PaymentMethod تتطلب method من النوع Process(amount float64) string. هذا هو العقد الذي يجب على جميع أنواع الدفع استيفاؤه.
  • methods.go: أنشئ ثلاثة أنواع للدفع، يطبّق كل منها واجهة PaymentMethod:
    • CreditCard مع CardNumber (string) وHolderName (string) من fields. يعيد method الخاص به Process القيمة Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]
    • PayPal مع field باسم Email. يعيد method الخاص به Process القيمة PayPal payment of $[amount] from [Email]
    • BankTransfer مع fields باسمَي BankName وAccountNumber. يعيد method الخاص به Process القيمة Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
  • processor.go: أنشئ struct باسم PaymentProcessor يحتفظ بـ PaymentMethod (dependency محقون). أضف constructor باسم NewPaymentProcessor يقبل PaymentMethod. أضف method باسم ExecutePayment(amount float64) string يفوّض التنفيذ إلى طريقة الدفع المحقونة. أنشئ أيضًا function باسم ProcessAll(payments []PaymentMethod, amount float64) []string تعالج نفس amount من خلال كل طريقة دفع في الشريحة وتعيد جميع النتائج.
  • main.go: اقرأ تفاصيل الدفع من الإدخال، وأنشئ أنواع الدفع الثلاثة جميعها، واعرض كلاً من dependency injection والمجموعات متعددة الأشكال. أولاً، استخدم NewPaymentProcessor مع البطاقة الائتمانية ونفّذ عملية دفع. ثم اجمع طرق الدفع الثلاثة كلها في شريحة، واستخدم ProcessAll لمعالجتها جميعًا باستخدام amount ثانٍ. اطبع كل نتيجة في سطر مستقل.

ستُقدَّم المدخلات التالية:

  • السطر 1: رقم بطاقة الائتمان (مثل 4532015112830366)
  • السطر 2: اسم حامل البطاقة
  • السطر 3: بريد PayPal الإلكتروني
  • السطر 4: اسم البنك
  • السطر 5: رقم الحساب (مثل 987654321)
  • السطر 6: amount الدفع الأول (للمعالج الفردي)
  • السطر 7: amount الدفع الثاني (للمعالجة الدفعية)

نسّق amounts باستخدام منزلتين عشريتين. على سبيل المثال، عند إعطاء 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)

يوضح السطر الأول عملية الدفع الفردية من خلال المعالج المحقون. وتوضح الأسطر الثلاثة المتبقية المعالجة الدفعية من خلال المجموعة متعددة الأشكال: تتعامل function 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: أنشئ slice من PaymentMethod يحتوي على أنواع الدفع الثلاثة

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت