مراجعة الكود في Kotlin: ما يجب التحقق منه وكيفية تقديم الملاحظات

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

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

ابدأ الدورة

مراجعة الكود في Kotlin: ما الذي يجب التحقق منه وكيفية تقديم الملاحظات



مراجعة الكود هي واحدة من أكثر الأدوات فعالية للحفاظ على جودة الكود، وتبادل المعرفة في الفريق، ومنع الأخطاء. ومع ذلك، فإن مجرد "إلقاء نظرة سريعة" على طلب السحب (pull request) ليس كافياً. في لغة Kotlin، مع نظامها الغني بالأنواع، و coroutines، والإمكانيات الوظيفية، من المهم الانتباه إلى النقاط المحددة. في هذه المقالة، سنناقش بالضبط ما الذي يجب النظر إليه عند مراجعة كود Kotlin، وكيفية صياغة الملاحظات بحيث تكون مفيدة وليست مسيئة.



1. المبادئ الأساسية للملاحظات البناءة



قبل الانتقال إلى التفاصيل التقنية، دعنا نذكر بعض القواعد التي تجعل مراجعة الكود مفيدة لجميع المشاركين.



التركيز على الكود، وليس على المؤلف

بدلاً من "لقد كتبت كوداً سيئاً"، قل "يمكن تبسيط هذه الطريقة باستخدام let". التحديد والنبرة المحايدة يقللان من التوتر.



التصنيف إلى فئات

قم بتصنيف الملاحظات على النحو التالي:

  • Blocking — يجب الإصلاح بالتأكيد (خطأ منطقي، تسرب للموارد).
  • Nitpick — انتقادات بسيطة (الأسلوب، التنسيق).
  • Question — استفسار (النية غير واضحة).


شرح "لماذا"

لا يكفي أن تقول "استخدم filterNotNull()". أضف: "هذا سيتخلص من الحلقة الزائدة ويجعل الكود موثقاً ذاتياً". بهذه الطريقة، يتعلم المؤلف بدلاً من مجرد التصحيح.



2. Null safety والأنواع: الحلفاء الرئيسيون لـ Kotlin



تم تصميم Kotlin لتجنب NullPointerException في مرحلة التجميع. تحقق من عدم انتهاك هذه الحماية.



تجنب استخدام !! (not-null assertion) غير الضروري

العامل !! هو صرخة استغاثة. يجب أن يكون استخدامه استثناءً وليس قاعدة.



// سيء: خطر NPEfun process(user: User?) {    val name = user!!.name}

// جيد: استدعاء آمنfun process(user: User?) { val name = user?.name ?: "ضيف"}


ما الذي يجب التحقق منه: إذا رأيت !!، اسأل المؤلف عما إذا كان يمكن استبداله بـ ?.let أو ?: (elvis) أو requireNotNull().



الاستخدام الصحيح للأنواع القابلة للصفر (nullable)

ليست كل المعاملات يجب أن تكون قابلة للصفر. إذا كانت الدالة تتوقع قيمة دائماً، قم بتعريف النوع بدون علامة الاستفهام.



// محل جدل: null لا يعني شيئاًfun log(message: String?) {    println(message ?: "null")}

// أفضل: شرط واضحfun log(message: String) { println(message)}


3. coroutines والمسارات: التزامن بدون ألم



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



الـ dispatcher المناسب للمهام

لا تقم بتشغيل العمليات الطويلة (الشبكة، القرص) على Dispatchers.Main.



// سيء: يحجب واجهة المستخدمGlobalScope.launch(Dispatchers.Main) {    val data = fetchFromNetwork() // معلق}

// جيد: تبديل السياقviewModelScope.launch { val data = withContext(Dispatchers.IO) { fetchFromNetwork() } updateUI(data)}


تسرب coroutines و structured concurrency

استخدم viewModelScope أو lifecycleScope أو coroutineScope بدلاً من GlobalScope. هذا الأخير يعيش طالما يعيش التطبيق، ويؤدي بسهولة إلى التسريبات.



// خطير: تسربGlobalScope.launch { /* ... */ }

// آمن: مرتبط بدورة الحياةlifecycleScope.launch { /* ... */ }


4. المجموعات والأسلوب الوظيفي: الإيجاز وسهولة القراءة



تقدم Kotlin مكتبة غنية للعمل مع المجموعات. استخدمها بدلاً من الحلقات الصريحة.



السلاسل بدلاً من التعديلات

تجنب الإضافة اليدوية إلى القائمة إذا كان يمكن تجميع النتيجة باستخدام دوال مثل map و filter.

المدونات

توصيات الكتب