مبادئ SOLID في Kotlin: النظرية والتطبيق لكتابة كود نظيف

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا SOLID مهم في Kotlin؟



SOLID هو اختصار لخمسة مبادئ أساسية في البرمجة كائنية التوجه، صاغها روبرت مارتن. في سياق Kotlin، وهي لغة حديثة متعددة المنصات، تكتسب هذه المبادئ أهمية خاصة. تجمع Kotlin بين ميزات البرمجة كائنية التوجه والبرمجة الوظيفية، مما يسمح بكتابة كود أكثر مرونة وقابلية للصيانة. يساعد الالتزام بمبادئ SOLID المطورين على بناء أنظمة يسهل توسيع نطاقها واختبارها وصيانتها.

في هذه المقالة، سنشرح كل مبدأ من المبادئ الخمسة بأمثلة محددة بلغة Kotlin، من النظرية إلى التطبيق العملي. ستتعلم كيفية تجنب الأنماط المعاكسة الشائعة وجعل كودك أنظف.



1. Single Responsibility Principle (SRP) — مبدأ المسؤولية الواحدة

النظرية: يجب أن يكون لكل class سبب واحد فقط للتغيير. بمعنى آخر، يجب أن يكون class مسؤولاً عن وظيفة أو مهمة واحدة فقط.

التطبيق العملي في Kotlin: غالباً ما ينتهك المطورون مبدأ SRP بوضع منطق معالجة البيانات والتحقق من صحتها والتعامل مع الخدمات الخارجية في class واحد.

مثال على الانتهاك:

class UserManager {    fun saveUser(user: User) {        // حفظ في قاعدة البيانات        println("User saved to DB")    }

fun sendEmail(user: User, message: String) { // إرسال بريد إلكتروني println("Email sent to ${user.email}") }

fun validateUser(user: User): Boolean { // التحقق من صحة البيانات return user.name.isNotEmpty() }}

هنا، UserManager مسؤول عن الحفظ وإرسال البريد الإلكتروني والتحقق من الصحة. إذا تغير منطق إرسال البريد الإلكتروني، فسيتعين تغيير هذا class، مما قد يعطل حفظ البيانات.

النسخة المصححة مع SRP:

class UserRepository {    fun save(user: User) {        println("User saved to DB")    }}

class EmailService { fun send(user: User, message: String) { println("Email sent to ${user.email}") }}

class UserValidator { fun validate(user: User): Boolean { return user.name.isNotEmpty() }}

الآن كل class لديه مسؤولية واحدة، مما يبسط اختبار الكود وتعديله.



2. Open/Closed Principle (OCP) — مبدأ الانفتاح/الإغلاق

النظرية: يجب أن تكون الكيانات البرمجية (classes، modules، functions) مفتوحة للتمديد ولكن مغلقة للتعديل. هذا يعني أنه يجب أن تكون قادراً على إضافة سلوك جديد دون تغيير الكود الموجود.

التطبيق العملي في Kotlin: استخدم التجريد (interfaces أو abstract classes) وتعدد الأشكال. في Kotlin، تعتبر sealed class وتعبيرات when مثالية لهذا الغرض.

مثال على الانتهاك:

class AreaCalculator {    fun calculate(shape: Any): Double {        return when (shape) {            is Circle -> Math.PI * shape.radius * shape.radius            is Square -> shape.side * shape.side            else -> throw IllegalArgumentException("Unknown shape")        }    }}

لإضافة شكل جديد (مثل Triangle)، سيتعين تعديل دالة calculate.

النسخة المصححة مع OCP:

interface Shape {    fun area(): Double}

class Circle(private val radius: Double) : Shape { override fun area() = Math.PI * radius * radius}

class Square(private val side: Double) : Shape { override fun area() = side * side}

class Triangle(private val base: Double, private val height: Double) : Shape { override fun area() = 0.5 * base * height}

class AreaCalculator { fun calculate(shape: Shape) = shape.area()}

الآن لإضافة شكل جديد، يكفي إنشاء class جديد يقوم بتطبيق interface Shape.

المدونات

توصيات الكتب