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

واجهة CLI للمسؤول

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

challenge icon

التحدي

سهل

لنقم ببناء واجهة سطر أوامر (CLI) لنظام إدارة المكتبة الخاص بنا باستخدام نمط الأمر (Command Pattern)! ستقوم بإنشاء CLI يعالج أوامر المسؤول مثل إضافة الكتب، وتسجيل المستخدمين، وإدارة عمليات الاستعارة — كل ذلك من خلال بنية نظيفة وقابلة للتوسع.

ستقوم بتنظيم الكود الخاص بك عبر ستة ملفات:

  • book.go: هيكل Book الخاص بك مع وسوم JSON لكل من ID، و Title، و Author، و ISBN، و Available. قم بتضمين منشئ NewBook.
  • user.go: هيكل User الخاص بك مع وسوم JSON لكل من ID، و Name، و Email، و BorrowedBooks. قم بتضمين منشئ NewUser.
  • library.go: هيكل Library الخاص بك مع خرائط (maps) للكتب والمستخدمين، بالإضافة إلى دوال AddBook، و AddUser، و Borrow، و Return من الدروس السابقة.
  • commands.go: هنا ينبض نمط الأمر بالحياة! قم بتعريف واجهة Command مع دالة Execute تأخذ *Library ووسائط []string، وتعيد نتيجة نصية (string). ثم قم بتنفيذ هياكل الأوامر التالية:
    • AddBookCommand — يتوقع 4 وسائط: id، title، author، isbn. يضيف الكتاب ويعيد Book added: [title]
    • AddUserCommand — يتوقع 3 وسائط: id، name، email. يضيف المستخدم ويعيد User added: [name]
    • BorrowCommand — يتوقع وسيطين: userID، bookID. يعيد Borrowed: [bookID] عند النجاح، أو Error: [message] عند الفشل
    • ReturnCommand — يتوقع وسيطين: userID، bookID. يعيد Returned: [bookID] عند النجاح، أو Error: [message] عند الفشل
    • ListBooksCommand — لا يأخذ وسائط. يعيد معرف (ID) وعنوان كل كتاب في أسطر منفصلة بتنسيق [id]: [title]، أو No books إذا كانت القائمة فارغة (يجب عرض الكتب مرتبة حسب ID)

    إذا تلقى الأمر وسائط غير كافية، فقم بإرجاع Error: insufficient arguments

  • cli.go: أنشئ هيكل CLI يحتوي على مؤشر إلى Library وخريطة (map) لأسماء الأوامر مع تنفيذات Command الخاصة بها. قم ببناء:
    • منشئ NewCLI يقوم بتهيئة CLI مع مكتبة وتسجيل جميع الأوامر: addbook، و adduser، و borrow، و return، و listbooks
    • دالة Run تأخذ سلسلة نصية كمدخل، وتقوم بتحليلها باستخدام strings.Fields، وتبحث عن الأمر، وتنفذه. أعد No command provided للمدخلات الفارغة، أو Unknown command: [name] للأوامر غير المعروفة
  • main.go: أنشئ مكتبة و CLI، ثم قم بمعالجة الأوامر من المدخلات. اقرأ عدد الأوامر، ثم اقرأ كل سلسلة نصية للأمر في سطر منفصل. لكل أمر، استدعِ Run واطبع النتيجة.

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

  • عدد الأوامر
  • كل أمر كسلسلة نصية كاملة في سطر خاص به

على سبيل المثال، إذا كان المدخل:

6
addbook B001 Go-Programming Alan-Donovan 978-0134190440
addbook B002 Clean-Code Robert-Martin 978-0132350884
adduser U001 Alice alice@test.com
borrow U001 B001
listbooks
borrow U001 B001

يجب أن يكون مخرجك:

Book added: Go-Programming
Book added: Clean-Code
User added: Alice
Borrowed: B001
B001: Go-Programming
B002: Clean-Code
Error: book not available

وإذا كان المدخل:

4
listbooks
addbook B100 Design-Patterns Gang-of-Four 978-0201633610
listbooks
invalidcmd test

يجب أن يكون مخرجك:

No books
Book added: Design-Patterns
B100: Design-Patterns
Unknown command: invalidcmd

وإذا كان المدخل:

5
adduser U001 Bob bob@email.com
borrow U001 B001
addbook B001 Golang-Guide John-Smith 123-456
borrow U001 B001
return U001 B001

يجب أن يكون مخرجك:

User added: Bob
Error: book not found
Book added: Golang-Guide
Borrowed: B001
Returned: B001

لاحظ كيف أن CLI لا يحتاج إلى معرفة تفاصيل كل عملية — فهو ببساطة يبحث عن الأمر ويفوض التنفيذ. هذا يجعل إضافة أوامر جديدة أمراً بسيطاً مثل إنشاء هيكل جديد ينفذ واجهة Command وتسجيله في CLI!

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	// قراءة عدد الأوامر
	var n int
	fmt.Scanln(&n)

	// إنشاء scanner لقراءة الأسطر الكاملة
	scanner := bufio.NewScanner(os.Stdin)

	// TODO: إنشاء Library جديدة

	// TODO: إنشاء CLI جديد مع الـ library

	// TODO: معالجة كل أمر
	// لكل أمر من الـ n أوامر:
	// - قراءة سطر الأوامر باستخدام scanner.Scan() و scanner.Text()
	// - تشغيل الأمر من خلال الـ CLI
	// - طباعة النتيجة

	_ = scanner // قم بإزالة هذا السطر عند استخدام scanner
}

جميع دروس Object Oriented Programming