تعد معالجة الأخطاء جانبًا مهمًا لكتابة برامج قوية وموثوقة. ومع ذلك، فإن عدم القيام بذلك بعناية يمكن أن يؤدي إلى تعليمات برمجية مزدحمة يصعب قراءتها وصيانتها.
يتعمق الفصل السابع من Clean Code في تقنيات التعامل مع الأخطاء التي لا تسبب فوضى في التعليمات البرمجية الخاصة بك، مع التركيز على الوضوح والبساطة.
في هذه المقالة، سنستكشف المفاهيم الأساسية من هذا الفصل وكيفية تطبيقها في JavaScript للحفاظ على قاعدة التعليمات البرمجية الخاصة بك نظيفة وقابلة للصيانة.
أحد المبادئ الأساسية في Clean Code هو تفضيل الاستثناءات على رموز الخطأ.
تسمح لك الاستثناءات بفصل منطق معالجة الأخطاء عن منطقك الرئيسي، مما يجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة.
مثال: تجنب رموز الخطأ
function getUser(id) { const user = database.findUserById(id); if (user === null) { return -1; // Error code for user not found } return user; } const result = getUser(123); if (result === -1) { console.error('User not found'); } else { console.log(result); }
في هذا المثال، تتشابك معالجة الأخطاء مع المنطق الرئيسي، مما يجعل من الصعب متابعتها.
مثال: استخدام الاستثناءات
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error('User not found'); } return user; } try { const user = getUser(123); console.log(user); } catch (error) { console.error(error.message); }
باستخدام الاستثناءات، نقوم بفصل منطق معالجة الأخطاء عن المنطق الرئيسي، مما يجعل التعليمات البرمجية أكثر وضوحًا وأسهل للفهم.
عند طرح الاستثناءات، من المهم تقديم رسائل خطأ ذات معنى توفر سياقًا حول الخطأ.
يساعد هذا في تشخيص المشكلات بسرعة دون الحاجة إلى البحث في الكود.
مثال: توفير السياق في رسائل الخطأ
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error(`User with ID ${id} not found`); } return user; } try { const user = getUser(123); console.log(user); } catch (error) { console.error(error.message); // Outputs: User with ID 123 not found }
توفر رسالة الخطأ الوصفية السياق اللازم لفهم المشكلة على الفور.
يمكن أن يؤدي إرجاع قيمة فارغة إلى أخطاء مرجعية فارغة يصعب تتبعها.
بدلاً من إرجاع قيمة فارغة، فكر في طرح استثناء أو استخدام نمط حالة خاص يوفر سلوكًا افتراضيًا.
مثال: تجنب إرجاع القيمة الخالية
function getUser(id) { const user = database.findUserById(id); if (user === null) { return null; // This can lead to null reference errors } return user; } const user = getUser(123); if (user !== null) { console.log(user.name); }
يتطلب إرجاع القيمة الفارغة عمليات فحص إضافية ويمكن أن يؤدي إلى حدوث فوضى في التعليمات البرمجية الخاصة بك.
مثال: طرح استثناء أو استخدام حالة خاصة
function getUser(id) { const user = database.findUserById(id); if (user === null) { throw new Error(`User with ID ${id} not found`); } return user; } // OR class NullUser { get name() { return 'Guest'; } } function getUser(id) { const user = database.findUserById(id); return user || new NullUser(); }
يساعد طرح استثناء أو استخدام كائن حالة خاصة (مثل NullUser) على تجنب الأخطاء المرجعية الفارغة ويحافظ على نظافة التعليمات البرمجية الخاصة بك.
على الرغم من أن كتل محاولة الالتقاط أخيرًا ضرورية للتعامل مع الاستثناءات، إلا أن الإفراط في استخدامها يمكن أن يؤدي إلى فوضى في التعليمات البرمجية الخاصة بك.
استخدمها فقط عند الضرورة وتجنب الكتل المتداخلة بشدة.
مثال: تجنب الإفراط في المحاولات
try { const data = JSON.parse(input); try { const user = getUser(data.id); try { sendEmail(user.email); } catch (error) { console.error('Failed to send email:', error.message); } } catch (error) { console.error('User retrieval failed:', error.message); } } catch (error) { console.error('Invalid JSON:', error.message); }
من الصعب متابعة هذا الرمز نظرًا لوجود العديد من كتل محاولة الالتقاط المتداخلة.
مثال: إعادة البناء لتقليل الفوضى
function parseInput(input) { try { return JSON.parse(input); } catch (error) { throw new Error('Invalid JSON'); } } function retrieveUser(data) { return getUser(data.id); } function notifyUser(user) { sendEmail(user.email); } try { const data = parseInput(input); const user = retrieveUser(data); notifyUser(user); } catch (error) { console.error(error.message); }
من خلال تقسيم المنطق إلى وظائف منفصلة، نقوم بتقليل التداخل وتحسين إمكانية القراءة.
إذا وجدت استثناءً، فتأكد من التعامل معه بشكل صحيح.
قد يؤدي تجاهل الاستثناءات بصمت إلى سلوك غير متوقع ويجعل تصحيح الأخطاء أمرًا صعبًا.
مثال: لا تتجاهل الاستثناءات
try { const user = getUser(123); } catch (error) { // Ignoring the exception }
يمكن أن يؤدي تجاهل الاستثناءات إلى إخفاء المشكلات المحتملة في التعليمات البرمجية الخاصة بك.
مثال: التعامل مع الاستثناء أو تسجيله
try { const user = getUser(123); } catch (error) { console.error('An error occurred:', error.message); }
يضمن التعامل مع الاستثناء أو تسجيله أنك على علم بأي مشكلات ويمكنك معالجتها وفقًا لذلك.
تعد المعالجة الفعالة للأخطاء أمرًا ضروريًا لكتابة تعليمات برمجية JavaScript نظيفة وقابلة للصيانة.
من خلال اتباع المبادئ من Clean Code - مثل استخدام الاستثناءات بدلاً من رموز الخطأ، وتوفير السياق في رسائل الخطأ، وتجنب الإرجاعات الخالية، واستخدام حاول الالتقاط بشكل مقتصد، وعدم تجاهل الاستثناءات التي تم اكتشافها - يمكنك التأكد من أن منطق معالجة الأخطاء الخاص بك قوي وغير مزعج.
برمجة سعيدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3