تعلّم البرمجة بلغة كوتلن (36): التعبير الشرطي When

تعلّم البرمجة بلغة كوتلن (36): التعبير الشرطي When
أستمع الى المقال

شرحنا في دروس سابقة، قراءة مدخلات المستخدم عبر استخدام دالة ()readln. وكيفية التحكم في سير تنفيذ شفرة برنامج كوتلن، عبر استخدام كتلة if الشرطية وتوابعها. و الفرق بين Expression و Statement. والتعامل مع النطاقات في درس حلقة التكرار for والنطاقات. وما هي القيم المنطقية Booleans.

وفي هذا الدرس، نشرح إحدى أهم الكتل التي تستخدم في برنامج كوتلن بكثرة، لأنها تقلل التكرار في شفرات البرامج. وأي شيء يبسِّط ويسهِّل المهمة، يعتبره المبرمجون نعمة. فإذا كان لدينا أكثر من ثلاث اختيارات أو شروط، عندها يكون استخدام تعبير when، أفضل بكثير من تعبير if الشرطي.

ما هي كتلة تعبير when:

هي كتلة يمكن أن تعيد نتيجة معينة، أو تقوم بإجراء معين دون إعادة نتيجة، بعد إجراء مقارنة بين قيمة ما ومجموعة من الاحتمالات (شروط فرعية).

ويكون الإعلان عن هذه الكتلة، بالكلمة المفتاحية when، ونضع القيمة المراد إجراء مقارنة عليها، بين قوسين ( ). ثم نفتح قوسين معقوفين { }، نكتب بداخلهما مجموعة من الاحتمالات، والإجراء المطلوب إتباعه عند التطابق:

نلاحظ أن هناك شكل سهم (<-) بين الاحتمالات التي يمكن أن تطابق قيمتها، قيمة المتغير value، والإجراء الذي يجب أن تقوم به الكتلة عند التطابق. وفعليًا يتكون السّهم من الرمز شرطة (-) والرمز قوس زاوية (<) متجه لليمين.

نحن نريد في الشفرة، مطابقة القيمة value، مع عدة احتمالات. فإذا كانت قيمة alternative1 وقيمة value متساويتان، سيتم تنفيذ الإجراء يمين السهم الذي يقابل alternative1. وهو طباعة الجملة النصية: alternative1 matches value. أما إذا لم يتطابقا، سيتم تجريب مطابقة alternative2… وهكذا. 

إلى أن تنتهي مطابقة جميع الاحتمالات، فإذا لم تجد الكتلة أية مطابقة، ستنفذ الإجراء الذي يقابل else وطباعة جملة: No matches found. مع العلم أن else في هذه الحالة اختيارية ويمكننا عدم كتابتها.

الشرط الفرعي في when:

تعمل كتلة when، بطريقة مشابهة لكتلة switch في لغات البرمجة مثل Java أو #C. مع الفرق أن when، توفر فحصًا أكثر تعقيدًا، من مطابقة القيم فقط كما هو الحال في switch. 

فمثلًا، يمكننا استخدام when، لإجراء حسابات قبل إجراء المقارنة. كمثال لذلك، لدينا البرنامج التالي:

يقرأ البرنامج ثلاث مدخلات من المستخدم، ويفرّق بينها باستخدام المسافة عبر دالة ()split، ثم يحفظها في المتغيرات var1, var2, var3. بعدها نحوّل المتغيرات إلى النوع Int، عبر استخدام دالة ()toInt، ونحفظها بعد التحويل إلى أعداد صحيحة، في المتغيرات a و b و c. 

ثم في كتلة when، نحاول حساب قيمة المتغير c، باستخدام المتغيرين a, b. فإذا أدخلنا القيم 4 10 14 على التوالي. ستصبح قيم المتغيرات: a = 14 و b = 10، و c = 4.

ستقوم الكتلة في الشرط الفرعي الأول، بحساب:

a + b = 24

والرقم 24 لا يساوي قيمة c والتي تساوي 4. لذا يتم التّخطي إلى الشرط الفرعي الثاني. والذي فيه:

a – b = 4

الرقم 4 مساوي لقيمة c، لذا سيتم تنفيذ الإجراء على يمينه، وهو طباعة:

4 equals 14 minus 10

أما إذا كانت عدة شروط فرعية صحيحة فسيتم تنفيذ الإجراء في أول شرط فرعي صحيح. فإذا كانت المدخلات 0 0 0، فسيتم طباعة:

0 equals 0 plus 0

غض النظر عن أن الشروط الفرعية تحته أيضًا صحيحة.

استخدام النطاقات في when:

يمكن لكتلة when إيجاد قيمة بين حَدّي نطاق معين، والقيام بتنفيذ إجراء حسب النتيجة العائدة من النطاق:

يقرأ البرنامج رقم ويحفظه في المتغير number. ثم في when، نحاول معرفة ما إذا كانت قيمة number تقع ضمن بعض النطاقات، والتي وضعناها كفروع شرطية في الكتلة.

فإذا أدخلنا الرقم 0، ستتم طباعة: the number is zero.

وإذا أدخلنا الرقم 3، سيتم طباعة: the number is between 1 and 9. ونلاحظ أن جملة الطباعة تقول أن موقع الرقم هو بين 1 و 9. وهذا لأن المعامل untill يستبعد الحدّ الأخير في النطاق وهو هنا الرقم 10، خلاف معامل النقطتين (..)، كما شرحنا في درس كتلة for والنطاقات.

