emrevarol.com

مواد المحاضرة

أفضل ممارسات البرمجة ومراجعة الكود الفعّالة

A2SV - University of Rwanda

عرض العرض التقديمي

قائمة مراجعة الكود A2SV

المعيار الذهبي. عشر فئات لتقييم كل طلب سحب تراجعه.

1 الوضوح وسهولة القراءة
اسأل
  • هل أسماء الدوال والمتغيرات واضحة؟
  • هل يمكنني فهم الكود بدون تخمين؟
  • هل الغرض واضح؟
  • هل المنطق سهل المتابعة؟
علامات تحذيرية
أسماء مثل x، tmp، data، calc، process؛ منطق متداخل بعمق؛ دوال كبيرة غير واضحة
2 جودة الدوال والتصميم
اسأل
  • هل كل دالة تقوم بشيء واحد واضح؟
  • هل منطق الأعمال منفصل عن الآثار الجانبية؟
  • هل التصميم سهل الاختبار؟
  • هل هناك دالة تقوم بأكثر مما ينبغي؟
علامات تحذيرية
التحقق + الحفظ + البريد الإلكتروني + التسجيل في دالة واحدة؛ الطباعة داخل دوال المنطق؛ سلوك مشفر موزع عبر الملف
3 الصحة
اسأل
  • هل الكود يحل المشكلة بشكل صحيح فعلاً؟
  • هل الافتراضات صريحة؟
  • هل تم التعامل مع جميع الحالات؟
علامات تحذيرية
عدم التحقق من المدخلات؛ افتراضات حول مفاتيح القاموس؛ قيم سحرية؛ فشل صامت
4 الحالات الحدية
اسأل
  • ماذا يحدث مع مدخلات فارغة؟
  • ماذا يحدث مع مدخلات غير صالحة؟
  • ماذا يحدث مع مفاتيح مفقودة؟
  • ماذا يحدث مع قيم صفرية أو سالبة؟
علامات تحذيرية
فقط المسار السعيد مأخوذ بالاعتبار؛ لا توجد فحوصات دفاعية حيث تكون مطلوبة
5 الاختبارات
اسأل
  • هل تم تضمين اختبارات؟
  • هل الاختبارات تتحقق من النتائج الدقيقة؟
  • هل الحالات الحدية مغطاة؟
  • هل ستكتشف هذه الاختبارات الانحدارات؟
علامات تحذيرية
اختبار واحد فقط؛ تأكيدات ضعيفة مثل > 0؛ لا اختبارات لمدخلات غير صالحة؛ لا اختبارات للمنطق المتغير
6 التكرار
اسأل
  • هل المنطق مكرر؟
  • هل يمكن استخراج المنطق المشترك؟
  • هل قواعد الأعمال مكررة في أماكن متعددة؟
علامات تحذيرية
صيغ مكررة؛ كتل شروط مكررة؛ قيم مشفرة مكررة
7 معالجة الأخطاء
اسأل
  • هل يتم التعامل مع الأخطاء بوضوح؟
  • هل يفشل الكود بطريقة مفهومة؟
  • هل الحالات غير الصالحة مرئية؟
علامات تحذيرية
إرجاع None بدون توضيح؛ استثناءات مبتلعة؛ أنماط فشل مخفية
8 قابلية الصيانة
اسأل
  • هل سيكون من السهل توسيع هذا لاحقاً؟
  • هل سيتمكن مهندس آخر من تعديل هذا بأمان؟
  • هل هذا يجعل قاعدة الكود أنظف أم أكثر فوضوية؟
علامات تحذيرية
قواعد مشفرة؛ طلب سحب كبير جداً؛ منطق مترابط بشدة
9 جودة المستودع
اسأل
  • هل بنية المستودع واضحة؟
  • هل ملف README مفيد؟
  • هل يمكن لمهندس جديد تشغيل المشروع بسهولة؟
  • هل التبعيات مرئية؟
علامات تحذيرية
لا توجد تعليمات إعداد؛ README ضعيف؛ تخطيط مربك؛ مجلد اختبارات مفقود
10 جودة طلب السحب
اسأل
  • هل طلب السحب مركّز؟
  • هل العنوان وصفي؟
  • هل الوصف مفيد؟
  • هل حجم التغيير معقول؟
علامات تحذيرية
عناوين غامضة؛ لا توضيح؛ تغييرات مختلطة غير مترابطة؛ طلبات سحب ضخمة

قوالب تعليقات المراجعة

صياغات احترافية لسيناريوهات المراجعة الشائعة. استخدمها كنقاط انطلاق.

التسمية
"هل يمكننا إعادة تسمية هذه الدالة لتعكس غرضها بشكل أفضل؟"
"اسم هذا المتغير يبدو عاماً جداً. هل يمكننا جعله أكثر وصفية؟"
المنطق
"هل يمكننا تبسيط هذا الشرط لتحسين سهولة القراءة؟"
"هل سيكون من المنطقي استخراج هذا المنطق إلى دالة مساعدة؟"
الاختبارات
"هل يمكننا إضافة اختبار لحالة المدخلات الفارغة؟"
"هل يمكننا التأكد من القيمة المتوقعة الدقيقة هنا بدلاً من استخدام فحص واسع؟"
البنية
"يبدو أن هذه الدالة تقوم بأشياء متعددة. هل يمكننا فصل المسؤوليات؟"
"هل تقسيم هذا إلى دوال أصغر سيجعله أسهل للاختبار والمراجعة؟"
الحالات الحدية
"ماذا يحدث إذا كان هذا المفتاح مفقوداً؟"
"هل يجب التحقق من المدخلات قبل معالجتها؟"
جودة طلب السحب
"هل يمكنك إضافة وصف قصير لطلب السحب يوضح التغيير وكيف يجب اختباره؟"

