كثيرة هي القصص التي تتحدث عن الارتباك الذي يصيب المبرمجين في بداية عملهم عندما يفكرون في كتابة أكواد برمجية نظيفة.
في ذلك الوقت، يجدون أنفسهم أمام العديد من الفروق الدقيقة، والتفسيرات المختلفة.
في هذا التقرير سنتحدث سويا عن أفضل الطرق والنصائح والممارسات التي يجب أن تتبعها لكتابة كود برمجة نظيف.
كيف تكتب كود نظيف؟، صورة بالذكاء الاصطناعي من مايكروسوفت copilot، خاصة بالمعرفة للدراسات. |
وسنراعي في هذا التقرير أن هناك دوما نوعا من أنواع ((الذاتية)) فيما يتعلق بكتابة الأكواد النظيفة، فما قد يصلح ويناسب مبرمج أو حتى مشروع معين، قد لا يكون كذلك بالنسبة لآخرين.
دعونا نبدأ ...
ما هو الكود النظيف .. وما هي أهميته؟:
في البداية من المهم أن نوضح ما المقصود بمصطلح (الكود النظيف) .. لماذا هو مهم؟ .. وكيف يمكنك التأكد من أن قاعدة البيانات البرمجية التي كتبتها نظيفة ام لا ؟.
تخيل أنك تقف في وسط غرفة مليئة بالفوضي، حيث الكتب والملابس والأغراض الأخرى متناثرة في كل مكان، بالطبع سيكون العثور على ما تبحث عنه بداخلها صعبا.
إن كتابة تعليمات برمجية غير مرتبة تكون أكثر إرباكا من العثور على شيء تبحث عنه في تلك الغرفة.
على الجانب الآخر، فإن كتابة تعليمات برمجية مرتبة يشبه تماما غرفة مرتبة، يمكنك أن تعثر فيها على ما تريده بسهولة وبسرعة، والأهم أنه يمكنك فهم أن هذه المنضدة عليها الكتب، وأن الخزانة هي التي يوضع بها الملابس، وهكذا.
من كل ما سبق، نستطيع أن نعرف ((الكود النظيف)) بأنه مصطلح يستخدم لوصف الكود الحاسوبي الذي يسهل قراءته وفهمه وصيانته.
وهكذا فالكود النظيف أيضا هو الكود الذي تتم كتابته بطريقة تجعله بسيط وموجز وفعال، ويلبي المعايير والشروط التي تجعل من السهل قراءته ومتابعته.
والأهم من هذا أنه يجب أن يحل المشكلة أو يؤدي المهمة التي من المفترض أننا صنعناه من أجلها.
كذلك من مواصفات الكود النظيف خلوه من التعقيد والتكرار، وهي الأمور التي تجعل من الصعب إصلاحه أو صيانته أو تعديله وتصحيح أي أخطاء قد تظهر به.
هذا ما يجعلنا لا نبالغ عندما نتحدث عن مدى أهمية الكود النظيف سهل القراءة والفهم، ما يسهل على المبرمجين والمطورين العمل على قاعدة الكود، ويؤدى ذلك في النهاية إلى زيادة الإنتاجية مع تقليل الأخطاء.
بالإضافة إلى كل ما سبق، فعندما يكون من السهل صيانة الكود، فإن ذلك يضمن للمبرمج إمكانية تحسين قاعدة البيانات وتحديثها بمرور الوقت.
هذا ما يرفع أهمية (الكود النظيف) بشكل خاص بالنسبة للمشاريع الطويلة الأجل حيث يجب صيانة الكود وتحديثه لسنوات متتالية.
الفارق بين الكود النظيف والكود السريع:
على الضفة الأخرى من النهر، نجد نقيض الكود النظيف وهو الكود السريع وسهل الاستخدام (Quick & Dirty Code).
1. الكود السريع وسهل الاستخدام:
من اسمه، يتضح أن هذا الكود هو الذي يكتبه المبرمج بشكل سريع دون أن يسبق ذلك تنظيم أو تخطيط جيد.
وبالرغم من أن هذا الكود يبدو أسرع في البداية، إلا أنه ومع إضافة المزيد من الأسطر، يصبح من الصعب فهمه وإصلاحه، كما يزيد ذلك من الوقت المطلوب للتعامل معه.
2. الكود النظيف والمدروس:
هذا الكود يكتبه المبرمج بعناية، مما يجعله مفهوما بسهولة، كما يجعل من الممكن فيما بعد أن يقوم بإجراء أي تغييرات مطلوبة عليه.
إن بذل المزيد من الجهد في كتابة كود نظيف أفضل كثيرا من الاختصار ثم مواجهة المزيد من المصاعب فيما بعد، صورة بالذكاء الاصطناعي من مايكروسوفت copilot، خاصة بالمعرفة للدراسات... |
نعم .. قد يستغرق الأمر وقتًا أطول في البداية، ولكن مع مرور الوقت، يظل العمل مع الكود النظيف أمرًا أسهل وأسرع ولن تواجه صعوبات كبيرة في إضافة سطور جديدة وقتما تحتاج ذلك.
ببساطة، قد يبدو كتابة الكود النظيف أبطأ في البداية، لكنه على المدى الطويل فإنه يوفر الكثير من الوقت ويجعل العمل أسهل.. كما أنه يؤدي لإنشاء برامج وتطبيقات ومشاريع ومنتجات أفضل وأكثر موثوقية.
وتذكر دوما أن كتابة كود نظيف هو عادة ينميها المبرمجين والمطورين المحترفين، وهو دليل على تفانيهم في جودة العمل الذي يقدمونه، وأخلاقيات العمل الرفيعة لديهم.
ويمكنكم في هذا الصدد الإطلاع على تقريرنا: ((كيف تصبح مبرمج محترف؟)).
كيف يمكنك معرفة ما إذا كان الكود نظيف ام لا؟:
يمكنك تقييم قاعدة التعليمات البرمجية لمعرفة ما إذا كانت نظيفة ام لا بالعديد من الطرق.
فعندما يكون الكود موثق بشكل جيد، وذو تنسيق متسق، وتكون قاعدة التعليمات البرمجية هي أيضا منظمة بشكل جيد، فكل هذه مؤشرات للمبرمج بأنه قد أنتج كود نظيف.
أيضا يمكنك من خلال إجراء مراجعات على الكود تحديد أي مشكلات محتملة، والتأكد من أنه يتبع أفضل الممارسات والشروط ((يمكنك استخدام الذكاء الاصطناعي في تصليح الأخطاء البرمجية.. للمزيد اطلع على تقريرنا: كيف يمكن لبرنامج ChatGPT مساعدتك في تعلم المزيد من لغات البرمجة؟)).
في نفس الوقت فإن اختبارات أداء الكود تمثل جانبا مهما في التأكد من أن الكود نظيف، وتضمن عمله كما هو متوقع منه، وتكشف الأخطاء في وقت مبكر.
ومن أهم الاختبارات في هذا الصدد هل يعمل البرنامج بأقل قدر ممكن من موارد الجهاز الذي يشغله؟ .. ما هي مساحته؟ وما هو الوقت الذي يستغرقه للعمل؟ .. وكلما كانت الإجابة أقل كلما كان ذلك أفضل.
كذلك من المهم التأكد من هل تم وضع الكود بشكل صحيح ومسافة التباعد فيه بنفس التنسيق على طول قاعدته؟.
قواعد كتابة كود برمجة نظيف:
أيضا من المهم أن تلتزم بالقواعد والشروط التالية لكتابة أكواد برمجية نظيفة:
استخدم أسماء ذات معاني:
عندما تقوم بإعطاء مسميات للمتغيرات والوظائف والفئات داخل الكود، حينها أحرص على اختيار الأسماء التي تصف غرضها بوضوح.
على سبيل المثال:
- بدلا من المتغير b، جرب استخدام (numberOfUsers) أو userAge أو totalAmount.
- في الوظائف Functions مثلا نستخدم كلمات مثل calculateTotal أو fetchUserData.
- وهكذا الأمر في الفئات Classes استخدم الأسماء المفردة مثل User أو Order.
بهذه الطريقة، يمكن لأي شخص يقرأ الكود أن يفهم الغرض الخاص به دون أن يحتاج إلي أي تعليقات إضافية.
توفر الأسماء ذات المعاني الواضحة إزالة أي ارتباك، وتنهي أي تخمين.
استخدم مبدأ المسؤولية الفردية Single Responsibility Principle (SRP):
يعني مبدأ المسؤولية الفردية (SRP) في البرمجة أن كل جزء من أجزاء الكود يكون له مهمة محددة.
هذا يؤدي إلى إبقاء الوظائف في الكود قصيرة ومركزة، وبالتالي يجعلها أسهل من حيث إمكانية القراءة والاختبار والصيانة.
على سبيل المثال، إذا كان لديك دالة تسمي (calculateTotal) فيجب أن تتعامل فقط مع حساب الإجمالي، لأنك إذا قمت بإضافة مهام أخرى لها، فقد يؤدي ذلك إلى ظهور كود مربك يصعب صيانته.
وفيما يلي سنضع لكم مثال توضيحي لإظهار سبب أهمية الحفاظ على المسؤولية الفردية لكل وظيفة:
لنفترض أنك تريد القيام بحساب إجمالي، وإرجاع الكائن أو Object بمعلومات إضافية مثل من قام بالحساب ومتي حدث ذلك؟.
للقيام بذلك، وبدلا من إضافة هذه القيم بشكل مباشر إلي calculateTotal، فإنه يمكننا استخدام دالة ثانية.
ركز على كفاءة الكود:
من المهم أن يتميز الكود النظيف بالكفاءة، ولتوضيح ذلك سنضرب مثالين هذا أولهما:
// Inefficient Example
function sumArrayInefficient(array) {
let sum = 0;
for (let i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}
هذا الكود خاص بدالة sumArrayInefficient يتكرر كما نري على المصفوفة باستخدام الحلقة for، ويضيف كل عنصر إلي متغير المجموع.
وبالرغم من أن هذا الكود صحيح ولا يمكن القول بغير ذلك، ولكنه لا يلبي معيار أن يكون (الكود فعالا) لأنه يحتاج إلى التكرار على طول المصفوفة وهو ما قد يجعلها طويلة للغاية.
ولننظر هنا إلى المثال الثاني:
// Efficient example
function sumArrayEfficient(array) {
return array.reduce((a, b) => a + b, 0);
}
نلاحظ هنا استخدام لوظيفة sumArrayEfficient طريقة الاختزال لجمع عناصر المصفوفة، حيث تطبق طريقة الاختزال دالة على كل عنصر من عناصر المصفوفة وتجمع النتيجة.
في هذا المثال أيضا، نلاحظ أن الوظيفة تقوم ببساطة بإضافة كل عنصر إلي المجمع والذي يبدأ من 0.
هذا الحل أكثر كفاءة لأنه لأنه يتطلب إلا تكرارًا واحدًا فقط على المصفوفة.