أما إذا أدخلنا الرقم 36، سيتم طباعة: the number is between 19 and 36. تم شمل الحد الأخير 36 في النطاق، لأننا استخدمنا معامل النقطتين (..).

كتلة when بدون أقواس ( ):

يمكننا استخدام تعبير when بدون وضع قيمة داخل قوس لمقارنتها والتخلص من الأقواس أيضًا. ويكون كل شرط فرعي في هذه الحالة، عبارة عن تعبير منطقي، تكون نتيجته true أو false. ويتم تنفيذ الإجراء يمين الشرط الفرعي، عندما تكون نتيجة التعبير صحيحة true:

وضع أكثر من شرط فرعي لتنفيذ نفس الإجراء:

إذا كنا نحتاج إلى عدّة شروط فرعية مختلفة لتنفيذ إجراء معين، يمكننا وضعها في نفس السطر والفصل بينها باستخدام الفاصلة:

يحمل السطر الأول وحده، ثلاث شروط فرعية. إذا تحقّق أيّا منها سيتم طباعة: 

the number is zero or 14 or 16.

ونفس الأمر ينطبق على الشرط الفرعي الثالث، الذي يحمل شرطين عبارة نطاقين. إذا وجدت قيمة number في أيّاً منهما، سيتم طباعة:

the number is between 19 and 36 or between 10 and 14

كتلة when كتعبير:

يمكننا استخدام when كتعبير يمكنه إرجاع نتيجة. وفي هذه الحالة يجب على كل فرع شرطي أن يُعيد نتيجة، ويجب وضع فرع else أيضًا. كمثال، فلننظر إلى الشفرة التالية من درس الاستثناءات:

تبدو الشفرة باستخدام كتلة if، مزدحمة قليلًا مع كل هذه التكرارات لكتل else if. لذلك يمكننا استبدالها بكتلة when وستؤدي المهمة دون تغيير في النتيجة:

لنجد أن الشفرة أصبحت مختصرة وأكثر قابلية للقراءة. ولأن when مثل if يمكن أن تعيد قيمة، يمكننا إختصار الشفرة أكثر، بإسناد القيمة العائدة إلى الدالة ()calc مباشرةً:

ولكن بعد فعل ذلك، سنجد أن هناك خطأ ظهر في برنامج IntelliJ:

هنا البرنامج يُخبرنا، بأنه عند استخدام when كتعبير يعود بقيمة، لابد من وضع الشرط الفرعي else داخلها:

برنامج كتابة المَعدُود:

كمثال عملي بسيط، دعونا نستخدم كتلة when لتعيد لنا الكلمة المناسبة في اللغة العربية للمعدود:

يطلب البرنامج من المستخدم إدخال عدد المنتجات ويسند العدد المدخل إلى المتغير quantity. ثم نستخدم كتلة when، في مطابقة القيمة المدخلة من المستخدم، مع عدة إحتمالات.

فإذا كانت قيمة المتغير quantity تساوي 1، فسيتم طباعة: هناك منتج واحد في المخزن. وإذا كانت قيمته تساوي 2، فسيتم طباعة: هناك منتجان في المخزن. أما إذا كانت قيمته تتواجد في النطاق العددي من الرقم 3 إلى الرقم 10، فسيتم طباعة: هناك (قيمة المتغير quantity) منتجات في المخزن. وأخيرًا، إذا لم يطابق العدد أيّاً من الإحتمالات، فسيتم طباعة: هناك (قيمة المتغير quantity) منتجًا في المخزن.

نلاحظ أنّنا وضعنا كتلة when داخل أقواس دالة ()println مباشرةً. وهذا لأنّها تعيد نتيجة معينة كما قُلنا سابقًا. والنتيجة العائدة، هي ما ستطبعها دالة ()println.

وعند تنفيذ الشفرة، سينتج لنا:

تحسين الشفرة باستخدام كتلة if الشرطية:

ولكن ماذا لو أدخل المستخدم رقم سالب مثل: -1؟ لأن الرقم -1 لا يطابق أي إحتمال شرط فرعي، سيتم تنفيذ الإجراء في else، وطباعة:  هناك -1 منتجًا في المخزن. هذا لا يبدو صحيحًا تمامًا. لذا لنعدّل شفرة else ونضيف شرط باستخدام كتلة if:

لأن الإجراء الذي يقابل else لم يعد عبارة عن سطر واحد، وضعنا الأقواس المعقوفة لزيادة التوضيح.

والآن عند تنفيذ الشفرة، ستكون النتيجة:

استعرضنا في هذا الدرس، عدّة طُرقٍ يمكننا استخدامها مع كتلة when. وبالطبع ليست هذه هي كل المواضع والحالات التي نستخدمها فيها، والتي سنتحدث عنها عند الحاجة لاحقًا في هذه الدورة.

ولكن عمومًا، التّعود على استخدامها يسهّل كثيرًا في كتابة شفرات البرامج، ويقلّل جدًا من التّكرار، بالتالي زيادة قابلية القراءة للشفرة.

هذا الدرس هو جزء من سلسلة تعليم مبادئ البرمجة بلغة كوتلن. لمُتابعة الدروس منذ البداية ومُشاهدة فهرس المحتويات يمكنك الانتقال إلى الدرس الأول من هنا.

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.