القليل من النظرية حول Java Switch
تخيل أنك فارس متوقف عند مفترق الطريق. إذا ذهبت إلى اليسار، فسوف تفقد حصانك. إذا ذهبت إلى اليمين، سوف تكتسب المعرفة. كيف نمثل هذا الموقف في الكود؟ ربما تعلم بالفعل أننا نستخدم تركيبات مثل if-then و if-then-else لاتخاذ هذه القرارات.if (turn_left) {
System.out.println("You will lose your horse");
}
if (turn_right) {
System.out.println("You will gain knowledge");
}
else
System.out.println("So you're just going to stand there?");
ولكن ماذا لو لم ينقسم الطريق إلى قسمين بل إلى عشرة؟ لديك طرق "إلى اليمين تمامًا"، "إلى اليسار قليلاً"، "إلى اليسار قليلاً" وما إلى ذلك، بإجمالي 10 طرق محتملة؟ تخيل كيف سينمو رمز "if-then-else " الخاص بك في هذا الإصدار!
if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
لنفترض أن لديك مفترق طرق ذو 10 اتجاهات في الطريق (من المهم هنا أن يكون عدد الخيارات محدودًا). في مثل هذه المواقف، تحتوي Java على بيان التبديل .
switch (ExpressionForMakingAChoice) {
case (Value1):
Code1;
break;
case (Value2):
Code2;
break;
...
case (ValueN):
CodeN;
break;
default:
CodeForDefaultChoice;
break;
}
هذه هي الطريقة التي يعمل بها البيان:
- يتم تقييم ExpressionForMakingAChoice. ثم يقوم بيان التبديل بمقارنة القيمة الناتجة مع القيمة التالية (بالترتيب الذي تم إدراجها به).
- إذا تطابق ExpressionForMakingAChoice مع ValueX، فسيتم تنفيذ التعليمات البرمجية التي تلي النقطتين.
- إذا تمت مواجهة عبارة Break ، فسيتم نقل التحكم خارج عبارة التبديل.
- إذا لم يتطابق ExpressionForMakingAChoice مع أي ValueX، فسيتم تمرير التحكم إلى CodeForDefaultCase.
-
في بيان التبديل، يجب أن يكون نوع ExpressionForMakingAChoice واحدًا مما يلي:
- بايت , قصير , شار , كثافة العمليات .
- بايت ، قصير ، حرف ، عدد صحيح (مغلفات أنواع البيانات البدائية).
- خيط .
- التعداد .
- الكتلة الافتراضية اختيارية. إذا كان غائبًا ولم يتطابق ExpressionForMakingAChoice مع أي قيمة ValueX، فلن يتم تنفيذ أي إجراء.
- بيان الاستراحة غير مطلوب. إذا كان غائبًا، فسيستمر تنفيذ التعليمات البرمجية (تجاهل المزيد من المقارنات في عبارات الحالة) حتى أول ظهور للفاصل أو حتى نهاية بيان التبديل .
- إذا كانت هناك حاجة إلى تنفيذ نفس التعليمات البرمجية لعدة اختيارات، فيمكننا التخلص من التكرار عن طريق تحديد عدة بيانات حالة متتالية.
دعونا الآن نلقي نظرة على كيفية استخدام بيان التبديل في جافا
لا تقلق: لقد انتهينا من النظرية. بعد أن ترى الأمثلة التالية، سوف يصبح كل شيء أكثر وضوحا. حسنا، دعونا نبدأ. دعونا نلقي نظرة على مثال من علم الفلك يشمل كواكب نظامنا الشمسي. وفقاً لأحدث المواقف الدولية، فقد قمنا باستبعاد بلوتو (نظراً لخصائص مداره). ونذكر أن كواكبنا مرتبة حسب بعدها عن الشمس على النحو التالي: عطارد، الزهرة، الأرض، المريخ، المشتري، زحل، أورانوس، ونبتون. لنكتب طريقة Java تأخذ الرقم الترتيبي للكوكب (بالنسبة إلى بعده عن الشمس) وتُرجع المكونات الرئيسية للغلاف الجوي للكوكب في شكل List <String> . ستتذكر أن بعض الكواكب لها تكوين جوي مماثل. وهكذا، فإن كوكب الزهرة والمريخ يحتويان بشكل أساسي على ثاني أكسيد الكربون؛ يتكون الغلاف الجوي للمشتري وزحل من الهيدروجين والهيليوم. ويضيف أورانوس ونبتون غاز الميثان إلى الزوج الأخير من الغازات. ها هي وظيفتنا:public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
List<String> result = new ArrayList<>();
switch (seqNumberFromSun) {
case 1: result.add("No atmosphere");
break;
case 2:
case 4: result.add("Carbon dioxide");
break;
case 3: result.add("Carbon dioxide");
result.add("Nitrogen");
result.add ("Oxygen");
break;
case 5:
case 6: result.add("Hydrogen");
result.add("Helium");
break;
case 7:
case 8: result.add("Methane");
result.add("Hydrogen");
result.add("Helium");
break;
default:
break;
}
return result;
}
لاحظ أننا نستخدم نفس الكود للكواكب ذات التركيبات الجوية المتطابقة. لقد فعلنا ذلك باستخدام بيانات الحالة المتتالية . إذا أردنا الحصول على تركيبة الغلاف الجوي لكوكبنا الأصلي، فإننا نسمي طريقتنا بالرقم 3 كوسيطة:
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
تجربة مع Break: ماذا يحدث إذا قمنا بإزالة جميع عبارات Break ؟ دعنا نعطيها محاولة:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
List<String> result = new ArrayList<>();
switch (seqNumberFromSun) {
case 1: result.add("No atmosphere");
case 2:
case 4: result.add("Carbon dioxide");
case 3: result.add("Carbon dioxide");
result.add("Nitrogen");
result.add ("Oxygen");
case 5:
case 6: result.add("Hydrogen");
result.add("Helium");
case 7:
case 8: result.add("Methane");
result.add("Hydrogen");
result.add("Helium");
default:
}
return result;
}
إذا قمنا بطباعة نتيجة System.out.println(getPlanetAtmosphere(3)) ، فسنجد أن كوكبنا الأصلي ليس صالحًا للعيش فيه. أو هو؟ احكم بنفسك: ["ثاني أكسيد الكربون"، "النيتروجين"، "الأكسجين"، "الهيدروجين"، "الهيليوم"، "الميثان"، "الهيدروجين"، "الهيليوم"] . لماذا حدث هذا؟ يقوم البرنامج بتنفيذ كافة عبارات الحالة بعد المطابقة الأولى حتى نهاية كتلة التبديل .
التحسين المفرط لبيانات الاستراحة
لاحظ أنه يمكننا تحسين الطريقة من خلال ترتيب عبارات الاستراحة والحالات بشكل مختلف.public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
List<String> result = new ArrayList<>();
switch (seqNumberFromSun) {
case 1: result.add("No atmosphere");
break;
case 3: result.add("Nitrogen");
result.add ("Oxygen");
case 2:
case 4: result.add("Carbon dioxide");
break;
case 7:
case 8: result.add("Methane");
case 5:
case 6: result.add("Hydrogen");
result.add("Helium");
}
return result;
}
يبدو وكأنه رمز أقل، أليس كذلك؟ لقد قمنا بتقليل العدد الإجمالي للبيانات من خلال التلاعب بترتيب بيانات الحالة وإعادة تجميعها. والآن تتم إضافة كل نوع من أنواع الغاز إلى القائمة في سطر واحد فقط من التعليمات البرمجية. الكود الوارد في المثال الأخير هو فقط لإظهار كيفية عمل الأشياء. لا ننصح بكتابة التعليمات البرمجية بهذه الطريقة. إذا كان مؤلف كود Java هذا (ناهيك عن المبرمجين الآخرين) يجب أن يحافظ عليه، فسوف يجد صعوبة كبيرة في إعادة بناء المنطق الكامن وراء تكوين كتل الحالة هذه والتعليمات البرمجية التي يتم تنفيذها في بيان التبديل .
الاختلافات من إذا
نظرًا لأوجه التشابه الخارجية بين عبارات if و switch ، لا تنس أن عبارة Switch تحدد إحدى الحالات بناءً على قيمة محددة، بينما يمكن أن تحتوي عبارة if على أي تعبير منطقي. ضع ذلك في الاعتبار عند تصميم التعليمات البرمجية الخاصة بك.خاتمة
- استخدم بيان الحالة لأكثر من فرعين حتى لا تزدحم التعليمات البرمجية الخاصة بك ببيانات if.
- لا تنس إكمال الكتلة المنطقية للفرع لكل قيمة محددة (بيان الحالة) عن طريق إدراج عبارة فاصل .
- يمكن أن يكون تعبير عبارة التبديل عبارة عن Enum أو String ، بالإضافة إلى بعض الأنواع البدائية.
- تذكر الكتلة الافتراضية . استخدمه للتعامل مع القيم غير المتوقعة.
- لتحسين الأداء، انقل فروع التعليمات البرمجية المقابلة للقيم الأكثر شيوعًا إلى بداية كتلة التبديل .
- لا تبالغ في "التحسين" الخاص بك عن طريق حذف عبارات الاستراحة في نهاية عبارات الحالة - مثل هذه التعليمات البرمجية يصعب فهمها، ونتيجة لذلك، يصعب صيانتها.
GO TO FULL VERSION