سادة Go: أسلوب الكود واتفاقيات العمل الجماعي

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

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

ابدأ الدورة

لماذا قد يفشل المشروع حتى مع كود عبقري؟

\n\n

تخيل: أنت تكتب بلغة Go. الكود يعمل بسرعة، الاختبارات تمر، والإنتاج يبهج بالاستقرار. ولكن يأتي يوم الاثنين مطور جديد، يفتح وحدتك... ويصاب بالذهول. المتغيرات مسماة x1، data2، tmp. الدوال — func1، process. الاستيرادات مبعثرة بشكل عشوائي. الكود سوف يُترجم، لكن فهمه — مهمة صعبة.

\n\n

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

\n\n

Go — تعني البساطة. لكن البساطة تحتاج إلى اتفاق

\n\n

لغة Go صُممت مع مراعاة العمل الجماعي. ليس من قبيل الصدفة أن روب بايك وكين تومبسون وضعا فيها فكرة "قابلية القراءة قبل كل شيء". ومع ذلك، حتى في Go يمكنك كتابة كود يعمل، لكنه يثير الرغبة في إعادة كتابته من الصفر.

\n\n

دعنا نستعرض الكتل الرئيسية التي تحول الفوضى إلى نظام منظم.

\n\n

1. gofmt — صديقك الأول وحليفك

\n\n

في Go، هناك أداة تنسيق مدمجة — gofmt. هذه ليست مجرد "تجميل". إنها المعيار. إذا كنت لا تستخدم gofmt — فأنت تخالف الاتفاقية. نقطة.

\n\n

مثال: تخيل أن مطورًا يستخدم علامات التبويب للمسافات البادئة، وآخر يستخدم المسافات. في Go، تم حل هذه المشكلة مرة واحدة وإلى الأبد. gofmt يجعل الكود موحدًا. قم بتشغيله قبل كل commit. الأفضل — قم بإعداد pre-commit hook.

\n\n
// سيء (بدون gofmt)\nfunc add(a int,b int) int {\nreturn a+b\n}\n\n// جيد (بعد gofmt)\nfunc add(a, b int) int {\n    return a + b\n}\n
\n\n

نصيحة: في بيئات التطوير الحديثة (VS Code, GoLand)، يتم تشغيل gofmt تلقائيًا عند الحفظ. تحقق من الإعدادات — فهذا سيوفر ساعات من مراجعة الكود.

\n\n

2. التسمية: تحدث بلغة مجال الموضوع

\n\n

Go تشجع الأسماء القصيرة. لكن القصير لا يعني غير ذي معنى. القاعدة بسيطة: كلما زاد نطاق الرؤية، زاد طول الاسم.

\n\n
    \n
  • المتغيرات المحلية (داخل الدالة) — 1-2 حرف: i، j، s، err.
  • \n
  • معاملات الدالة — ذات معنى ولكن مختصرة: ctx، req، db.
  • \n
  • الدوال والأنواع المُصدرة — أسماء كاملة: CreateUser، UserService.
  • \n
\n\n

مثال سيء:

\n
func p(u string, pwd string) bool {\n    return u == "admin" && pwd == "12345"\n}\n
\n\n

مثال جيد:

\n
func IsValidCredentials(username, password string) bool {\n    return username == "admin" && password == "12345"\n}\n
\n\n

لاحظ: IsValidCredentials — ليس مجرد اسم، بل هو توثيق. مطور آخر سيفهم فورًا ما تفعله الدالة دون النظر إلى جسمها.

\n\n

3. الاستيرادات: الترتيب هو مفتاح الهدوء

\n\n

في Go، تنقسم الاستيرادات إلى ثلاث مجموعات:

\n
    \n
  1. المكتبة القياسية (fmt, net/http, os).
  2. \n
  3. الحزم الخارجية (github.com/xxx).
  4. \n
  5. الحزم الداخلية (مشروعك).
  6. \n
\n\n

بين المجموعات — سطر فارغ. هذه قاعدة غير مكتوبة ولكنها صارمة. gofmt لا يتحقق منها، لكن مراجعة الكود — بالتأكيد.

\n\n
import (\n    "fmt"\n    "os"\n\n    "github.com/gorilla/mux"\n    "github.com/lib/pq"\n\n    "yourproject/internal/config"\n    "yourproject/internal/handler"\n)\n
\n\n

لماذا هذا مهم؟ عندما تكون الاستيرادات مبعثرة، تضيع وقتًا في البحث عن الحزمة. الترتيب الموحد يسرع قراءة الكود.

\n\n

4. التعليقات: لا تكتب

المدونات

توصيات الكتب