كود نظيف في Kotlin: المبادئ والأمثلة للمبتدئين
\n\nالكود النظيف (Clean Code) ليس مجرد مصطلح عصري، بل هو مهارة أساسية لأي مطور. في لغة Kotlin، التي تجمع بين الإيجاز والقوة، تصبح كتابة كود قابل للقراءة والصيانة أمرًا مهمًا بشكل خاص. في هذه المقالة، سنشرح المبادئ الأساسية لـ Clean Code في Kotlin، ونقدم أمثلة عملية، ونوضح كيفية تجنب الأخطاء الشائعة. المادة موجهة للمطورين المبتدئين الذين يرغبون في كتابة كود احترافي من اليوم الأول.
\n\n1. تسمية المتغيرات والدوال والفئات
\n\nالتسمية الصحيحة هي أساس الكود النظيف. يجب أن يجيب الاسم على الأسئلة: "ما هذا؟" و"لماذا هو مطلوب؟". في Kotlin، يُستخدم camelCase للمتغيرات والدوال، و PascalCase للفئات والكائنات.
\n\nمثال سيء:
\nval x = 5\nfun calc(a: Int, b: Int): Int {\n return a * b + 10\n}\n\nمثال جيد:
\nval maxRetryCount = 5\nfun calculateTotalPrice(basePrice: Int, tax: Int): Int {\n return basePrice + tax\n}\n\nالقواعد الأساسية:
\n- \n
- تجنب الاختصارات — من الأفضل استبدال
usrبـuser، وcalcبـcalculate. \n - استخدم الأفعال للدوال —
getUser()،sendEmail()،validateInput(). \n - المتغيرات المنطقية سمها بالبادئات
is،has،can—isActive،hasPermission. \n - تجنب المعلومات الزائدة —
userListأفضل منlistOfUsersFromDatabase. \n
2. مبادئ SOLID في Kotlin
\n\nSOLID هي خمسة مبادئ للبرمجة كائنية التوجه تساعد في إنشاء أنظمة مرنة وسهلة الصيانة. دعنا نستعرضها مع أمثلة في Kotlin.
\n\nSingle Responsibility (المسؤولية الواحدة)
\nيجب أن يكون للفئة سبب واحد فقط للتغيير. قسم المنطق إلى فئات صغيرة ومتخصصة.
\n\nمثال سيء:
\nclass UserManager {\n fun saveUser(user: User) { /* حفظ في قاعدة البيانات */ }\n fun sendEmail(user: User) { /* إرسال بريد إلكتروني */ }\n fun printReport(user: User) { /* طباعة تقرير */ }\n}\n\nمثال جيد:
\nclass UserRepository {\n fun save(user: User) { /* حفظ في قاعدة البيانات */ }\n}\n\nclass EmailService {\n fun send(user: User) { /* إرسال بريد إلكتروني */ }\n}\n\nclass ReportPrinter {\n fun print(user: User) { /* طباعة تقرير */ }\n}\n\nOpen/Closed (الانفتاح/الإغلاق)
\nيجب أن تكون الفئات مفتوحة للتمديد ولكن مغلقة للتعديل. استخدم الواجهات والوراثة.
\n\ninterface Shape {\n fun area(): Double\n}\n\nclass Circle(val radius: Double) : Shape {\n override fun area() = Math.PI * radius * radius\n}\n\nclass Rectangle(val width: Double, val height: Double) : Shape {\n override fun area() = width * height\n}\n\n// الآن يمكن إضافة أشكال جديدة دون تغيير الكود الموجود\n\n\nLiskov Substitution (استبدال ليسكوف)
\nيجب أن تحل كائنات الفئات الفرعية محل كائنات الفئة الأساسية دون انتهاك المنطق. في Kotlin، هذا مهم بشكل خاص عند العمل مع المجموعات والوراثة.
\n\nopen class Bird {\n open fun fly() = "يطير"\n}\n\nclass Penguin : Bird() {\n override fun fly() = throw UnsupportedOperationException("طيور البطريق لا تطير")\n}\n// هذا انتهاك للمبدأ - من الأفضل نقل "القدرة على الطيران" إلى واجهة منفصلة\n\n\n3. العمل مع الدوال: الإيجاز والنقاء
\n\nتقدم Kotlin أدوات قوية لكتابة دوال نظيفة. القواعد الأساسية:
\n\n- \n