ما هو مفهوم ال SOLID
ال SOLID هو اختصار لمجموعه من العادات والتي إن قمت باتباعها سوف تحصل على كود أكثر قابلية للصيانة وأسهل في التغيير والتكيف مع متطلبات المشروع المتغيرة Adaptive Code.
وليس كما قد يدل الاسم SOLID على أنه شيء يجعل الكود جامد بل بالعكس تماماً، فهذه الأفكار تدور حول كيف يمكن أن يكون الكود مرن ويتكيف مع التغييرات التي تطرأ على المشروع، حيث كما هو معروف في عالم البرمجيات أنك لا تستطيع أن تجمع كل المتطلبات من اول المشروع، وحتى لو جمعتها فهي غالباً ما تتغير مع الوقت.
ال SOLID هي لكي تحصل على الكود المرن القابل للتكيف والتغير في حال، مثلاً لم يكن الحل الأول مناسباً لحل المشكلة أو لم يكن مناسباً بعد التغيير في المتطلبات فهو يعطيك المرونة والقابلية للتغير.
محتويات السلسلة:
- مقدمة عن ال SOLID (المقال الحالي)
- شرح ال Single Responsibility Principle
- شرح Open/Closed Principle
- شرح Liskov substitution principle
- شرح Interface Segaration
- شرح Dependency Injection
من المهم معرفة أن ال SOLID هي عبارة عن مجموعة من المفاهيم والأفكار، وليست عبارة عن مكتبة أو دالة تستطيع استدعائها أو حتى فريم وروك بلغة معينة، وهذا يعني أن هذه المفاهيم تطبق على كل اللغات البرمجية سواء جافا أو سي++ أو سي# أو أي لغة أخرى، وهذا شيء جيد فهذا يعني أنك تستطيع بشكل عام قرائة أي مقالات تتحدث عن ال SOLID بغض النظر عن اللغة التي تستخدمها، ونفس الأمر في سلسلة المقالات التي سنطرحها لهذه المفاهيم حيث تستطيع تطبيقها في اللغة التي تشاء.
كثير من المبرمجين يستخدموا اللغات الكائنية OOL مثل جافا وسي# ولكن لا يكتبوا أكواد كائنية بشكل صحيح، وانما يقوموا بأول خطوة فقط، حيث يتم كتابة كلاسات تمثل المفاهيم الواقعية مثلاً Book أو Animal أو Employee ولكن في الأخير يتم استخدام هذه الكائنات ضمن سياق اجرائي Procedure Logic وقد يظن المبرمج أن هذه هي ال OO ولكنها في الحقيقة هي مجرد استخدام كائنات ولكن ضمن Procedure Logic. وبالرغم من أنه يستخدم لغات OOL الا أن طريقة تصميم الكود هي إجرائية اكثير من كونها كائنية فكتابة كود بلغة OOL لا يعني ان الكود نفسه هو OO.
لكن ان طبقت ال SOLID فسوف يكون أكثر OO، لذلك ال SOLID هي تعتبر مفتاحك الأساسي للدخول في عالم البرمجة الكائينية الحقيقية. ولا تستغرب أنها يطلق عليها أحياناً بأنها “أساسيات التصميم الكائنية Principle of object oriented design” وهي حقاً كذلك.
عندما تطبق مفاهيم ال SOLID على الكود لديك فسوف تحصل على كود مختلف يختلف عن الشكل الاجرائي الذي كنت تكتبه في السابق. ولكن في نفس الوقت سوف تجعلك أكثر إنتاجية أنت وفريقك وتجعل الكود أكثر قابلية للصيانة.
البداية
هذه الأفكار ليست جديدة، حيث قدمها Bob Martin مهندس البرمجيات المعروف بأنكل بوب منذ حوالي 16 سنة في عام 1995 وسماها بأساسيات التصميم الكائنية وبعد ذلك قام Michael Feathers (مؤلف الكتاب Working Effectively with Legacy Code ) بترتيب هذه المفاهيم حتى تشكل اختصاراً يسهل تداوله بين المبرمجين.
بالرغم من أننا في 2016 الا أن هذه العادات ما زالت غير متبعة وغير معروفة خصوصاً لدى المبرمجين الجدد، وهذه الأفكار والمفاهيم من أحد الفوارق بين كود مهندس البرمجيات الجيد والشخص الذي يضع كل شيء في دالة أو كلاس واحد.
بخصوص الإختصار SOLID فهو في الحقيقة كل حرف هو اختصار لكلمة وهي كالتالي:
- رقم 1 ال SRP تعني أن لكل كلاس يجب أن تكون سبب واحد للتغيير
- رقم 2 ال OCP تعني ان الكلاس يجب أن يكون قابل للإضافات ومغلق لتعديلات
- رقم 3 ال LSP تعني كيف يجب أن تعمل ال polymorphism وليس كيف تعمل وانما كيف يجب أن تعمل
- رقم 4 ال ISP تعني كيف يمكن ان تصمم ال Interfaces
- رقم 5 ال DIP وهي تصف العلاقة بين ال Abstraction وال Concrete Type وأنه يجب ان تعتمد على ال Abstraction.
من المهم ايضاً تذكر أنه لا يوجد أي ترتيب في هذه المفاهيم من ناحية الأهمية، فمثلاً لا يعني ان SRP أكثر أهمية من OCP أو ال OCP أقل أهمية من ال SRP، وانما ظهرت بهذا الترتيب حتى تشكل اختصار جميل SOLID.
ايضاَ هناك علاقة بين هذه المفاهيم، فاذا اخذت كل منهم بشكل معزول عن الاخر وطبقته فسوف تحصل على فائدة ولكن ليست كبيرة، بعكس عندما تأخذ كل المصطلحات ككتلة واحدة package وتطبقها فسوف تحصل على الكثير من الفوائد. فاذا كان لديك كود وتريد جعله more solid (وهنا نعنى كود أفضل) فلا تقوم مثلاً بتطبيق ال SRP على كافة الكود اولاً ثم تطبيق بعد فترة المفهوم الثاني وهكذا، بل تأخذ جزء من الكود وتطبق عليه المفاهيم مجتمعة وهذا يجعله more solid.
ولأننا في طور التعلم فسوف نقوم بشرح كل مفهوم على حدة في مقالة، ولكن تذكر أن تقوم باتباعها جميعاً متى ما استطعت في الوقت والمكان المناسب، وتذكر أن هذه العادات مثلها مثل البقية تحتاج ان تستخدم بتعقل بدون عمل overuse والا فسوف تقلل المقروئية بدرجة ما لكن سوف تحصل على قابلية التغيير Adaptive Code بلا شك.
متى تستخدم ال SOLID
ال SOLID عادة تستخدمها لإصلاح بعض المشاكل في التصميم design smell فاذا كان الكود لديك فيها بعض ال smells فال SOLID يكون مناسباً لإصلاح هذه المشكلة (راجع المقالة ما هي رائحة الكود للمزيد عن ال Code Smell) ، وقد لا يكون ال SOLID مناسباً إذا كانت لديك مشاكل أخرى على أي حالة.
لكن بعض الأشياء التي يمكن ان تحلها ال SOLID هي:
- الكود يصعب التغيير او التعديل عليه Rigidity وربما لديك تصميم جيد للمشكلة ولكن بمجرد أن يأتي طلب جديد new requirement فمن الصعب تطبيق ذلك الطلب لأن التصميم جامد
- التصميم يسهل جداً كسره Fragility بواسطة اي مبرمج جديد أو ان التصميم صعب إعادة استخدامه Immobility وتحتاج لتكرار الكود في أكثر من مكان.
مقالات مقترحة:
قبل الشروع في السلسلة فمن المفيد أن يكون لديك معلومات أساسية حول ما يلي:
ماذا تعرف عن ال Coupling وال Cohesion في تصميم البرمجيات ؟
كتاب البرمجة باستخدام ال interface
المصادر:
- https://app.pluralsight.com/library/courses/principles-oo-design
- https://app.pluralsight.com/library/courses/encapsulation-solid
- https://www.amazon.com/Adaptive-Code-via-principles-Developer/dp/0735683204
- Microsoft .NET – Architecting Applications for the Enterprise
- Professional ASP.NET Design Patterns
- Beginning SOLID Principles and Design Patterns for ASP.NET Developers
- https://www.amazon.com/Adaptive-Code-via-principles-Developer/dp/0735683204/
- https://www.amazon.com/Beginning-Principles-Patterns-ASP-NET-Developers/dp/1484218477/
- http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp
- http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf
- https://www.youtube.com/watch?v=TMuno5RZNeE
شكرا جزيلا على هذا الموضوع الرائع الذي يعاني من فهمه الكثير من المبتدئين مثلي اتمنى ان تكملو هذه السلسلة و وفقكم الله
مقال جدا رائع كالعادة
اتمنى ان تحتوى المقالات القادمة على امثلة برمجية لتوضيع معنى كل principle من ال SOLID principles
اتمنى ايضا ان تكون هذه الامثلة على لغة مثل php لان بعض الناس يظن ان مثل هذه المبادىء لا يطبق الا على اللغات الكبيرة جدا مثل java ولا يمكن تطبيقة مع لغة مثل php
اهلين أخ اشرف، سنحاول بقدر المستطاع، ولكن اذا استطعت أو أحد الأخوة تحويل الكود ومن ثم اضافته او اضافة رابط أكواد اللغات الاخرى فسوف يكون افضل وايسر لنا، دمتم بخير.
كلام رائع