AzLearn

اختبار أنماط قواعد البيانات

Database Patterns Quiz

اختبار ~22 دقيقة

اختبار أنماط قواعد البيانات — Database Patterns Quiz

هذا الاختبار لا يحتاج اتصالاً حقيقياً بقاعدة بيانات. سنحاكي التخزين في الذاكرة حتى تركّز على شكل المسؤوليات: model، repository، ودوال واضحة.

الهدف هنا أن تفصل التفكير في قاعدة البيانات عن التفكير في منطق التطبيق. repository ليس طبقة سحرية ولا قاعدة إلزامية لكل مشروع صغير، لكنه يصبح مفيداً عندما تريد أن تمنع SQL أو تفاصيل التخزين من الانتشار في كل handler أو service. في هذا الاختبار سنستخدم ذاكرة بسيطة حتى ترى الحدود بوضوح.

هذا مثال مصغر لشكل repository في الذاكرة:

main.go

في قاعدة بيانات حقيقية قد تكون Create تنفذ INSERT، وقد ترجع خطأ من driver. لكن المستدعي لا يحتاج معرفة كل التفاصيل. يكفيه عقد واضح: أعطني مستخدماً، وسأحاول حفظه، ثم أخبرك بالنتيجة.

السؤال 1: واجهة repository

أكمل النوع بحيث يحقق واجهة UserRepository.

تحدي — Challenge

بعد حل السؤال الأول، لاحظ لماذا استخدمنا pointer receiver في Create. الدالة تعدل الشريحة داخل MemoryUsers، لذلك تحتاج تعديل نفس الكائن لا نسخة منه. أما Count فيمكنه القراءة فقط. هذا الفرق بين القراءة والتعديل مهم عند تصميم methods على types في Go.

السؤال 2: فصل التحقق عن التخزين

لا تضع كل شيء داخل main. اجعل createUser يتحقق من الاسم ثم يستدعي repository.

تحدي — Challenge

مراجعة سريعة

  • SQL مكانه في طبقة التخزين، لا في كل handler.
  • repository لا يعني تعقيداً؛ يعني حدوداً واضحة.
  • التحقق من المدخلات مسؤولية منفصلة عن تنفيذ INSERT.

ما الذي يثبت فهمك؟

الحل الجيد لا يحفظ المستخدم إذا كان الاسم فارغاً بعد strings.TrimSpace. هذا يعني أن التحقق يحدث قبل التخزين. والحل الجيد لا يطبع من داخل repository؛ التخزين لا يعرف كيف تريد عرض النتيجة. كذلك لا تجعل createUser تبني SQL أو تفكر في تفاصيل الذاكرة الداخلية؛ هي تنسق القاعدة: تحقق ثم احفظ.

من الأخطاء الشائعة أن يتحول repository إلى مكان لكل شيء: تحقق، تنسيق، رسائل، وتحويلات كثيرة. هذا يضعف الحد بدلاً من أن يقويه. اجعل repository مسؤولاً عن التخزين، واجعل منطق التطبيق مسؤولاً عن قواعد العمل. إذا احتجت لاحقاً استبدال MemoryUsers بـ SQLite، ستتغير طبقة واحدة بدلاً من مطاردة SQL في كل مكان.

خلاصة

أنماط قواعد البيانات في Go تهدف إلى الوضوح لا كثرة الملفات. model يصف البيانات، repository يخفي آلية التخزين، والدوال الأعلى تطبق قواعد العمل. عندما تبقى هذه الحدود صغيرة، تستطيع كتابة اختبارات سريعة بذاكرة داخلية، ثم استخدام قاعدة بيانات حقيقية في الإنتاج دون تغيير طريقة تفكير بقية التطبيق.