نظرة عامة وهيكل المشروع
جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 98 من 107.
التحدي
سهللنبدأ مشروع نظام إدارة المكتبة من خلال إعداد الهيكل التأسيسي! في هذه الخطوة الأولى، ستقوم بإنشاء الهيكل الأساسي الذي سيدعم جميع الميزات التي سنبنيها في الدروس القادمة.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات لإنشاء فصل واضح للمسؤوليات:
book.go: قم بتعريف هيكلBookالذي يمثل كتاباً في المكتبة. يجب أن يحتوي كل كتاب علىID، وTitle، وAuthor، وحالةAvailable(boolean). قم بإنشاء دالة منشئةNewBookتأخذ المعرف (ID) والعنوان والمؤلف كمعاملات وتعيد مؤشراً (pointer) إلى كتاب جديد مع ضبطAvailableعلىtrueبشكل افتراضي. أضف أيضاً طريقةString()تعيد معلومات الكتاب بالتنسيق التالي:[ID] Title by Authoruser.go: قم بتعريف هيكلUserيمثل عضواً في المكتبة مع حقولID، وName، وEmail. قم بإنشاء دالة منشئةNewUserتأخذ القيم الثلاث وتعيد مؤشراً إلى مستخدم جديد. أضف طريقةString()تعيد:User: Name (Email)main.go: اجمع كل شيء معاً من خلال قراءة المدخلات لإنشاء الكتب والمستخدمين، ثم عرض معلوماتهم.اقرأ عدد الكتب المراد إنشاؤها. لكل كتاب، اقرأ المعرف (ID) والعنوان والمؤلف في أسطر منفصلة. ثم اقرأ عدد المستخدمين، ولكل مستخدم اقرأ المعرف (ID) والاسم والبريد الإلكتروني في أسطر منفصلة.
بعد إنشاء جميع العناصر، اطبع التمثيل النصي لكل كتاب في سطر مستقل، يليه التمثيل النصي لكل مستخدم في سطر مستقل.
سيتم توفير المدخلات التالية:
- عدد الكتب
- لكل كتاب: المعرف (ID)، والعنوان، والمؤلف (كل منها في سطر منفصل)
- عدد المستخدمين
- لكل مستخدم: المعرف (ID)، والاسم، والبريد الإلكتروني (كل منها في سطر منفصل)
على سبيل المثال، إذا كان المدخل:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.comيجب أن يكون المخرج:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)وإذا كان المدخل:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.comيجب أن يكون المخرج:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)يؤسس هذا الأساس نماذج البيانات الجوهرية التي ستوسعها طوال المشروع. في الدرس القادم، ستعمل على تحسين هذه الهياكل وإضافة وظيفة الاستعارة!
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// قراءة عدد الكتب
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: إنشاء slice لتخزين الكتب
// TODO: قراءة معلومات كل كتاب (ID، العنوان، المؤلف في أسطر منفصلة)
// وإنشاء كائنات Book باستخدام NewBook
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
// TODO: إنشاء كتاب جديد وإضافته إلى الـ slice الخاص بك
}
// قراءة عدد المستخدمين
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: إنشاء slice لتخزين المستخدمين
// TODO: قراءة معلومات كل مستخدم (ID، الاسم، البريد الإلكتروني في أسطر منفصلة)
// وإنشاء كائنات User باستخدام NewUser
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: إنشاء مستخدم جديد وإضافته إلى الـ slice الخاص بك
}
// TODO: طباعة التمثيل النصي (string representation) لكل كتاب
// TODO: طباعة التمثيل النصي (string representation) لكل مستخدم
fmt.Println("TODO: Print output here")
}
جميع دروس Object Oriented Programming
1أساسيات الـ OOP في Go
الملفات الخارجيةمساحة العمل والـ Modules في Goالـ Packages والـ Importsالأسماء المصدرة مقابل غير المصدرةمقدمة إلى الـ OOP في Goالـ Structs كـ Classesتعريف الـ Methods في الـ Structsالـ Pointer Receivers مقابل الـ Value Receiversتهيئة الـ Structدوال الـ Constructorمراجعة - آلة حاسبة بسيطة4الواجهات
مقدمة في الواجهاتالتنفيذ الضمنيالواجهة كعقدالواجهة الفارغة (any)تأكيد النوع (Type Assertion)تبديل النوع (Type Switch)تركيب الواجهاتواجهات Stringer و Errorمراجعة - حاسبة الأشكال7التغليف
الحقول المصدرة وغير المصدرةالتغليف على مستوى الحزمةدوال الـ Getter والـ Setterإخفاء المعلومات في Goملخص - سجلات الطلاب10الأنواع العامة (Go 1.18+)
مقدمة في الأنواع العامةمعاملات الأنواعقيود الأنواعالـ Structs العامةحل بديل للـ Methods العامةملخص - المجموعات العامة13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Abstract Factoryنمط Observerنمط Strategy2تعمق في الأنواع و Structs
الأنواع الأساسية والمركبةتعريفات الأنواع المخصصةStruct TagsStructs مجهولةStructs متداخلةالقيم الصفرية والافتراضيةمراجعة - دفتر العناوين5التركيب بدلاً من الوراثة
لماذا لا تدعم Go الوراثةأساسيات تضمين الـ Structترقية الـ Methodتضمين عدة Structsالتضمين مقابل التجميعحجب الـ Methods المضمنةملخص - الهيكل الهرمي للموظفين8معالجة الأخطاء و OOP
واجهة errorأنواع الأخطاء المخصصةتغليف الأخطاء (fmt.Errorf)أخطاء Sentinelerrors.Is() و errors.As()Panic و Defer و Recoverملخص - File Parser11المكتبة القياسية والبرمجة كائنية التوجه (OOP)
io.Reader و io.Writerواجهة sort.Interfaceواجهة fmt.Stringerencoding/json مع Structsواجهة http.Handlerمراجعة - نماذج REST API14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبMiddleware كنمط مزين3المؤشرات والذاكرة
أساسيات المؤشرات في Goالمؤشرات إلى الـ Structsالتمرير بالقيمة مقابل التمرير بالمرجعدالة ()newGarbage Collection في Goملخص - بناء Linked List6تعدد الأشكال في Go
تعدد الأشكال عبر InterfacesDuck Typing في Goقواعد استيفاء الـ Interfaceمجموعات متعددة الأشكالحقن التبعيةمراجعة - معالج الدفع9التزامن والبرمجة كائنية التوجه (OOP)
أساسيات الـ Goroutinesالقنوات (Channels) والاتصالالقنوات المخزنة (Buffered) مقابل غير المخزنةجملة Selectsync.Mutex و sync.RWMutexsync.WaitGroupتصميم الـ Structs الآمنة للخيوط (Thread-Safe)مراجعة - Worker Pool12مفاهيم OOP المتقدمة
نمط Functional Optionsنمط Builder في Goتسلسل الدوال (Method Chaining)الأسماء المستعارة للأنواع مقابل التعريفاتأساسيات الـ Reflectionنظرة عامة على Code Generation15مشروع: إدارة المكتبة
نظرة عامة وهيكل المشروعهياكل Structs الكتاب والمستخدم