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

طبقة حفظ البيانات JSON

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

challenge icon

التحدي

سهل

لنقم بإضافة ميزة استمرارية البيانات إلى نظام إدارة المكتبة الخاص بنا! ستقوم بتنفيذ طبقة استمرارية JSON يمكنها تحويل بيانات مكتبتك إلى تنسيق JSON للحفظ، وتحميلها مرة أخرى من سلاسل JSON. هذا أمر ضروري لأي تطبيق حقيقي يحتاج إلى الحفاظ على البيانات بين الجلسات.

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

  • book.go: هيكل Book الخاص بك مع وسوم هيكل JSON للتحكم في التسلسل (serialization). يجب أن يحتوي كل حقل على وسم JSON مطابق: id، و title، و author، و isbn، و available. قم بتضمين منشئ NewBook الخاص بك.
  • user.go: هيكل User الخاص بك مع وسوم هيكل JSON لـ id، و name، و email، و borrowed_books. قم بتضمين منشئ NewUser الخاص بك.
  • data.go: أنشئ هيكل LibraryData يعمل ككائن نقل لعملية تسلسل JSON. يجب أن يحتوي على حقلين: Books (شريحة من مؤشرات Book) و Users (شريحة من مؤشرات User)، ولكل منهما وسوم JSON المناسبة (books و users).
  • library.go: هيكل Library الخاص بك مع خرائط (maps) للكتب والمستخدمين. أضف طريقتين (methods) جديدتين:
    • ToJSON() — يحول بيانات المكتبة إلى سلسلة JSON منسقة باستخدام json.MarshalIndent مع مسافة بادئة بمقدار مسافتين. يجب أن يجمع كل الكتب والمستخدمين من الخرائط في هيكل LibraryData، ثم يقوم بتسلسله.
    • FromJSON(jsonStr string) — يأخذ سلسلة JSON، ويقوم بإلغاء تسلسلها (unmarshals) إلى هيكل LibraryData، ويملأ خرائط المكتبة بالكتب والمستخدمين المحملين.
  • main.go: عرض طبقة الاستمرارية من خلال بناء مكتبة وتحويلها إلى JSON.

    اقرأ عدد الكتب، ثم لكل كتاب اقرأ معرفه (ID)، وعنوانه، ومؤلفه، و ISBN الخاص به. بعد ذلك، اقرأ عدد المستخدمين، ولكل مستخدم اقرأ معرفه (ID)، واسمه، وبريده الإلكتروني. بعد ملء المكتبة، استدعِ ToJSON() واطبع سلسلة JSON الناتجة.

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

  • عدد الكتب، ثم معرف كل كتاب، وعنوانه، ومؤلفه، و ISBN (كل منها في سطر منفصل)
  • عدد المستخدمين، ثم معرف كل مستخدم، واسمه، وبريده الإلكتروني (كل منها في سطر منفصل)

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

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com

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

{
  "books": [
    {
      "id": "B001",
      "title": "The Go Programming Language",
      "author": "Alan Donovan",
      "isbn": "978-0134190440",
      "available": true
    },
    {
      "id": "B002",
      "title": "Clean Code",
      "author": "Robert Martin",
      "isbn": "978-0132350884",
      "available": true
    }
  ],
  "users": [
    {
      "id": "U001",
      "name": "Alice Smith",
      "email": "alice@library.com",
      "borrowed_books": []
    }
  ]
}

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

1
B100
Design Patterns
Gang of Four
978-0201633610
0

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

{
  "books": [
    {
      "id": "B100",
      "title": "Design Patterns",
      "author": "Gang of Four",
      "isbn": "978-0201633610",
      "available": true
    }
  ],
  "users": []
}

هام: عند التكرار عبر الخرائط لبناء الشرائح الخاصة بك، أضف الكتب بالترتيب: B001، B002، إلخ (مرتبة حسب المعرف أبجديًا) والمستخدمين بالمثل. يضمن ذلك مخرجات JSON متسقة. يمكنك استخدام sort.Strings على مفاتيح الخريطة قبل التكرار.

هيكل LibraryData يسد الفجوة بين التخزين القائم على الخرائط وتنسيق JSON القائم على المصفوفات. نمط كائن النقل هذا شائع عند تسلسل هياكل البيانات المعقدة!

جرّب بنفسك

package main

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

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

	// إنشاء مكتبة جديدة
	library := NewLibrary()

	// قراءة عدد الكتب
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: قراءة تفاصيل كل كتاب (ID، title، author، ISBN)
	// وإضافتها إلى المكتبة
	for i := 0; i < numBooks; i++ {
		// TODO: قراءة ID الكتاب
		// TODO: قراءة title الكتاب
		// TODO: قراءة author الكتاب
		// TODO: قراءة ISBN الكتاب
		// TODO: إنشاء الكتاب وإضافته إلى المكتبة
	}

	// قراءة عدد المستخدمين
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: قراءة تفاصيل كل مستخدم (ID، name، email)
	// وإضافتها إلى المكتبة
	for i := 0; i < numUsers; i++ {
		// TODO: قراءة ID المستخدم
		// TODO: قراءة name المستخدم
		// TODO: قراءة email المستخدم
		// TODO: إنشاء المستخدم وإضافته إلى المكتبة
	}

	// TODO: تحويل المكتبة إلى JSON وطباعتها
	fmt.Println(library.ToJSON())
}

جميع دروس Object Oriented Programming