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

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

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

ابدأ الدورة

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



مراجعة الكود ليست مجرد إجراء شكلي، بل هي مرحلة تطوير حاسمة. خاصة في Go، حيث البساطة وقابلية قراءة الكود متأصلة في فلسفة اللغة. بالنسبة للمطورين المبتدئين، قد يبدو هذا مخيفًا: كيف تنتقد كود شخص آخر إذا كنت غير متأكد بعد؟ في الواقع، مراجعة الكود هي أفضل طريقة للتعلم. في هذه المقالة، سنناقش ما يجب الانتباه إليه عند مراجعة كود Go وكيفية تقديم ملاحظات مفيدة وليست مسيئة.



1. المبادئ الأساسية: ما الذي تبحث عنه أولاً



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



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


مثال على خطأ نموذجي للمبتدئين:



func getFirstElement(s []int) int {    return s[0] // ذعر إذا كانت الشريحة فارغة!}


ما يجب اقتراحه في المراجعة: إضافة التحقق من طول الشريحة وإرجاع خطأ.



func getFirstElement(s []int) (int, error) {    if len(s) == 0 {        return 0, fmt.Errorf("slice is empty")    }    return s[0], nil}


2. مصطلحات Go الاصطلاحية: كيف تكتب "بطريقة Go"



Go ليست Java وليست Python. لها أسلوبها الخاص الذي يجب احترامه. في المراجعة، انتبه إلى النقاط التالية:



  • التسمية: في Go، الأسماء القصيرة هي المعتادة (مثل r للقارئ، w للكاتب). لا حاجة لتسمية المتغير myReader - فقط r.
  • معالجة الأخطاء: لا تتجاهل الأخطاء! إذا كانت الدالة ترجع error، فيجب التحقق منها. الاستثناء هو fmt.Println وما شابه، ولكن من الأفضل تسجيلها أيضًا.
  • الواجهات: يجب أن تكون صغيرة. طريقة واحدة جيدة، واثنتان كثير بالفعل. لا تنشئ واجهات "للنمو المستقبلي".


مثال على كود "غير-Go-أصيل":



func ProcessData(data []string) (bool, error) {    var result bool    for _, item := range data {        if item == "error" {            result = false            return result, errors.New("found error")        }    }    result = true    return result, nil}


هنا result غير ضروري - يمكنك إرجاع true أو false مباشرة. أيضًا، من الأفضل استخدام fmt.Errorf للتنسيق.



func ProcessData(data []string) (bool, error) {    for _, item := range data {        if item == "error" {            return false, fmt.Errorf("found error in item: %s", item)        }    }    return true, nil}


3. الأداء والذاكرة: ما يجب الانتباه إليه



على الرغم من أن Go سريع بما فيه الكفاية، إلا أن الكود السيئ يمكن أن يفسد كل شيء. في المراجعة، تحقق من:



  • تجنب التخصيصات الزائدة: إذا كنت تعرف حجم الشريحة، استخدم make مع تحديد السعة.
  • نسخ الهياكل: من الأفضل تمرير الهياكل الكبيرة بواسطة المؤشر لتجنب نسخها في كل مرة.
  • الغوروتينات: تحقق مما إذا كنت قد نسيت إغلاق القناة أو انتظار انتهاء الغوروتين (استخدم sync.WaitGroup).


مثال على العمل السيئ مع الشريحة:



func appendItems(items []int) []int {    var result []int    for _, v := range items {                

المدونات

توصيات الكتب