Clean Code على Go: مبادئ كتابة الكود النظيف عمليًا

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

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

ابدأ الدورة

Clean Code على Go: المبادئ والأمثلة عمليًا



الكود النظيف (Clean Code) ليس مجرد موضة، بل ضرورة لأي مطور محترف. في عالم Go، حيث البساطة وقابلية القراءة جزء من فلسفة اللغة، فإن اتباع مبادئ الكود النظيف مهم بشكل خاص. في هذه المقالة، سنشرح المبادئ الأساسية لـ Clean Code على Go مع أمثلة عملية ستساعدك على كتابة كود يسهل قراءته وصيانته وتوسيعه.



1. تسمية المتغيرات والدوال



في Go، يجب أن تكون الأسماء قصيرة ولكنها غنية بالمعلومات. كلما كان نطاق المتغير أصغر، كلما كان اسمه أقصر. هذا أحد المبادئ الأساسية لـ Clean Code على Go.



مثال سيء:

func f(a int, b int) int {    var x int = a + b    return x}


مثال جيد:

func Sum(a, b int) int {    result := a + b    return result}


لاحظ: الدالة تسمى Sum وليس f. المتغير result يوضح الغرض منه فورًا. في Go، من المعتاد استخدام camelCase للمتغيرات المحلية و PascalCase للكيانات المُصدرة (العامة).



2. الدوال الصغيرة والمسؤولية الواحدة



يجب أن تقوم كل دالة في Go بشيء واحد فقط. هذا هو مبدأ المسؤولية الواحدة (Single Responsibility Principle). إذا كانت الدالة تؤدي مهام متعددة، قم بتقسيمها إلى دوال أصغر.



مثال سيء — الدالة تفعل الكثير:

func ProcessUserData(user User) error {    // التحقق    if user.Name == "" {        return errors.New("empty name")    }    // الحفظ في قاعدة البيانات    err := db.Save(user)    if err != nil {        return err    }    // إرسال البريد الإلكتروني    err = email.SendWelcome(user.Email)    if err != nil {        return err    }    return nil}


مثال جيد — فصل المسؤوليات:

func ValidateUser(user User) error {    if user.Name == "" {        return errors.New("empty name")    }    return nil}

func SaveUser(user User) error { return db.Save(user)}

func SendWelcomeEmail(email string) error { return email.SendWelcome(email)}

func ProcessUserData(user User) error { if err := ValidateUser(user); err != nil { return err } if err := SaveUser(user); err != nil { return err } return SendWelcomeEmail(user.Email)}


مثل هذا الكود يسهل اختباره وتصحيح أخطائه وتعديله. كل دالة لها غرض واضح.



3. معالجة الأخطاء في Go



في Go، الأخطاء هي قيم. أحد المبادئ الرئيسية لـ Clean Code على Go هو التحقق دائمًا من الأخطاء وعدم تجاهلها. استخدم نمط "early return" لتقليل التداخل.



مثال سيء — تجاهل الخطأ:

data, _ := ioutil.ReadFile("config.json")// نستخدم data دون التحقق من الخطأ


مثال جيد:

data, err := os.ReadFile("config.json")if err != nil {    return fmt.Errorf("failed to read config: %w", err)}// نعمل مع data


استخدم fmt.Errorf مع العلامة %w لتغليف الأخطاء. هذا يسمح بالحفاظ على سلسلة الاستدعاءات ويسهل التصحيح.



4. تجنب التداخل العميق



التداخل العميق يجعل الكود غير قابل للقراءة. في Go، من المعتاد استخدام guard clauses (الشروط الوقائية) والإرجاع المبكر.



مثال سيء:

func GetUserRole(userID int) (string, error) {    if userID > 0 {        user, err := db.FindUser(userID)        if err == nil {            if user.IsActive {                return user.Role, nil            } else {                return "", errors.New("user is inactive")            }        } else {            return "", err        }                

المدونات

توصيات الكتب