النقاط الرئيسية
1. اكتب كودًا نظيفًا قابلًا للقراءة والصيانة
القياس الوحيد الصحيح لجودة الكود: WTFs/دقيقة
الوضوح هو الأهم. يجب أن يكون الكود النظيف سهل الفهم من قبل المطورين الآخرين. يجب أن يكون بسيطًا وأنيقًا وخاليًا من الفوضى. اسعَ لكتابة كود يعبر بوضوح عن هدفه دون الحاجة إلى تعليقات مطولة. استخدم أسماء متغيرات ودوال ذات معنى، واحتفظ بالدوال صغيرة ومركزة، ونظم الكود بشكل منطقي.
قابلية الصيانة تمكّن التطور. الكود الذي يصعب تغييره يصبح عبئًا. صمم كودك ليكون مرنًا ووحدويًا حتى يتكيف مع المتطلبات المتغيرة. اتبع مبادئ مثل DRY (لا تكرر نفسك) وSOLID لإنشاء أنظمة مترابطة بشكل ضعيف وعالية التماسك. قم بإعادة هيكلة الكود بلا رحمة لتحسين هيكله دون تغيير سلوكه.
الكود النظيف يعود بالنفع. على الرغم من أن كتابة كود نظيف تتطلب جهدًا أكبر في البداية، إلا أنها توفر وقتًا كبيرًا وآلامًا في المستقبل. الكود النظيف أسهل في التصحيح والتوسيع والصيانة. يمكّن المطورين من العمل بكفاءة أكبر ويقلل من خطر إدخال أخطاء أثناء التغييرات. اجعل الكود النظيف جزءًا أساسيًا من ممارستك في التطوير.
2. اتبع تقاليد التسمية ذات المعنى
يجب أن يجيب اسم المتغير أو الدالة أو الفئة على جميع الأسئلة الكبيرة. يجب أن يخبرك لماذا يوجد، وماذا يفعل، وكيف يتم استخدامه.
استخدم أسماء تكشف عن النية. اختر أسماء تعبر بوضوح عن الغرض وسلوك المتغيرات والدوال والفئات. تجنب الأسماء ذات الحرف الواحد أو الاختصارات الغامضة. استخدم أسماء يمكن نطقها بسهولة ويمكن البحث عنها. على سبيل المثال:
- سيئ: d (الوقت المنقضي بالأيام)
- جيد: elapsedTimeInDays
كن متسقًا ودقيقًا. استخدم تقاليد تسمية متسقة في جميع أنحاء قاعدة الكود الخاصة بك. كن دقيقًا لتجنب الغموض - على سبيل المثال، استخدم تمييزات ذات معنى مثل getActiveAccounts() وgetActiveAccountInfo(). تجنب الترميزات أو البادئات التي تضيف ضوضاء دون قيمة. يجب أن تكون أسماء الفئات أسماءً، وأسماء الدوال أفعالًا.
يجب أن يتناسب طول الاسم مع النطاق. استخدم أسماء أطول وأكثر وصفية للمتغيرات والدوال ذات النطاقات الأكبر. الأسماء القصيرة مقبولة للنطاقات الصغيرة والمحلية. يجب أن يكون طول الاسم متناسبًا مع نطاق استخدامه. قم بتحسين الوضوح والفهم في السياق الذي يتم فيه استخدام الاسم.
3. احتفظ بالدوال صغيرة ومركزة
يجب أن تقوم الدوال بشيء واحد. يجب أن تقوم به بشكل جيد. يجب أن تقوم به فقط.
الصغر هو الجمال. يجب أن تكون الدوال صغيرة - عادةً ما تتراوح بين 5-10 أسطر. يجب أن تتناسب مع شاشة واحدة وأن تكون مفهومة على الفور. استخرج الكود إلى دوال مساعدة ذات أسماء جيدة بدلاً من كتابة دوال طويلة ومعقدة. الدوال الصغيرة أسهل في الفهم والاختبار والصيانة.
قم بشيء واحد بشكل جيد. يجب أن يكون لكل دالة غرض واحد وواضح. إذا كانت الدالة تقوم بعدة أشياء، استخرج تلك الأشياء إلى دوال منفصلة. علامات أن الدالة تقوم بالكثير تشمل:
- مستويات متعددة من التجريد
- أقسام أو كتل كود متعددة
- عدد كبير من المعلمات
احتفظ بمستوى واحد من التجريد. يجب أن تكون العبارات داخل الدالة جميعها على نفس مستوى التجريد. لا تخلط بين المنطق عالي المستوى والتفاصيل منخفضة المستوى. استخرج العمليات منخفضة المستوى إلى دوال منفصلة. هذا يحسن الوضوح من خلال الحفاظ على تركيز الدوال وبساطتها المفاهيمية.
4. مارس التنسيق والتنظيم الصحيحين
تنسيق الكود يتعلق بالتواصل، والتواصل هو الأمر الأول الذي يجب على المطور المحترف الاهتمام به.
التنسيق المتسق مهم. استخدم تباعدًا متسقًا، وفواصل أسطر، ومسافات في جميع أنحاء كودك. هذا يحسن الوضوح ويقلل من الحمل المعرفي. اتفق على معايير التنسيق مع فريقك واستخدم أدوات آلية لفرضها. تشمل إرشادات التنسيق الرئيسية:
- التباعد الصحيح
- وضع الأقواس بشكل متسق
- فواصل أسطر منطقية
- فراغ مناسب
نظم الكود بشكل منطقي. اجمع الكود ذي الصلة معًا وافصل الكود غير ذي الصلة. استخدم أسطر فارغة لإنشاء فواصل "فقرة" بين الأقسام المنطقية. ضع الدوال ذات الصلة بالقرب من بعضها. احتفظ بالملفات مركزة على مفهوم أو مكون واحد. قسم الملفات الكبيرة إلى ملفات أصغر وأكثر تركيزًا عند الاقتضاء.
اتبع التقاليد القياسية. التزم بالتقاليد القياسية للغتك ومجتمعك. هذا يجعل كودك أكثر ألفة وسهولة في الوصول إلى المطورين الآخرين. على سبيل المثال، في Java:
- تستخدم أسماء الفئات PascalCase
- تستخدم أسماء الدوال camelCase
- تستخدم الثوابت ALL_CAPS
5. إدارة التبعيات وتجنب التكرار
قد يكون التكرار هو جذر كل الشرور في البرمجيات.
القضاء على التكرار. الكود المكرر هو فرصة ضائعة للتجريد. عندما ترى تكرارًا، استخرج الكود المشترك إلى دالة أو فئة قابلة لإعادة الاستخدام. هذا يحسن قابلية الصيانة من خلال مركزية المنطق وتقليل خطر التغييرات غير المتسقة. أنواع التكرار التي يجب الانتباه لها:
- كتل كود متطابقة
- خوارزميات مشابهة مع اختلافات طفيفة
- سلاسل switch/case أو if/else مكررة
إدارة التبعيات بعناية. قلل من التبعيات بين الوحدات لتقليل الترابط. استخدم حقن التبعية وعكس التحكم لجعل الكود أكثر وحدوية وقابلية للاختبار. اتبع مبدأ عكس التبعية - اعتمد على التجريدات، وليس على التحديدات. هذا يجعل كودك أكثر مرونة وأسهل في التغيير.
استخدم مبدأ أقل معرفة. يجب ألا تعرف الوحدة عن تفاصيل الكائنات التي تتعامل معها. هذا يقلل من الترابط بين الوحدات. على سبيل المثال، استخدم قانون ديميتير - يجب أن تستدعي الدالة فقط الدوال على:
- كائنها الخاص
- الكائنات الممررة كمعلمات
- الكائنات التي تنشئها
- كائناتها المكونة المباشرة
6. تعامل مع الأخطاء برشاقة
معالجة الأخطاء مهمة، ولكن إذا كانت تعيق المنطق، فهي خاطئة.
استخدم الاستثناءات بدلاً من رموز الخطأ. الاستثناءات أنظف ولا تعيق المنطق الرئيسي لكودك. تسمح بفصل معالجة الأخطاء عن المسار السعيد. عند استخدام الاستثناءات:
- أنشئ رسائل خطأ مفيدة
- قدم سياقًا مع الاستثناءات
- عرّف فئات الاستثناءات بناءً على احتياجات المستدعي
لا ترجع null. إرجاع null يؤدي إلى استثناءات المؤشر null ويعكر صفو الكود بفحوصات null. بدلاً من ذلك:
- ارجع مجموعات فارغة بدلاً من null للقوائم
- استخدم نمط الكائن null
- استخدم Optional في Java أو Maybe في اللغات الوظيفية
اكتب جمل try-catch-finally أولاً. ابدأ بـ try-catch-finally عند كتابة كود قد يرمي استثناءات. هذا يساعد في تحديد النطاق والتوقعات للكود المستدعي. يضمن إدارة الموارد بشكل صحيح وإطلاقها، حتى في سيناريوهات الأخطاء.
7. اكتب اختبارات وحدات شاملة
كود الاختبار مهم تمامًا مثل كود الإنتاج.
اتبع القوانين الثلاثة لتطوير البرمجيات المدفوعة بالاختبار (TDD). تحسين تطوير البرمجيات المدفوعة بالاختبار (TDD) لجودة الكود والتصميم:
- اكتب اختبارًا فاشلاً قبل كتابة أي كود إنتاج
- اكتب فقط ما يكفي من الاختبار لإظهار الفشل
- اكتب فقط ما يكفي من كود الإنتاج لتمرير الاختبار
احتفظ بالاختبارات نظيفة وقابلة للصيانة. طبق نفس معايير جودة الكود على اختباراتك كما هو الحال مع كود الإنتاج. قم بإعادة هيكلة وتحسين كود الاختبار بانتظام. الاختبارات المنظمة جيدًا تعمل كوثائق وتمكن من إعادة هيكلة كود الإنتاج بلا خوف.
استهدف تغطية اختبار شاملة. اكتب اختبارات تغطي الحالات الحدية، وظروف الحدود، وسيناريوهات الأخطاء - وليس فقط المسار السعيد. استخدم أدوات تغطية الكود لتحديد الفجوات في تغطية الاختبار. تذكر أن 100% تغطية لا تضمن كودًا خاليًا من الأخطاء، لكنها توفر الثقة في إعادة الهيكلة والتغييرات.
8. قم بإعادة هيكلة الكود باستمرار
اترك المخيم أنظف مما وجدته.
قم بإعادة الهيكلة عند الفرصة. حسن هيكل الكود كلما عملت على جزء من الكود. اتبع قاعدة الكشافة: اترك الكود أفضل مما وجدته. التحسينات الصغيرة والتدريجية تتراكم مع مرور الوقت وتمنع تدهور الكود. تشمل تقنيات إعادة الهيكلة الشائعة:
- استخراج الدوال أو الفئات
- إعادة التسمية من أجل الوضوح
- تبسيط الشروط المعقدة
- إزالة التكرار
قم بإعادة الهيكلة بأمان مع الاختبارات. تأكد دائمًا من وجود مجموعة قوية من الاختبارات قبل إعادة الهيكلة. قم بإجراء تغييرات صغيرة وتدريجية وجرّب الاختبارات بشكل متكرر. هذا يمنحك الثقة بأن تغييراتك لا تكسر الوظائف الحالية. استخدم أدوات إعادة الهيكلة الآلية عند توفرها لتقليل خطر إدخال أخطاء.
وازن بين إعادة الهيكلة وتقديم القيمة. على الرغم من أن إعادة الهيكلة المستمرة مهمة، لا تدعها تشل التقدم. استهدف "الجيد بما فيه الكفاية" بدلاً من الكمال. ركز جهود إعادة الهيكلة على أكثر المناطق إشكالية أو التي تتغير بشكل متكرر في الكود. تواصل مع أصحاب المصلحة حول قيمة إعادة الهيكلة لضمان الدعم لتحسين الكود المستمر.
9. طبق مبادئ البرمجة الكائنية والوظيفية
تخفي الكائنات بياناتها خلف التجريدات وتعرض دوالًا تعمل على تلك البيانات. تكشف الهياكل البيانية عن بياناتها وليس لديها دوال ذات معنى.
استخدم مبادئ البرمجة الكائنية بحكمة. طبق مبادئ مثل التغليف، والوراثة، والتعددية الشكلية لإنشاء تصاميم مرنة ووحدوية. اتبع مبادئ SOLID:
- مبدأ المسؤولية الواحدة
- مبدأ الفتح والإغلاق
- مبدأ استبدال ليسكوف
- مبدأ تقسيم الواجهات
- مبدأ عكس التبعية
استفد من مفاهيم البرمجة الوظيفية. حتى في اللغات الكائنية، يمكن أن تؤدي تقنيات البرمجة الوظيفية إلى كود أنظف:
- دوال نقية بدون آثار جانبية
- بيانات غير قابلة للتغيير
- دوال من الدرجة العليا
- تركيب الدوال
اختر النهج الصحيح للمشكلة. لكل من البرمجة الكائنية والوظيفية نقاط قوة وضعف. استخدم التصميم الكائني عندما تحتاج إلى نمذجة مجالات معقدة بسلوك. استخدم النهج الوظيفي لتحويل البيانات ومعالجة الأنابيب. تدعم العديد من اللغات الحديثة نهجًا هجينًا، مما يسمح لك باستخدام أفضل أداة لكل جزء من نظامك.
10. اعتبر التزامن بعناية
التزامن هو استراتيجية فصل. يساعدنا على فصل ما يتم إنجازه عن متى يتم إنجازه.
افهم تحديات التزامن. يقدم البرمجة المتزامنة تعقيدًا وإمكانية حدوث أخطاء دقيقة. تشمل القضايا الشائعة:
- حالات السباق
- الإغلاق
- الإشارات المفقودة
- مشاكل رؤية الذاكرة
افصل مخاوف التزامن. احتفظ بكودك المتعلق بالتزامن منفصلًا عن الكود الآخر. هذا يجعل من الأسهل التفكير فيه واختباره. استخدم التجريدات مثل Executors وFutures وActors لإدارة التزامن بدلاً من العمل مع خيوط خام.
فضل عدم القابلية للتغيير والدوال النقية. الكائنات غير القابلة للتغيير والدوال النقية آمنة بطبيعتها للخيوط. إنها تقضي على العديد من مشكلات التزامن من خلال تجنب الحالة القابلة للتغيير المشتركة. عندما تكون الحالة القابلة للتغيير ضرورية، استخدم تقنيات التزامن المناسبة واعتبر استخدام المتغيرات الذرية أو المجموعات المتزامنة.
آخر تحديث::
مراجعات
كتاب "الكود النظيف" يتلقى في الغالب تقييمات إيجابية لمبادئه حول كتابة كود قابل للقراءة والصيانة. يقدّر القراء النصائح العملية المتعلقة بالتسمية، والدوال، والاختبار. ومع ذلك، فإن تركيز الكتاب على لغة الجافا وبعض الإرشادات الصارمة تعتبر من الانتقادات الشائعة. يعتبره الكثيرون قراءة أساسية للمطورين، على الرغم من أن بعضهم يجدونه أقل فائدة للمبرمجين ذوي الخبرة. تُشاد دراسات الحالة وأمثلة إعادة الهيكلة من قبل البعض، بينما ينتقدها آخرون باعتبارها مبالغ فيها. بشكل عام، يتفق المراجعون على أن الكتاب يقدم رؤى قيمة حول جودة الكود، حتى وإن لم تكن جميع الاقتراحات قابلة للتطبيق بشكل عالمي.