تصميم البرمجيات
تعلم كيفية بناء أنظمة نظيفة وقابلة للتوسّع باستخدام OOP، Clean Code، SOLID Principles، و Design Patterns. هذا المسار يجهزك لأن تكون مهندس برمجيات محترف.
مقدمة في OOP Thinking
ما هذا؟
البرمجة الكينونية (Object-Oriented Programming) هي نموذج برمجي يعتمد على مفهوم "الكائنات" (Objects) التي تحتوي على بيانات (خصائص) وسلوكيات (دوال). بدلاً من كتابة كود خطي، نقوم بتصميم النظام كمجموعة من الكائنات تتفاعل مع بعضها البعض.
لماذا هو مهم؟
OOP تساعد في بناء أنظمة معقدة بطريقة منظمة وسهلة الصيانة. معظم لغات البرمجة الحديثة (Java, C++, C#, Python, JavaScript) تدعم OOP. فهم OOP هو أساس لتطوير البرمجيات الاحترافية.
الفرق بين Procedural و OOP
• Procedural : برمجة إجرائية تعتمد على دوال وإجراءات متسلسلة
• OOP : برمجة كينونية تعتمد على كائنات تتفاعل مع بعضها
• OOP : للأنظمة الكبيرة والمعقدة
مصادر التعلم
Classes & Objects
ما هذا؟
الـ Class (كلاس) هو قالب أو مخطط لإنشاء الكائنات (Objects). يحدد الخصائص (attributes) والسلوكيات (methods) التي سيمتلكها الكائن. الـ Object هو نسخة فعلية من الـ Class.
لماذا هو مهم؟
الفرق بين Class و Object هو أساس OOP. فهم هذا المفهوم يمكنك من إنشاء كائنات متعددة من نفس القالب، مما يسهل إدارة الكود وإعادة استخدامه.
مثال
Class Car يحدد خصائص (color, model, speed) ودوال (start(), stop()). الكائنات هي سيارات فعلية مثل (Car1, Car2) لكل منها خصائصها الخاصة.
مصادر التعلم
Encapsulation
ما هذا؟
التغليف (Encapsulation) هو إخفاء البيانات الداخلية للكائن ومنع الوصول المباشر إليها. يتم ذلك باستخدام معدلات الوصول (Access Modifiers) مثل private و public، وتوفير دوال عامة (Getters/Setters) للوصول إلى البيانات بطريقة آمنة.
لماذا هو مهم؟
التغليف يحمي البيانات من التعديل غير المقصود، ويسمح بتغيير طريقة تنفيذ الكود دون التأثير على الكود الخارجي. كما أنه يسهل صيانة الكود ويقلل من الأخطاء.
مصادر التعلم
Abstraction
ما هذا؟
التجريد (Abstraction) هو إخفاء التفاصيل الداخلية وإظهار الوظائف الأساسية فقط للمستخدم. يتم ذلك باستخدام الـ Abstract Classes والـ Interfaces.
لماذا هو مهم؟
التجريد يبسط التعامل مع الأنظمة المعقدة. المستخدم يتعامل مع واجهة بسيطة دون الحاجة لفهم التفاصيل الداخلية. كما أنه يسمح بتغيير التنفيذ الداخلي دون التأثير على المستخدم.
مصادر التعلم
Inheritance
ما هذا؟
الوراثة (Inheritance) هي آلية تسمح للكلاس الجديد (Child Class) بوراثة خصائص ودوال كلاس موجود (Parent Class). هذا يعزز إعادة استخدام الكود ويخلق علاقات هرمية بين الكلاسات.
لماذا هو مهم؟
الوراثة تقلل من تكرار الكود وتسهل صيانته. كما أنها تعكس العلاقات الطبيعية في العالم الحقيقي (مثل: سيارة هي نوع من المركبات).
مصادر التعلم
Polymorphism
ما هذا؟
تعدد الأشكال (Polymorphism) هو قدرة الكائن على اتخاذ أشكال متعددة. هناك نوعان: Overloading (دوال بنفس الاسم ومعاملات مختلفة) و Overriding (إعادة تعريف دالة من الكلاس الأب في الكلاس الابن).
لماذا هو مهم؟
تعدد الأشكال يجعل الكود أكثر مرونة وقابلية للتوسع. يسمح بكتابة كود عام يتعامل مع أنواع مختلفة من الكائنات دون معرفة نوعها الدقيق.
مصادر التعلم
Relationships Between Classes
ما هذا؟
العلاقات بين الكلاسات تصف كيفية تفاعل الكائنات مع بعضها البعض: • Association: علاقة استخدام بسيطة • Aggregation: علاقة "لديه" (has-a) ضعيفة • Composition: علاقة "لديه" (has-a) قوية
مصادر التعلم
Mini Project (OOP Basics)
فكرة المشروع
نظام إدارة مكتبة بسيط
قم ببناء نظام باستخدام OOP يحتوي على كلاسات: Book، Member، Library. يجب أن
يشمل:
• إضافة كتب وحذفها
• إعارة كتاب وإرجاعه
• عرض قائمة الكتب المتاحة
Clean Code Basics
ما هذا؟
Clean Code هو مجموعة من المبادئ والتقنيات لكتابة كود نظيف وسهل القراءة والصيانة. يشمل: • تسمية المتغيرات والدوال بشكل واضح ومعبر • كتابة دوال صغيرة (لا تزيد عن 20 سطر) • تجنب التكرار (DRY: Don't Repeat Yourself)
Code Structure
ما هذا؟
هيكلة الكود تعني تنظيم الملفات والكلاسات والدوال بطريقة منطقية. تشمل: • فصل المسؤوليات (Separation of Concerns) • تنظيم الملفات حسب الوظيفة • استخدام المجلدات (Folders) لتنظيم المشروع
Refactoring Basics
ما هذا؟
إعادة الهيكلة (Refactoring) هي عملية تحسين الكود دون تغيير سلوكه الخارجي. تشمل: • إزالة التكرار (Remove Duplication) • تبسيط الشروط المعقدة • تقسيم الدوال الكبيرة إلى دوال أصغر
Mini Refactor Project
فكرة المشروع
قم بإعادة هيكلة مشروع OOP السابق (نظام المكتبة) باستخدام مبادئ Clean Code. تأكد من: • تسمية واضحة للمتغيرات والدوال • دوال صغيرة ومركزة • إزالة أي تكرار في الكود
Single Responsibility Principle (SRP)
ما هذا؟
مبدأ المسؤولية الواحدة: "يجب أن يكون لكل كلاس سبب واحد فقط للتغيير". بمعنى أن كل كلاس يجب أن يكون مسؤولاً عن وظيفة واحدة فقط.
مصادر التعلم
Open/Closed Principle (OCP)
ما هذا؟
مبدأ الـ Open/Closed: "الكلاسات يجب أن تكون مفتوحة للتوسعة، مغلقة للتعديل". يمكننا إضافة وظائف جديدة دون تعديل الكود الموجود.
مصادر التعلم
Liskov Substitution Principle (LSP)
ما هذا؟
مبدأ الاستبدال: "إذا كان S كلاس فرعي من T، فيمكننا استبدال كائن من T بكائن من S دون تغيير سلوك البرنامج". بمعنى أن الكلاس الابن يجب أن يكون قابلاً للاستبدال بالكلاس الأب.
مصادر التعلم
Interface Segregation Principle (ISP)
ما هذا؟
مبدأ فصل الواجهات: "لا يجب إجبار الكلاس على تنفيذ واجهات لا يستخدمها". من الأفضل تقسيم الواجهات الكبيرة إلى واجهات أصغر وأكثر تخصصاً.
مصادر التعلم
Dependency Inversion Principle (DIP)
ما هذا؟
مبدأ عكس الاعتماد: "الاعتماد على التجريدات (Interfaces) وليس على التفاصيل (Concrete Classes)". هذا يقلل الاقتران بين المكونات ويسهل التغيير.
مصادر التعلم
Apply SOLID Project
فكرة المشروع
قم بإعادة تصميم مشروع المكتبة باستخدام مبادئ SOLID الخمسة. تأكد من تطبيق:
• SRP: كل كلاس مسؤول عن شيء واحد
• OCP: قابل للتوسعة
• LSP: استبدال آمن
• ISP: واجهات صغيرة
• DIP: اعتماد على التجريدات
مقدمة في Design Patterns
ما هذا؟
أنماط التصميم (Design Patterns) هي حلول قابلة للتكرار لمشكلات شائعة في تصميم البرمجيات. توفر طريقة موحدة لحل المشكلات وتسهل التواصل بين المطورين.
مصادر التعلم
Creational Patterns
ما هذا؟
الأنماط الإنشائية (Creational Patterns) تهتم بآليات إنشاء الكائنات:
• Singleton: ضمان وجود نسخة واحدة فقط من الكلاس
• Factory: إنشاء كائنات دون تحديد النوع الدقيق
• Builder: بناء كائنات معقدة خطوة بخطوة
مصادر التعلم
Structural Patterns
ما هذا؟
الأنماط الهيكلية (Structural Patterns) تهتم بتركيب الكلاسات والكائنات:
• Adapter: تحويل واجهة كلاس إلى واجهة أخرى
• Decorator: إضافة وظائف جديدة ديناميكياً
• Facade: توفير واجهة مبسطة لنظام معقد
مصادر التعلم
Behavioral Patterns
ما هذا؟
الأنماط السلوكية (Behavioral Patterns) تهتم بالتواصل بين الكائنات:
• Observer: إعلام الكائنات عند حدوث تغيير
• Strategy: تغيير سلوك الخوارزمية في وقت التشغيل
• Command: تغليف الطلب ككائن
مصادر التعلم
Pattern Practice
ما هذا؟
قم بتطبيق كل Pattern درسته في مثال عملي. مثلاً:
• Singleton: مدير اتصال قاعدة بيانات
• Factory: إنشاء كائنات حسب النوع
• Observer: نظام إشعارات
• Strategy: خوارزميات دفع مختلفة
مصادر التعلم
System Design Thinking (مقدمة)
ما هذا؟
تصميم الأنظمة (System Design) هو عملية تصميم بنية النظام البرمجي. تشمل: • تقسيم النظام إلى مكونات أصغر (Modules) • تحديد العلاقات بين المكونات • التفكير في قابلية التوسع (Scalability) • التعامل مع المتطلبات غير الوظيفية (الأداء، الأمان، التوفر)
لماذا هو مهم؟
تصميم الأنظمة هو مهارة أساسية للمهندسين المتقدمين والـ Architects. يساعد في بناء أنظمة قابلة للتوسع وموثوقة. هذا الموضوع مهم جداً للمقابلات التقنية في كبرى الشركات.
المفاهيم الأساسية
• Load Balancing: توزيع الحمل على عدة خوادم
• Caching: تخزين البيانات المؤقتة لتحسين الأداء
• Database Scaling: تقسيم قواعد البيانات (Sharding, Replication)
• Microservices vs Monolithic: مقارنة بين العمارات المختلفة
• CAP Theorem: التناسق، التوفر، تحمل التقسيم
مصادر التعلم
Final Project 🔥
فكرة المشروع
نظام إدارة المهام المتقدم (Advanced Task Management System)
قم ببناء نظام متكامل لإدارة المهام والمشاريع باستخدام جميع المفاهيم التي
تعلمتها:
المتطلبات
1. OOP:
• كلاسات: User, Task, Project, Comment, Notification
• علاقات: Inheritance، Polymorphism، Encapsulation
2. Clean Code:
• تسمية واضحة للمتغيرات والدوال
• دوال صغيرة ومركزة (لا تزيد عن 20 سطر)
• إزالة التكرار (DRY)
3. SOLID Principles:
• SRP: كل كلاس مسؤول عن شيء واحد
• OCP: قابل للتوسعة (إضافة أنواع جديدة من المهام)
• LSP: استبدال آمن للكلاسات
• ISP: واجهات صغيرة ومركزة
• DIP: الاعتماد على التجريدات
4. Design Patterns:
• Singleton: مدير الجلسة (Session Manager)
• Factory: إنشاء مهام حسب النوع
• Observer: نظام الإشعارات
• Strategy: خوارزميات تصفية المهام المختلفة
• Command: تنفيذ العمليات (إضافة، حذف، تعديل)
5. System Design:
• هيكلة المشروع بطريقة قابلة للتوسع
• فصل المسؤوليات (MVC أو Layered Architecture)
• التفكير في الأداء وقابلية التوسع
الوظائف الأساسية
• تسجيل الدخول وإنشاء حساب جديد
• إنشاء مشاريع ومهام
• تعيين مهام لمستخدمين آخرين
• تحديد أولويات المهام (عالية، متوسطة، منخفضة)
• إضافة تعليقات على المهام
• إشعارات عند تغيير حالة المهمة
• تقارير عن إنجاز المهام
• بحث وتصفية المهام
• حفظ البيانات في ملفات (JSON أو CSV)
نصائح للتطبيق
- ابدأ بتصميم الـ Classes والعلاقات بينها
- استخدم Git للتحكم في الإصدارات
- اكتب وثائق بسيطة للكود (Comments)
- اختبر كل جزء قبل الانتقال للجزء التالي
- أضف معالجة للأخطاء (Error Handling)
- راجع كودك بعد الانتهاء وابحث عن فرص للتحسين