كود نظيف بلغة Go: المبادئ والأمثلة العملية

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

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

ابدأ الدورة

كود نظيف بلغة Go: المبادئ والأمثلة العملية

\n\n

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

\n\n

لماذا الكود النظيف مهم في Go؟

\n\n

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

\n\n

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

\n\n

التسمية الصحيحة هي أساس الكود النظيف. في Go، من المعتاد استخدام أسماء قصيرة للمتغيرات المحلية وأطول للكيانات العامة.

\n\n

مثال سيء

\n
package main\n\nfunc f(x int, y string) int {\n    z, _ := strconv.Atoi(y)\n    return x + z\n}\n
\n\n

مثال جيد

\n
package main\n\nfunc addPriceToCount(count int, priceStr string) int {\n    price, _ := strconv.Atoi(priceStr)\n    return count + price\n}\n
\n\n

قواعد التسمية في Go:

\n
    \n
  • استخدم camelCase للمتغيرات غير المُصدّرة (الخاصة).
  • \n
  • استخدم PascalCase للدوال والأنواع المُصدّرة (العامة).
  • \n
  • تجنب الأسماء المكونة من حرف واحد، باستثناء الفهارس في الحلقات (i, j).
  • \n
  • لا تُدرج نوع المتغير في اسمه (على سبيل المثال، priceInt سيء، price جيد).
  • \n
\n\n

2. هيكلة الحزم والملفات

\n\n

في Go، يجب أن تحل كل حزمة مشكلة واحدة. قسّم الكود حسب المسؤولية. يبدو الهيكل القياسي للمشروع كما يلي:

\n\n
myproject/\n├── cmd/\n│   └── server/\n│       └── main.go\n├── internal/\n│   ├── handler/\n│   ├── service/\n│   └── repository/\n├── pkg/\n│   └── utils/\n└── go.mod\n
\n\n

المبدأ: تحمي حزمة internal الكود من الاستيراد الخارجي. تحتوي حزمة pkg على أدوات مساعدة قابلة لإعادة الاستخدام. في cmd تُخزَّن نقاط الدخول (ملفات main.go).

\n\n

مثال سيء

\n
// حزمة "utils" تحتوي على كل شيء\npackage utils\n\nfunc Calculate(x, y int) int { ... }\nfunc SendEmail(to string) { ... }\nfunc ParseJSON(data []byte) { ... }\n
\n\n

مثال جيد

\n
// حزمة "calculator" مسؤولة فقط عن العمليات الحسابية\npackage calculator\n\nfunc Add(a, b int) int { return a + b }\n
\n\n

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

\n\n

لا توجد استثناءات في Go - يتم إرجاع الأخطاء كقيم. يتطلب الكود النظيف معالجة واضحة وذات مغزى لكل خطأ.

\n\n

مثال سيء

\n
func readFile(path string) string {\n    data, _ := os.ReadFile(path) // تجاهل الخطأ\n    return string(data)\n}\n
\n\n

مثال جيد

\n
func readFile(path string) (string, error) {\n    data, err := os.ReadFile(path)\n    if err != nil {\n        return "", fmt.Errorf("read file %s: %w", path, err)\n    }\n    return string(data), nil\n}\n
\n\n

نصائح لمعالجة الأخطاء:

\n
    \n
  • لا تتجاهل الأخطاء أبدًا باستخدام _.
  • \n
  • أضف دائمًا سياقًا: fmt.Errorf("operation: %w", err).
  • \n
  • استخدم أنواع أخطاء مخصصة لمواقف مختلفة.
  • \n
  • لا تستخدم panic للأخطاء العادية - استخدمه فقط للحالات الاستثنائية حقًا.
  • \n
\n\n

4. الدوال: الطول والمسؤولية

\n\n

الدالة

المدونات

توصيات الكتب