عرض مباشر: راجع طلب السحب هذا

طلب سحب به أخطاء متعمدة للتدريب. هل يمكنك اكتشاف المشكلات؟

الفرع: feature/cart-total-update
العنوان: "Update cart calculation logic"
الوصف: "Updated the cart calculation logic and added support for discount."
src/cart.py
def calc(items, user, d=False): t = 0 for i in items: if i["type"] == "book": t += i["price"] * 0.9 else: t += i["price"] if d: t = t - t * 0.1 if user is not None: if "is_premium" in user: if user["is_premium"] == True: t = t - t * 0.05 return t def process_cart(items, user): total = calc(items, user, True) print("cart processed") return total
tests/test_cart.py
from src.cart import calc def test_calc(): items = [{"type": "book", "price": 100}] user = {"is_premium": True} assert calc(items, user, True) > 0
README.md
# Cart Project cart logic
دليل المراجعة - المشكلات المطلوب إيجادها
مشاكل على مستوى طلب السحب
  • عنوان طلب سحب غامض: "Update cart calculation logic" لا يصف ما تغير
  • الوصف عام وغير مفيد
  • لا توجد خطة اختبار أو تعليمات للمراجعين
مشاكل على مستوى الكود
  • اسم الدالة calc عام جداً - يجب أن يكون calculate_cart_total
  • المعامل d غير واضح - يجب أن يكون discount_enabled
  • المتغيرات t وi غير وصفية
  • أرقام سحرية: 0.9، 0.1، 0.05 يجب أن تكون ثوابت مسماة
  • كتل if متداخلة بعمق لفحص العضوية المميزة - استخدم .get()
  • process_cart له أثر جانبي (print) مختلط مع منطق الأعمال
  • لا يوجد تحقق من المدخلات للعناصر أو المستخدم
  • المعامل المنطقي d=False يُمرر موضعياً كـ True وهو مربك
مشاكل على مستوى الاختبارات
  • حالة اختبار واحدة فقط للوحدة بأكملها
  • تأكيد ضعيف: > 0 لا يتحقق من الصحة
  • لا اختبارات للحالات الحدية (قائمة فارغة، مفاتيح مفقودة، مستخدم غير مميز)
  • لا يختبر process_cart
مشاكل على مستوى المستودع
  • README فارغ بشكل أساسي - لا توجد تعليمات إعداد ولا وصف
  • لا توجد معلومات حول كيفية تشغيل الاختبارات
النسخة المحسّنة - cart_improved.py
src/cart_improved.py
BOOK_DISCOUNT_RATE = 0.10 GENERAL_DISCOUNT_RATE = 0.10 PREMIUM_DISCOUNT_RATE = 0.05 def calculate_item_price(item): item_type = item["type"] price = item["price"] if item_type == "book": return price * (1 - BOOK_DISCOUNT_RATE) return price def apply_general_discount(total_price, discount_enabled): if not discount_enabled: return total_price return total_price * (1 - GENERAL_DISCOUNT_RATE) def apply_premium_discount(total_price, user): if not user or not user.get("is_premium", False): return total_price return total_price * (1 - PREMIUM_DISCOUNT_RATE) def calculate_cart_total(items, user, discount_enabled=False): total_price = 0 for item in items: total_price += calculate_item_price(item) total_price = apply_general_discount(total_price, discount_enabled) total_price = apply_premium_discount(total_price, user) return total_price def process_cart(items, user): total_price = calculate_cart_total(items, user, discount_enabled=True) return total_price

الواجب المنزلي

واجب مراجعة طلب السحب: راجع كمهندس محترف

يجب أن يتضمن تقديمك:

  • ١٠ إجمالي تعليقات مراجعة كحد أدنى
  • ٣ كحد أدنى تعليقات متعلقة بالتسمية
  • ٢ كحد أدنى تعليقات متعلقة بالاختبار
  • ٢ كحد أدنى تعليقات حول التصميم أو مسؤولية الدوال
  • ١ كحد أدنى تعليق على جودة المستودع
  • ١ كحد أدنى اقتراح إعادة هيكلة

صيغة التقديم

File: src/orders.py
Line/Area: calc function
Comment: The function name is too generic. Could we rename
it to calculate_order_total for clarity?

File: tests/test_orders.py
Line/Area: test_calc
Comment: This test only checks that the result is greater
than zero. Could we assert the exact expected value instead?

راجع الملفات التالية:

src/orders.py
def calc(items, vip=False): total = 0 for i in items: if i["type"] == "book": total += i["price"] * 0.9 elif i["type"] == "electronics": total += i["price"] else: total += i["price"] if vip == True: total = total - total * 0.05 return total def checkout(items, user): total = calc(items, user["vip"]) print("checking out order...") print("total is", total) return {"ok": True, "total": total}
src/utils.py
def f(x): if x == None: return False return True
tests/test_orders.py
from src.orders import calc def test_calc(): items = [{"type": "book", "price": 100}] assert calc(items, False) > 0
README.md
# Orders Run it with python.
المهندسون العظماء لا يجعلون الكود يعمل فحسب. بل يجعلونه مفهوماً وقابلاً للاختبار والمراجعة وجديراً بالثقة.
اقتباس اليوم
"الكود الذي أنت مشغول جداً عن تنظيفه اليوم يصبح المشكلة التي تملك فريقك غداً."