كلام خفيف عن الـ SOLID Principles 💯
.
.
ليه بعض المشاريع البرمجية بتفضل ثابتة وقوية مهما زاد حجمها وتعقيدها، بينما مشاريع تانية أول ما تكبر شوية بتنهار وكل شوية يحصل فيها مشاكل والدنيا بتبقى مدعكة؟ 🤔
الحقيقة السر مش بس في الكود، لكن كمان في طريقة التفكير وكتابة وتنظيم الكود.
وهنا ييجي دور مبادئ الـ SOLID اللي تعتبر زي خريطة طريق لأي مهندس برمجيات عايز يكتب كود نظيف، قابل للتطوير، وسهل الصيانة.
كلمة SOLID اختصار لـ 5 مبادئ أساسية في البرمجة كائنية التوجه (Object-Oriented Programming)، وكل مبدأ فيهم له دور كبير في تحسين جودة الكود.
تعال نفهم كل مبدأ بشكل مبسط:
———
ده معناه ببساطة إن كل كائن (class) في الكود بتاعك لازم يكون عنده وظيفة واحدة بس، وما يعمل أكتر من حاجة.
علشان لو حصل تغيير في أي جزء، ما تضطر تعدّل كل الكود، وبالتالي تقل الأخطاء وتبقى الصيانة أسهل.
📍 مثال عملي: تخيل معاك موظف في الشغل بيعمل كل حاجة من الحسابات لخدمة العملاء لتوصيل الطلبات. لو الموظف ده تعب، كل حاجة هتقف! لكن لو كل موظف عنده وظيفة محددة، الدنيا هتبقى منظمة أكتر.
———
المبدأ ده بيقولك خلي الكود بتاعك جاهز للتطوير أو إضافة مميزات جديدة من غير ما تعدّل في الكود الأساسي.
علشان ما تكسر حاجات شغالة بالفعل وتبقى الميزة الجديدة زي طبقة إضافية فوق النظام القديم.
📍 مثال عملي: زي إنك تبني بيت وتسيب أماكن للتوسعات، بدل ما تضطر تهد الحيطان كل ما تحتاج تضيف أوضة جديدة.
———
لو عندك (Parent Class) و (Child Class)، الـ child class لازم يقدر يحل محل الأساسي من غير ما يحصل أي مشاكل في الكود.
علشان تضمن إن الكود بتاعك يشتغل بشكل متماسك وسلس حتى لو استخدمت كائنات مختلفة.
📍 مثال عملي: زي إنك تشتري عربية جديدة، وأيًا كان الموديل، لازم تقدر تسوقها بنفس الطريقة من غير ما تتعلم حاجة جديدة تمامًا.
———
المبدأ ده بيقول: مينفعش تجبر الـ classes إنها تستخدم حاجات مش محتاجاها. لو فيه واجهة (Interface) كبيرة ومعقدة، قسمها لواجهات صغيرة خاصة بوظائف محددة.
علشان ما تخلي الكود مليان حاجات مش ضرورية أو ملهاش علاقة بااـ class.
📍 مثال عملي: زي إنك تطلب اشتراك في صالة جيم علشان تتمرن، مينفعش تلاقي نفسك مجبر إنك تدفع رسوم لحاجات زي الساونا وحمام السباحة وأنت أصلًا عايز تتمرن بس!
———
هنا المبدأ بيقول إنك لازم تخلي الكود بتاعك يعتمد على واجهات مجردة (Abstractions) بدل ما يعتمد على تفاصيل محددة (Implementations).
علشان التعديلات تبقى أسهل وماتربط الكود بتفاصيل صغيرة ممكن تتغير في أي وقت.
📍 مثال عملي: زي إنك تستخدم شاحن USB عام بدل ما تعتمد على شاحن نوع معين، لأن أي شاحن تاني ممكن يشتغل على نفس الجهاز.
———
⚡️ ليه مبادئ الـ SOLID مهمة؟
- بتخلي الكود بتاعك سهل القراءة والفهم.
- بتقلل من الأخطاء اللي بتحصل لما تضيف مميزات جديدة.
- بتوفر وقت كبير في الصيانة والتعديلات.
- بتخليك جاهز لأي تحديات جديدة أو تغييرات في المشروع.
———
وفقكم الله لكل خير 🌿
.
.
ليه بعض المشاريع البرمجية بتفضل ثابتة وقوية مهما زاد حجمها وتعقيدها، بينما مشاريع تانية أول ما تكبر شوية بتنهار وكل شوية يحصل فيها مشاكل والدنيا بتبقى مدعكة؟ 🤔
الحقيقة السر مش بس في الكود، لكن كمان في طريقة التفكير وكتابة وتنظيم الكود.
وهنا ييجي دور مبادئ الـ SOLID اللي تعتبر زي خريطة طريق لأي مهندس برمجيات عايز يكتب كود نظيف، قابل للتطوير، وسهل الصيانة.
كلمة SOLID اختصار لـ 5 مبادئ أساسية في البرمجة كائنية التوجه (Object-Oriented Programming)، وكل مبدأ فيهم له دور كبير في تحسين جودة الكود.
تعال نفهم كل مبدأ بشكل مبسط:
———
📌 الـ Single Responsibility Principle (SRP) - المسؤولية الواحدة
ده معناه ببساطة إن كل كائن (class) في الكود بتاعك لازم يكون عنده وظيفة واحدة بس، وما يعمل أكتر من حاجة.
علشان لو حصل تغيير في أي جزء، ما تضطر تعدّل كل الكود، وبالتالي تقل الأخطاء وتبقى الصيانة أسهل.
📍 مثال عملي: تخيل معاك موظف في الشغل بيعمل كل حاجة من الحسابات لخدمة العملاء لتوصيل الطلبات. لو الموظف ده تعب، كل حاجة هتقف! لكن لو كل موظف عنده وظيفة محددة، الدنيا هتبقى منظمة أكتر.
———
📌 الـ Open/Closed Principle (OCP) - مفتوح للتوسع ومغلق للتعديل
المبدأ ده بيقولك خلي الكود بتاعك جاهز للتطوير أو إضافة مميزات جديدة من غير ما تعدّل في الكود الأساسي.
علشان ما تكسر حاجات شغالة بالفعل وتبقى الميزة الجديدة زي طبقة إضافية فوق النظام القديم.
📍 مثال عملي: زي إنك تبني بيت وتسيب أماكن للتوسعات، بدل ما تضطر تهد الحيطان كل ما تحتاج تضيف أوضة جديدة.
———
📌 الـ Liskov Substitution Principle (LSP) - استبدال الأنواع الفرعية بالأساسية
لو عندك (Parent Class) و (Child Class)، الـ child class لازم يقدر يحل محل الأساسي من غير ما يحصل أي مشاكل في الكود.
علشان تضمن إن الكود بتاعك يشتغل بشكل متماسك وسلس حتى لو استخدمت كائنات مختلفة.
📍 مثال عملي: زي إنك تشتري عربية جديدة، وأيًا كان الموديل، لازم تقدر تسوقها بنفس الطريقة من غير ما تتعلم حاجة جديدة تمامًا.
———
📌 الـ Interface Segregation Principle (ISP) - تقسيم الواجهات
المبدأ ده بيقول: مينفعش تجبر الـ classes إنها تستخدم حاجات مش محتاجاها. لو فيه واجهة (Interface) كبيرة ومعقدة، قسمها لواجهات صغيرة خاصة بوظائف محددة.
علشان ما تخلي الكود مليان حاجات مش ضرورية أو ملهاش علاقة بااـ class.
📍 مثال عملي: زي إنك تطلب اشتراك في صالة جيم علشان تتمرن، مينفعش تلاقي نفسك مجبر إنك تدفع رسوم لحاجات زي الساونا وحمام السباحة وأنت أصلًا عايز تتمرن بس!
———
📌 الـ Dependency Inversion Principle (DIP) - عكس التبعية
هنا المبدأ بيقول إنك لازم تخلي الكود بتاعك يعتمد على واجهات مجردة (Abstractions) بدل ما يعتمد على تفاصيل محددة (Implementations).
علشان التعديلات تبقى أسهل وماتربط الكود بتفاصيل صغيرة ممكن تتغير في أي وقت.
📍 مثال عملي: زي إنك تستخدم شاحن USB عام بدل ما تعتمد على شاحن نوع معين، لأن أي شاحن تاني ممكن يشتغل على نفس الجهاز.
———
⚡️ ليه مبادئ الـ SOLID مهمة؟
- بتخلي الكود بتاعك سهل القراءة والفهم.
- بتقلل من الأخطاء اللي بتحصل لما تضيف مميزات جديدة.
- بتوفر وقت كبير في الصيانة والتعديلات.
- بتخليك جاهز لأي تحديات جديدة أو تغييرات في المشروع.
———
وفقكم الله لكل خير 🌿
❤8
Event Emitters in JavaScript 💯
———
📌 Ideal For:
- UI interactions (clicks, form submissions)
- APIs/HTTP servers (request/response handling)
- Real-time apps (chat, notifications)
- Modular systems (plugins, micro-services)
Event emitters decouple components, enabling scalable, event-driven architectures.
———
📌 Ideal For:
- UI interactions (clicks, form submissions)
- APIs/HTTP servers (request/response handling)
- Real-time apps (chat, notifications)
- Modular systems (plugins, micro-services)
❤5
As a React.js developer,
Please learn:
1. Advanced State Management
- Redux & Redux Toolkit
- Context API
- Recoil or Zustand
2. React Performance Optimization
- Memoization (React.memo, useMemo, useCallback)
- Code Splitting
- React Profiler
3. Component Design Patterns
- Higher-Order Components (HOCs)
- Custom Hooks
4. Server-Side Rendering (SSR)
- Next.js
- Hydration
5. TypeScript with React
- Type Safety
- Advanced Types and Generics
6. Testing
- React Testing Library
- End-to-End Testing (Cypress, Playwright)
- Mocking and Stubbing
7. React Ecosystem and Tooling
- Webpack and Babel
- ESLint and Prettier
8. API Integration
- GraphQL (Apollo Client, Relay)
- SWR and React Query
- WebSockets and Real-Time Updates
9. Authentication and Authorization
- OAuth and JWT
- Role-Based Access Control (RBAC)
10. Code Architecture
- Monorepos (Nx, Lerna)
- Micro-Frontends
- Atomic Design
11. Web Performance Optimization
- Lazy Loading
- Progressive Web Apps (PWA)
- Service Workers
Please learn:
1. Advanced State Management
- Redux & Redux Toolkit
- Context API
- Recoil or Zustand
2. React Performance Optimization
- Memoization (React.memo, useMemo, useCallback)
- Code Splitting
- React Profiler
3. Component Design Patterns
- Higher-Order Components (HOCs)
- Custom Hooks
4. Server-Side Rendering (SSR)
- Next.js
- Hydration
5. TypeScript with React
- Type Safety
- Advanced Types and Generics
6. Testing
- React Testing Library
- End-to-End Testing (Cypress, Playwright)
- Mocking and Stubbing
7. React Ecosystem and Tooling
- Webpack and Babel
- ESLint and Prettier
8. API Integration
- GraphQL (Apollo Client, Relay)
- SWR and React Query
- WebSockets and Real-Time Updates
9. Authentication and Authorization
- OAuth and JWT
- Role-Based Access Control (RBAC)
10. Code Architecture
- Monorepos (Nx, Lerna)
- Micro-Frontends
- Atomic Design
11. Web Performance Optimization
- Lazy Loading
- Progressive Web Apps (PWA)
- Service Workers
❤6💯1
لو بتدور على شغل عن بُعد في مجال الـ Tech 💯
.
.
قائمة تحتوي على مجموعة شركات بتوفر فرص شغل جزئي أو كلي عن بُعد.
———
A list of semi to fully remote-friendly companies (jobs) in tech.
https://github.com/remoteintech/remote-jobs
.
.
قائمة تحتوي على مجموعة شركات بتوفر فرص شغل جزئي أو كلي عن بُعد.
———
Remote-Friendly Companies 💯
A list of semi to fully remote-friendly companies (jobs) in tech.
https://github.com/remoteintech/remote-jobs
❤8🔥1
يعني إيه Cross-Site Scripting (XSS)؟ ⚠️
.
.
الـ XSS هو نوع من أنواع الثغرات الأمنية اللي ممكن تكون موجودة في المواقع، وبيستغلها الهاكرز علشان ينفذوا أكواد ضارة داخل صفحة الويب اللي بيستخدمها الضحية، وكده الهاكر يقدر يتحكم في الموقع أو حسابات المستخدمين، أو حتى يسحب بياناتهم الخاصة.
———
📌 الثغرة دي بتشتغل إزاي؟
خليني أشرحلك السيناريو البسيط اللي ممكن يحصل:
1- الهاكر بيكون عنده كود JavaScript ضار وعايز يزرعه في الموقع.
2- بيستغل ثغرة في المدخلات (Inputs) الموجودة في الموقع زي الـ Forms أو الـ Comments، أو حتى في URL لو الموقع مش مؤمّن كويس.
3- المستخدم العادي، اللي هو الضحية، بيفتح الصفحة من غير ما يعرف، والكود الضار اللي كتبه الهاكر بيبدأ يشتغل تلقائي، وده بيدّي الهاكر صلاحيات كبيرة داخل حسابات الضحية أو حتى بيتمكن من سرقة البيانات اللي موجودة على الموقع.
💥 يعني الكود الضار اللي كتبه الهاكر ممكن يتحكم في أي حاجة بتظهر للمستخدم على الموقع، وده ممكن يكون من خلال:
- سرقة الكوكيز: اللي هي زي ملفات صغيرة بتحتفظ بمعلومات تسجيل الدخول والتفضيلات. الكود الضار ممكن ياخدها ويبعتهاله، والهاكر يستخدمها علشان يدخل بحساب الضحية.
- تغيير محتوى الصفحة: ممكن الهاكر يحط حاجات أو رسائل وهمية في الصفحة تخلّي المستخدمين يدخلوا بياناتهم الشخصية، زي رسائل "تسجيل الدخول" أو "تحديث الحساب".
- إعادة توجيه المستخدم: لو الهاكر عايز ينقلك لموقع ضار تاني فيه فيروسات أو برامج خبيثة، ممكن يخليك تروحله وأنت مش واخد بالك.
———
🔐 أنواع الـ XSS:
فيه أكتر من نوع يخص الـ XSS، وكل نوع له طريقة مختلفة في التنفيذ وأثر مختلف، خليني أقولك الأنواع الرئيسية:
📍 الـ Stored XSS: النوع ده بيحصل لما الكود الضار بيتخزن في الموقع نفسه، يعني بيكون ثابت وكل مرة حد يفتح الصفحة يتنّفذ على طول.
📍 الـ Reflected XSS: النوع ده بيشتغل لما الكود بيتنّفذ فورًا في الصفحة اللي اتضاف فيها، زي لما حد يبعته في رابط URL، والمستخدم يفتحه فيلاقي الكود شغال.
📍 الـ DOM-based XSS: ده نوع أذكى شويه لأنه بيشتغل على مستوى الـ DOM بتاع الصفحة، يعني بيتعامل مباشرة مع العناصر اللي بتتغير في واجهة المستخدم، وده بيخلي الثغرة أصعب شوية في الاكتشاف.
———
💡 إزاي نمنع الـ XSS؟
عشان تحمي موقعك أو تطمّن إنك متأمن ضد الثغرة دي، لازم تركز على كام حاجة:
📌 أي حاجة بيضيفها المستخدم في الموقع (زي النصوص أو التعليقات) لازم يتعمل عليها فلتر و Validation وتتأكد إن مفيهاش أكواد ضارة.
📌 استخدام Content Security Policy (CSP): ده زي طبقة حماية إضافية بتمنع تنفيذ الأكواد اللي جايه من مصادر غير موثوقة.
📌 تشفير المدخلات والمخرجات: عن طريق استخدام HTML encoding عشان تحول الرموز اللي ممكن تسبب مشاكل (زي < و >) لرموز آمنة.
📌 منع الكوكيز من السرقة: باستخدام حاجة زي HttpOnly اللي بتحمي الكوكيز من الوصول المباشر عبر JavaScript.
———
✋ الـ XSS ثغرة خطيرة جدًا ممكن تهدد خصوصية المستخدمين وتضر بسمعة الموقع كمان. عشان كده لازم تكون فاهم تفاصيلها كويس وتقدر تأمن موقعك منها....
.
.
الـ XSS هو نوع من أنواع الثغرات الأمنية اللي ممكن تكون موجودة في المواقع، وبيستغلها الهاكرز علشان ينفذوا أكواد ضارة داخل صفحة الويب اللي بيستخدمها الضحية، وكده الهاكر يقدر يتحكم في الموقع أو حسابات المستخدمين، أو حتى يسحب بياناتهم الخاصة.
———
📌 الثغرة دي بتشتغل إزاي؟
خليني أشرحلك السيناريو البسيط اللي ممكن يحصل:
1- الهاكر بيكون عنده كود JavaScript ضار وعايز يزرعه في الموقع.
2- بيستغل ثغرة في المدخلات (Inputs) الموجودة في الموقع زي الـ Forms أو الـ Comments، أو حتى في URL لو الموقع مش مؤمّن كويس.
3- المستخدم العادي، اللي هو الضحية، بيفتح الصفحة من غير ما يعرف، والكود الضار اللي كتبه الهاكر بيبدأ يشتغل تلقائي، وده بيدّي الهاكر صلاحيات كبيرة داخل حسابات الضحية أو حتى بيتمكن من سرقة البيانات اللي موجودة على الموقع.
💥 يعني الكود الضار اللي كتبه الهاكر ممكن يتحكم في أي حاجة بتظهر للمستخدم على الموقع، وده ممكن يكون من خلال:
- سرقة الكوكيز: اللي هي زي ملفات صغيرة بتحتفظ بمعلومات تسجيل الدخول والتفضيلات. الكود الضار ممكن ياخدها ويبعتهاله، والهاكر يستخدمها علشان يدخل بحساب الضحية.
- تغيير محتوى الصفحة: ممكن الهاكر يحط حاجات أو رسائل وهمية في الصفحة تخلّي المستخدمين يدخلوا بياناتهم الشخصية، زي رسائل "تسجيل الدخول" أو "تحديث الحساب".
- إعادة توجيه المستخدم: لو الهاكر عايز ينقلك لموقع ضار تاني فيه فيروسات أو برامج خبيثة، ممكن يخليك تروحله وأنت مش واخد بالك.
———
🔐 أنواع الـ XSS:
فيه أكتر من نوع يخص الـ XSS، وكل نوع له طريقة مختلفة في التنفيذ وأثر مختلف، خليني أقولك الأنواع الرئيسية:
📍 الـ Stored XSS: النوع ده بيحصل لما الكود الضار بيتخزن في الموقع نفسه، يعني بيكون ثابت وكل مرة حد يفتح الصفحة يتنّفذ على طول.
📍 الـ Reflected XSS: النوع ده بيشتغل لما الكود بيتنّفذ فورًا في الصفحة اللي اتضاف فيها، زي لما حد يبعته في رابط URL، والمستخدم يفتحه فيلاقي الكود شغال.
📍 الـ DOM-based XSS: ده نوع أذكى شويه لأنه بيشتغل على مستوى الـ DOM بتاع الصفحة، يعني بيتعامل مباشرة مع العناصر اللي بتتغير في واجهة المستخدم، وده بيخلي الثغرة أصعب شوية في الاكتشاف.
———
💡 إزاي نمنع الـ XSS؟
عشان تحمي موقعك أو تطمّن إنك متأمن ضد الثغرة دي، لازم تركز على كام حاجة:
📌 أي حاجة بيضيفها المستخدم في الموقع (زي النصوص أو التعليقات) لازم يتعمل عليها فلتر و Validation وتتأكد إن مفيهاش أكواد ضارة.
📌 استخدام Content Security Policy (CSP): ده زي طبقة حماية إضافية بتمنع تنفيذ الأكواد اللي جايه من مصادر غير موثوقة.
📌 تشفير المدخلات والمخرجات: عن طريق استخدام HTML encoding عشان تحول الرموز اللي ممكن تسبب مشاكل (زي < و >) لرموز آمنة.
📌 منع الكوكيز من السرقة: باستخدام حاجة زي HttpOnly اللي بتحمي الكوكيز من الوصول المباشر عبر JavaScript.
———
✋ الـ XSS ثغرة خطيرة جدًا ممكن تهدد خصوصية المستخدمين وتضر بسمعة الموقع كمان. عشان كده لازم تكون فاهم تفاصيلها كويس وتقدر تأمن موقعك منها....
❤7
الـ OOP أو Object-Oriented Programming 🔻
الـ OOP بتقوم على أربع أعمدة أساسية: Abstraction، Encapsulation، Inheritance، وPolymorphism. طيب، إيه معناهم؟
———
الفكرة في الـ Abstraction هي إنك تخفي التفاصيل اللي تخص الـ implementation وتعرض بس الحاجات المهمة اللي المستخدم محتاج يعرفها.
زي مثلًا لو عندك class اسمه
———
الـ Encapsulation معناه إنك "تغلف" البيانات (اللي هي الـ fields) والوظائف (اللي هي الـ methods) في وحدة واحدة اللي هي الـ class. وكمان، إنك تحدد مين يقدر يوصل للبيانات دي عن طريق الـ access modifiers.
زي إنك تخلي الـ fields بتاعتك
———
الـ Inheritance بيسمح لك تعمل class جديد (child class) يورث الـ attributes والـ methods من class موجود بالفعل (parent class). الميزة هنا إنك بتقدر تعيد استخدام الكود بدل ما تكتبه من أول وجديد.
مثال: عندك class اسمه
———
الـ Polymorphism معناه إن الـ methods بتشتغل بشكل مختلف بناءً على الـ object اللي بتتطبق عليه. وده بيخليك تستخدم نوعين ليهم نفس الـ inheritance chain مع بعض من غير مشاكل.
يعني لو عندك method بتاخد
———
وفقكم الله لكل خير 🌿
الـ OOP بتقوم على أربع أعمدة أساسية: Abstraction، Encapsulation، Inheritance، وPolymorphism. طيب، إيه معناهم؟
———
🟠 Abstraction
الفكرة في الـ Abstraction هي إنك تخفي التفاصيل اللي تخص الـ implementation وتعرض بس الحاجات المهمة اللي المستخدم محتاج يعرفها.
زي مثلًا لو عندك class اسمه
Vehicle وفيه method اسمها stop، الـ method دي ممكن تكون abstract يعني محدش يعرف إزاي بتشتغل من جواها، كل اللي باين إنها بتوقف الـ Vehicle.———
🟠 Encapsulation
الـ Encapsulation معناه إنك "تغلف" البيانات (اللي هي الـ fields) والوظائف (اللي هي الـ methods) في وحدة واحدة اللي هي الـ class. وكمان، إنك تحدد مين يقدر يوصل للبيانات دي عن طريق الـ access modifiers.
زي إنك تخلي الـ fields بتاعتك
private، وتعمل لها getters و setters علشان تتحكم في الوصول لها.———
🟠 Inheritance
الـ Inheritance بيسمح لك تعمل class جديد (child class) يورث الـ attributes والـ methods من class موجود بالفعل (parent class). الميزة هنا إنك بتقدر تعيد استخدام الكود بدل ما تكتبه من أول وجديد.
مثال: عندك class اسمه
Vehicle، تعمل منه class اسمه Car، والـ Car هيبقى عنده نفس صفات وسلوكيات الـ Vehicle.———
🟠 Polymorphism
الـ Polymorphism معناه إن الـ methods بتشتغل بشكل مختلف بناءً على الـ object اللي بتتطبق عليه. وده بيخليك تستخدم نوعين ليهم نفس الـ inheritance chain مع بعض من غير مشاكل.
يعني لو عندك method بتاخد
Vehicle كـ parameter، ممكن تبعت لها Car أو Bike وهتشتغل عادي طالما إنهم بيورثوا من Vehicle.———
وفقكم الله لكل خير 🌿
❤8👏3
دردشة سريعة عن الـ Interface Segregation Principle 💯
.
.
تخيل أنك في شغلانة معينة وكل شوية حد يطلب منك تاسكات ملهاش علاقة ببعض ولا ليها علاقة بالشغلانة...طبيعي هتلاقي نفسك مشتت بين التاسكات كلها ومفيش فرصة تركز في الشغلانة الأساسية اللي جاي علشانها وكمان مش هتعملها بأفضل شكل.
نفس السيناريو ده بالضبط ممكن يحصل في البرمجة لما الكود يبقى مضطر يلتزم بحاجات هو مش محتاجها.
وهنا هتلاقي دور الـ Interface Segregation Principle، واحد من أهم المبادئ الخمسة لمفهوم SOLID، عشان يحل المشكلة دي.
———
يعني إيه Interface Segregation Principle؟ 🤔
الـ ISP بيقول ببساطة: "مينفعش تخلي الكود يلتزم بحاجات هو مش محتاجها."
لو عندك Interface فيه مليون وظيفة (methods) لكن الكائن (object) اللي هيستخدم الـ Interface ده هيحتاج كام حاجة بس، يبقى كده أنت بتحمّله شغل ملوش لازمة، وده هيعمل مشاكل في الكود بعدين.
———
مثال بسيط 👇
لو عندك Interface اسمه Bird
لو عملت كائن (object) زي Duck هيبقى منطقي جدًا إنه يقدر يطير (fly) ويعوم (swim).
لكن لو عندك كائن زي Penguin؟ البطريق بيعوم بس، ومش بيعرف يطير!
في الحالة دي الـ Penguin هيضطر يطبق (implement) وظيفة ملوش علاقة بيها وهي fly، حتى لو مش هيستخدمها.
———
✅ الحل؟
افصل الوظائف بتاعت الـ Interface على حسب الاحتياج الفعلي:
وكده لما تيجي تعمل Duck، هيطبق الاتنين:
أما الـ Penguin، هيطبّق بس اللي له علاقة به:
———
📌 ليه المبدأ ده مهم؟
- لما كل كائن يكون مرتبط بالوظائف اللي فعلًا محتاجها، بيبقى أسهل تعمل تغييرات من غير ما تسبب مشاكل لباقي الكود.
- الكود بتاعك هيبقى منظم "Organized" أكتر ومفهوم لأي حد يشتغل عليه بعدك.
- مش هتضطر تضيف دوال (methods) مش مستخدمة، وده بيقلل الـ Bugs اللي ممكن تظهر.
———
📍 دائمًا خليك حريص إن أي Interface يكون متخصص ومحدد الوظائف.
📍 لو لقيت Interface كبير ومعقد، افصله لعدة Interfaces أصغر.
📍 فكر كويس قبل ما تعمل أي implements، واسأل نفسك: الكائن ده فعلًا محتاج كل اللي موجود في الـ Interface؟
———
وفقكم الله لكل خير 🌿
.
.
تخيل أنك في شغلانة معينة وكل شوية حد يطلب منك تاسكات ملهاش علاقة ببعض ولا ليها علاقة بالشغلانة...طبيعي هتلاقي نفسك مشتت بين التاسكات كلها ومفيش فرصة تركز في الشغلانة الأساسية اللي جاي علشانها وكمان مش هتعملها بأفضل شكل.
نفس السيناريو ده بالضبط ممكن يحصل في البرمجة لما الكود يبقى مضطر يلتزم بحاجات هو مش محتاجها.
وهنا هتلاقي دور الـ Interface Segregation Principle، واحد من أهم المبادئ الخمسة لمفهوم SOLID، عشان يحل المشكلة دي.
———
يعني إيه Interface Segregation Principle؟ 🤔
الـ ISP بيقول ببساطة: "مينفعش تخلي الكود يلتزم بحاجات هو مش محتاجها."
لو عندك Interface فيه مليون وظيفة (methods) لكن الكائن (object) اللي هيستخدم الـ Interface ده هيحتاج كام حاجة بس، يبقى كده أنت بتحمّله شغل ملوش لازمة، وده هيعمل مشاكل في الكود بعدين.
———
مثال بسيط 👇
لو عندك Interface اسمه Bird
interface Bird {
fly(): void;
swim(): void;
}لو عملت كائن (object) زي Duck هيبقى منطقي جدًا إنه يقدر يطير (fly) ويعوم (swim).
لكن لو عندك كائن زي Penguin؟ البطريق بيعوم بس، ومش بيعرف يطير!
في الحالة دي الـ Penguin هيضطر يطبق (implement) وظيفة ملوش علاقة بيها وهي fly، حتى لو مش هيستخدمها.
———
✅ الحل؟
افصل الوظائف بتاعت الـ Interface على حسب الاحتياج الفعلي:
interface FlyingBird {
fly(): void;
}
interface SwimmingBird {
swim(): void;
}وكده لما تيجي تعمل Duck، هيطبق الاتنين:
class Duck implements FlyingBird, SwimmingBird {
fly() {
console.log('Duck is flying');
}
swim() {
console.log('Duck is swimming');
}
}أما الـ Penguin، هيطبّق بس اللي له علاقة به:
class Penguin implements SwimmingBird {
swim() {
console.log('Penguin is swimming');
}
}———
📌 ليه المبدأ ده مهم؟
- لما كل كائن يكون مرتبط بالوظائف اللي فعلًا محتاجها، بيبقى أسهل تعمل تغييرات من غير ما تسبب مشاكل لباقي الكود.
- الكود بتاعك هيبقى منظم "Organized" أكتر ومفهوم لأي حد يشتغل عليه بعدك.
- مش هتضطر تضيف دوال (methods) مش مستخدمة، وده بيقلل الـ Bugs اللي ممكن تظهر.
———
📍 دائمًا خليك حريص إن أي Interface يكون متخصص ومحدد الوظائف.
📍 لو لقيت Interface كبير ومعقد، افصله لعدة Interfaces أصغر.
📍 فكر كويس قبل ما تعمل أي implements، واسأل نفسك: الكائن ده فعلًا محتاج كل اللي موجود في الـ Interface؟
———
وفقكم الله لكل خير 🌿
❤5👏1