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

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

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

challenge icon

التحدي

سهل

لنَبْنِ واجهة سطر أوامر لنظام إدارة المكتبة باستخدام نمط الأوامر! ستنشئ CLI يعالج أوامر المسؤول مثل إضافة الكتب، وتسجيل المستخدمين، وإدارة عمليات الاستعارة: كل ذلك من خلال بنية نظيفة قابلة للتوسّع.

ستنظّم شيفرتك عبر ستة ملفات:

  • book.go: بنية Book الخاصة بك مع وسوم JSON لكل من ID وTitle وAuthor وISBN وAvailable. ضمّن المُنشئ NewBook.
  • user.go: بنية User الخاصة بك مع وسوم JSON لكل من ID وName وEmail وBorrowedBooks. ضمّن المُنشئ NewUser.
  • library.go: بنية Library الخاصة بك مع خرائط للكتب والمستخدمين، إلى جانب أساليب AddBook وAddUser وBorrow وReturn من الدروس السابقة.
  • commands.go: هنا يظهر نمط الأوامر بوضوح! عرّف واجهة Command مع أسلوب Execute يأخذ *Library و[]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]: [title]، أو No books إذا كانت القائمة فارغة (مع ترتيب الكتب حسب المعرّف)

    إذا تلقّى أحد الأوامر عددًا غير كافٍ من الوسائط، فأرجع Error: insufficient arguments

  • cli.go: أنشئ بنية CLI تحتوي على مؤشر إلى Library وخريطة لأسماء الأوامر وتطبيقات 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 := bufio.NewScanner(os.Stdin)

	// TODO: أنشئ Library جديدة

	// TODO: أنشئ CLI جديدة مع المكتبة

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

	_ = scanner // احذف هذا السطر عندما تستخدم scanner
}

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

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