ما الأخطاء التي يجب تجنبها أثناء البرمجة بلغة جافا؟ في المقالة التالية نجيب على هذا السؤال.
جافا هي لغة مشهورة ذات مكانة راسخة في عالم تطوير البرمجيات. وهي لغة برمجة قوية ومتعددة الاستخدامات. يعمل حوالي 3 مليار جهاز حول العالم على جافا وبالتالي، تم ارتكاب 3 مليارات خطأ على الأقل عند استخدامه. في هذه المقالة، دعنا نركز على كيفية عدم ارتكاب المزيد.
1. الحصول على استثناء التعديل المتزامن
هذا هو الخطأ الأكثر شيوعًا الذي صادفته إلى حد بعيد. في الأيام الأولى من حياتي المهنية، ارتكبته عدة مرات أيضًا. يحدث هذا الخطأ عندما تحاول تعديل المجموعة أثناء تكرارها. إن استثناء التعديل المتزامن قد تثار أيضًا عند العمل مع عدة خيوط ولكن الآن، دعنا نركز على السيناريو الأساسي.
افترض أن لديك المجموعة من المستخدمين حيث يكون بعضهم بالغين والبعض الآخر غير بالغين. مهمتك هي تصفية الأطفال.
ل (المستخدم : المستخدمون) {
إذا (!user.isAdult ())) {
users.remove(user);
}
}
تشغيل ما سبق ذكره الكود ينتهي بالحصول على استثناء التعديل المتزامن. أين أخطأنا؟ قبل الانتهاء من التكرار، حاولنا إزالة بعض العناصر. وهذا ما أدى إلى حدوث الاستثناء.
كيف يمكنني تجنب ذلك؟
هناك طريقتان يمكن أن تساعدا في هذه الحالة. أولاً وقبل كل شيء، الاستفادة من جافا الخير 8's الخير 8 - الدفق.
قائمة البالغين = user.stream()
.filter(User::isAdult)
.toList();
باستخدام المسند مرشح، لقد قمنا بعكس الشرط السابق - الآن نحدد العناصر المراد تضمينها. ميزة هذه الطريقة هي أنه من السهل تسلسل الدوال الأخرى بعد الإزالة، على سبيل المثال الخريطة. لكن بحق السماء، من فضلك لا تحاول فعل شيء مثل ما يلي:
كما يمكن أن ينتهي به المطاف في استثناء التعديل المتزامن لأنك تقوم بتعديل مصدر الدفق. كما يمكن أن يمنحك المزيد من الاستثناءات التي لن يكون من السهل تصحيحها.
لحل استثناء التعديل المتزامن في سيناريو الخيط الواحد، يمكنك أيضًا التبديل إلى استخدام مكرر و إزالة() أو يمكنك ببساطة عدم إزالة العناصر أثناء التكرار. ومع ذلك، توصيتي هي استخدام الجداول - إنه عام 2022
2. تخزين كلمات المرور كسلاسل
مع زيادة انخراطي في مجال الأمن السيبراني، لن أكون صادقاً مع نفسي إذا لم أذكر على الأقل خطأ جافا التي يمكن أن تؤدي إلى مشكلة أمنية. تخزين كلمات المرور المستلمة من المستخدمين في الخيط الكائن هو بالضبط ما يجب أن تخاف منه.
مشكلة (أو ربما ميزة) الخيط هو أنه غير قابل للتغيير. في عالم الاختراق الإلكتروني، فإنه يخلق تهديدًا محتملاً لأنه لا يمكنك مسح قيمة إنشاء مرة واحدة الخيط كائن. يمكن للمهاجم الذي يتمكن من الوصول إلى ذاكرة الكمبيوتر الخاص بك العثور على كلمات مرور بنص عادي هناك.
ثانيًا، الأوتار في جافا داخليًا بواسطة JVM ويتم تخزينها في مساحة PermGen أو في مساحة الكومة. عندما تقوم بإنشاء الخيط فيتم تخزينه مؤقتًا، ولا تتم إزالته إلا عندما يبدأ مُجمِّع القمامة في القيام بعمله. لا يمكنك أن تكون متأكدًا من موعد حذف كلمة المرور من مخزن السلسلة نظرًا لأن جامع القمامة يعمل بطريقة غير حتمية.
كيف تتجنب ذلك؟
النهج الموصى به هو استخدام شار[] أو حتى أفضل من ذلك، المكتبة التي تدعم تخزين كلمات المرور على أنها شار[]على سبيل المثالكلمة السر4ج. إن شار[] المصفوفة قابلة للتغيير ويمكن تعديلها بعد تهيئتها. بعد معالجة كلمة مرور، يمكنك فقط محو شار[] مصفوفة كلمات المرور عن طريق كتابة أحرف عشوائية فيها. في حال تمكّن المهاجمون من الوصول إلى ذاكرة حاسوبك، سيرون فقط بعض القيم العشوائية التي لا علاقة لها بكلمات مرور المستخدمين.
3 - (عدم) التعامل مع الاستثناءات
المبتدئين وكذلك المبرمجين الأكثر تقدمًا لا يعرفون كيفية التعامل مع الاستثناءات بشكل صحيح. خطيئتهم الرئيسية في هذه المسألة هي مجرد تجاهلها. إنه ليس نهجًا جيدًا أبدًا.
لسوء الحظ، لا يمكننا أن نقدم لك حلاً سحريًا يناسب كل الاستثناءالسيناريوهات التي تصادفها. عليك التفكير في كل حالة على حدة. ومع ذلك، يمكننا أن نقدم لك بعض النصائح حول كيفية البدء في هذا الموضوع.
كيف يمكنني تجنب ذلك؟
التجاهل الاستثناءليست ممارسة جيدة أبدًا. الاستثناءلسبب ما، لذا يجب ألا تتجاهلها.
محاولة {...} التقاط (استثناء e) { سجل (e)؛ } نادرًا ما يكون النهج الصحيح ل الاستثناء التعامل
إعادة الرمي الاستثناءإظهار مربع حوار خطأ للمستخدم أو على الأقل إضافة رسالة شاملة إلى السجل.
إذا تركت استثناءاتك دون معالجة (وهو ما لا ينبغي عليك فعله)، على الأقل اشرح نفسك في التعليق.
4. استخدام لاغية
لسوء الحظ، من الشائع جدًا العثور على دالة جافا التي تُرجع في بعض الحالات لا شيء. تكمن المشكلة في أن مثل هذه الدالة تفرض على عميلها إجراء فحص فارغ للنتيجة. وبدون ذلك، فإن NullPointerException يتم رميها.
الأمر الآخر هو تمرير لا شيء القيمة. لماذا فكرت في ذلك؟ في مثل هذه الحالة، يجب أن تقوم الدالة بإجراء فحص لاغية. عند استخدام مكتبات الطرف الثالث، لا يمكنك تغيير الدوال من الداخل. ماذا بعد ذلك؟
والأهم من ذلك أن المطورين الآخرين الذين يقرؤون شفرتك البرمجية ويرون أنك تمرر لا شيء من المحتمل أن يكون مرتبكًا بشأن سبب اختيارك لهذه الطريقة الغريبة لتنفيذ ميزتك.
كيف يمكنني تجنب ذلك؟
لا تقم بإرجاع لا شيء القيمة! أبدًا! في حال كانت دالتك تُرجع نوعًا من المجموعة، يمكنك فقط إرجاع المجموعة. إذا كنت تتعامل مع كائنات مفردة، يمكنك الاستفادة من نمط تصميم الكائنات الفارغة. بما أن جافا 8، يتم تنفيذه على النحو التالي اختياري. بخلاف ذلك، فإن أقل طريقة موصى بها تتضمن رفع الاستثناء.
5. تسلسل السلاسل الثقيلة
نأمل أن لا يكون هذا السؤال من الأخطاء التي ترتكبها، لأنه السؤال الأكثر شيوعًا (أو ربما ثاني أكثر الأسئلة شيوعًا بعد فيزباز) في المقابلات الشخصية. كما يجب أن تعرف الآن، فإن الخيط غير قابل للتغيير في جافا - بمجرد إنشائها، لا يمكن تعديلها. لذا فإن تسلسل الخيط الحرفي يعني الكثير من تخصيص الذاكرة غير الضروري. تسلسل الخيط في كل مرة يتطلب إنشاء كائنات مؤقتة منشئ الأوتار وتغييره إلى سلسلة. لذلك، هذا الحل غير مناسب على الإطلاق إذا أردنا دمج عدد كبير من الأحرف.
كيف يمكنني تجنب ذلك؟
لحل هذه المشكلة، استخدم منشئ الأوتار. ينشئ كائن قابل للتغيير يمكن التلاعب به بسهولة. بالطبع، يمكنك دائمًا استخدام StringBuffer إذا كان المشروع في سياق متزامن.
6. عدم استخدام الحلول القائمة
عند تطوير البرمجيات، فإن الإلمام بأساسيات اللغة التي تكتب بها أمر لا بد منه ولكنه ليس كافياً. العديد من المشاكل الخوارزمية التي تصادفها أثناء تنفيذ ميزة جديدة قد تم حلها بالفعل من قبل شخص آخر. في كثير من الأحيان رأيت شخصًا ينفذ خوارزمية أمنية من الصفر. مثل هذا النهج عرضة للخطأ. لا يمكن لشخص واحد اختبار مثل هذا الحل المعقد بدقة. المعرفة الجماعية لـ الفريق التي تتكون من مبرمجين متوسطي التقدم أفضل دائمًا تقريبًا من عظمة مبرمج واحد معجزة مطور جافا. لا حاجة لك إلى إعادة اختراع العجلة - كل ما عليك فعله هو تكييف الحل الحالي ليناسب احتياجاتك.
كيف يمكنني تجنب ذلك؟
حاول البحث عن المكتبات التي تعالج المشكلة التي تعمل عليها. حاول العثور على حلول مشابهة. العديد من المكتبات المتوفرة على الويب مجانية وقد تم صقلها واختبارها من قبل مطورين ذوي خبرة ومجتمع جافا بأكمله. لا تخف من الاستفادة منها.
7. عدم إيجاد الوقت الكافي لكتابة الاختبارات
من المغري أن نعتقد أن شفرتنا ستعمل دائمًا بشكل مثالي. إن عدم كتابة اختبارات للشيفرة البرمجية هو أسوأ خطيئة في جافا مطورو البرمجيات. يفضل الكثير منا الاختبارات اليدوية والاستكشافية بدلاً من اختبارات الوحدة، وهو أمر جنوني. لماذا نضيع الوقت في كتابة الاختبارات بينما يمكننا التركيز على تقديم أفضل كود برمجي في العالم لمشروعك، والذي لا يحتوي على أخطاء بالتأكيد؟ اتضح أن الحقيقة قاسية ولا يمكننا تقديم كود عالي الجودة دون كتابة الاختبارات.
كيف يمكنني تجنب ذلك؟
يجب عليك دائمًا إعداد اختبارات لشفرتك البرمجية. أعلم أنه ليس من السهل الحفاظ على نهج TDD ولكن يجب عليك على الأقل توفير اختبارات تغطي جميع الظروف التي يمكن فيها تشغيل التعليمات البرمجية الخاصة بك. وهذا يشمل اختبار الحالات الاستثنائية. اختبارات الوحدة ضرورية. يجب عليك توفيرها لكل ميزة في مشروعك إذا كنت تريد التأكد من سهولة إعادة هيكلة شفرتك البرمجية وقابليتها للتوسيع في عمليات التطوير الإضافية.
شيء آخر. حافظ على مستوى عالٍ من كود الاختبار الخاص بك - الأمر يستحق العناء. هذه نصيحة العم بوب وأنا أتفق معها تماماً.
علاوة على ذلك، لا تنسَ أنواع الاختبارات الأخرى. اختبارات التكامل هي شيء يجب أن تضعه في اعتبارك في كل مشروع.
8. نسيان معدّلات الوصول
الخاص والعام، أليس كذلك؟ كيف يمكننا أن ننساهم. اتضح أن هناك المزيد. عندما بدأت تعلم جافافقد تعرفت بالتأكيد على معدِّلات الوصول المحمية. يمكن أن تكون مفيدة في بعض الحالات، لذا من المفيد معرفة وجودها.
مطورو جافا غالبًا ما يبدو أنهم ينسون نطاق الحزمة. من السهل عدم تذكر استخدامه نظرًا لأنه ضمني ولا يتطلب أي جافا الكلمات المفتاحية. نطاق الحزمة مهم. فهو يتيح لك اختبار طريقة محمية. يمكن الوصول إلى العناصر المحمية من مسار فئة الاختبار، طالما أن الحزمة هي نفسها.
كيف يمكنني تجنب ذلك؟
تذكر بشأن المعدل المحمي وأن نطاق الحزمة يسمح لك باختباره.
9. استخدام JavaEE الخالص بدلاً من Spring
الخطوة التالية بعد التعلم جافا SE هو تعلم كيفية تشغيل جافا على الخوادم، وكيفية إنشاء تطبيق على مستوى المؤسسة.
غالبًا ما يقع المبتدئون في فخ تعلم JavaEE نظرًا لوجود عدد كبير من البرامج التعليمية حوله. حتى كتاب "التفكير في جافا"، وهو مبرمجو جافا' يذكر الكتاب المقدس "JavaEE" ولا يذكر شيئًا عن الخيارات الأخرى.
كيف يمكنني تجنب ذلك؟
JavaEE هي أغنية من الماضي. أما في الوقت الحاضر، فإن Spring هو الشيء الذي يجب أن تذهب إليه وJava EE هو مجرد شيء جميل. كل تطبيق حديث على مستوى المؤسسات يستخدم Spring، لذلك يجب أن تفكر بشدة في تعلم هنا.