من الممكن كتابة جميع البرامج باستخدام ثلاث هياكل فقط. هيكل التسلسل وهيكل الاختيار وهيكل التكرار.
في ستينيات القرن الماضي كانت عبارة goto مسؤولة عن الكثير من التعقيد في الشفرات المصدرية حتى أثبت بوم و ياكوبيني Bohm and Jacopini أن جميع البرامج من الممكن كتابتها باستخدام هذه الهياكل الثلاث فقط.
عبارة هيكل التحكم Control Structure أصبحت مرادفة لكتابة البرامج والشفرات المصدرية بدون استخدام عبارة goto.
في هذه التدوينة ستتعرف على هيكل التحكم أو عبارات التحكم Control Statements التي تستطيع باستخدامها كتابة جميع برامجك بلغة جافا تحديداً.
هيكل التسلسل Sequence Structure – بلا عناء
هيكل التسلسل هو الهيكل الافتراضي في لغة جافا. يبدأ تنفيذ البرنامج بالسطر الأول ثم السطر الثاني ثم الثالث وهكذا دواليك.
//sequencial execution System.out.println("Hi"); System.out.println("I'm browsing"); System.out.println("oolom.com");
الشفرات البرمجية في اللغات عالية المستوى هي عبارة عن جمل مقاربة للغة الإنسان، تكتب في سطور متعددة ويوجد وسيط يهتم بترجمتها من لغة البرمجة “في حالتنا هذه جافا” إلى لغة يفهمها الحاسب.
هذا الوسيط بين لغة البرمجة والحاسب في جافا يسمى بالمترجم Compiler.
عند بدء ترجمة البرنامج يبدأ المترجم بقراءة الملف المصدري (الكود) الذي كتبته أنت سطراً تلو الآخر مثلما يقرأ الإنسان الكتاب، ويحول هذه الأسطر إلى شيءٍ يفهمه الحاسب وفقاً للخطوات المعتمدة.

يستطيع المبرمج التعبير عن أفكاره بكتابتها بطريقة تسلسلية، ولكنها تظل تحتاج إلى هياكل أخرى لتستطيع التعبير بطريقة جيّدة.
هل تتساءل، لماذا أحتاج إلى هياكل أخرى؟
هذا يدل على رقي تفكيرك.
ألا ترغب بأن تقلل من عدد الأسطر التي تكتبها لحل مشكلة ما؟ ألا تحتاج أحياناً لتنفيذ مجموعة من الحلول وفقاً لتحقق شرط ما؟
بالتأكيد إجابتك نعم، وسترى كيف تؤدي الهياكل التالية هذه المهمة.
هيكل الاختيار Selection Structure – يمين أم يسار؟
سأتوجه من المنزل إلى العمل. إذا كان الطريق أ سالكاً سأسلكه، أما إذا كان مزدحماً سأسلك الطريق ب.
من الممكن كتابة الجزء الأول من الشفرة البرمجة “توجه من المنزل إلى العمل عبر الطريق أ” بصورة تسلسلية بسيطة.
ولكن ماذا ستفعل للاختيار بين الطريقين أ وب؟
يبدو أنك تحتاج إلى هيكل اختيار حتى تستطيع تمثيل أفكارك عبر لغة البرمجة!
الشرط (السؤال) الذي نحتاج إلى التحقق منه هو “هل الطريق أ سالك؟”
هيكل الاختيار (جمل الاختيار) يحدد الكتلة التي يجب تنفيذها من الشفرة المصدرية بناءً على نتيجة شرط (نعم أو لا) (true, false).

توفر لك لغة جافا ثلاث أدوات تساعدك على التعبير عن الشروط في لغة البرمجة:
- حالة الاختيار الواحد الأداة if: تختبر هذه الأداة شرط -أو مجموعة شروط- عند تحققها يتم تنفيذ كتلة محددة من الشفرة المصدرية، إذا لم يتحقق الشرط -أو الشروط- لا يتم تنفيذ هذه الكتلة.
//selection statement -- if int temperature = 0; if(temperature == 0){ System.out.println("it's freezing"); }
- حالة الاختيار المزدوج الأداة if else: تختبر هذه الأداة شرط – أو مجموعة شروط- عند تحققها يتم تنفيذ جزء محدد من الشفرة المصدرية، وعند عدم تحققها يتم تنفيذ كتلة أخرى من الشفرة المصدرية.
//selection statement -- if else int temperature = 50; if(temperature < 25){ System.out.println("it's cold weather"); }else{ System.out.println("it's hot weather"); }
- حالة الاختيار المتعدد الأداة switch: تختبر هذه الأداة قيمة محددة وبناءً على قيمتها يتم تنفيذ أحدى كتل الشفرات المصدرية المتعددة.
//selection statement -- switch int month = 8; switch(month){ case 9: case 4: case 6: case 11: System.out.println("has 30 days"); break; case 2: System.out.println("has 28 or 29"); break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.println("has 31 days"); break; default: System.out.println("months are between 1 and 12"); }
حتى هنا تستطيع التعبير عن أفكارك باستخدام لغة البرمجة بطريقة تسلسلية كما تستطيع اختيار تنفيذ أجزاء محددة من الشفرة المصدرية وفقاً لشروط محددة.
ولكن ماذا عن تكرار تنفيذ كتلة شفرة مصدرية؟
مثلاً، لديك أمر يُكتب في سطر واحد أحد الأرقام على الشاشة، ويحتاج برنامجك لطباعة الأرقام من 1 إلى 1000 على الشاشة.
هذا يعني أنك تحتاج إلى إعادة كتابة نفس الأمر لـ 1000 مرة حتى تؤدي المطلوب منك!!!
هيكل التكرار Iteration Structure – توفير الزمن
يسهل هيكل التكرار كتابة الشفرات البرمجية كثيراً على المبرمجين.
كثيرٌ من أفكارنا تعتمد على التكرار، السير من النقطة أ إلى النقطة ب يُنفّذ عبر تكرار خطوة ما، قراءة الملف تتم عبر تكرار قراءة سطر، حل مشكلة الطباعة السابقة تتم عبر إضافة واحد إلى الرقم السابق في كل مرة طباعة!
تبقى الهيكل الأخير الذي تحتاجه للتعبير عن جميع أفكارك في صورة شفرة مصدرية وهو هيكل التكرار Iteration Structure.
هيكل التكرار يسمح لك بتكرار تنفيذ كتلة محددة من الشفرة البرمجية وفقاً لتحقق شرط محدد

مثلاً، إذا كانت شفرتك البرمجية تتحدث عن الانتقال من النقطة أ إلى النقطة ب، والشفرة المصدرية التي يتم تكرارها هي التحرك لخطوة واحدة في اتجاه النقطة ب. سيكون شرط التكرار هو عدم الوصول إلى النقطة ب.
فور الوصول إلى النقطة ب يتم إيقاف تنفيذ التكرار والانتقال إلى ما يلي هذه الكتلة من الشفرة المصدرية.
لغة جافا توفر لك أربع أدوات تساعدك على تكرار الشفرات المصدرية:
- الأداة for: تكرر الأداة for كتلة شفرة مصدرية لصفر مرة أو أكثر، عدد مرات التكرار يعتمد على تحقق شرط محدد. أعتبر الأداة for مفيدة في حال تطلبت كتلة الشفرة المصدرية معرفة رقم التكرار.
//Iteration statement -- for int array[] = {1,2,3,4,5}; for(int i = 0; i<array.length; i++){ System.out.println("This is loop number "+i); }
- الأداة while: تكرر الأداة while كتلة شفرة مصدرية لصفر مرة أو أكثر. أستخدم هذه الأداة عندما أحتاج لتنفيذ الشفرة المصدرية لصفر مرة أو أكثر وفقاً لشرط محدد فقط. وفي نفس الوقت لا أحتاج لمعرفة رقم التكرار. وهنالك استخدامات أخرى.
//Iteration statement - while //printing all numbers until getting 9 int randomNumber = (int)(Math.random()*10); while(randomNumber != 9){ System.out.println("random method generated " + randomNumber); randomNumber = (int)(Math.random()*10); }
- الأداة do while: تتميز do while بأنها تنفذ كتلة الشفرة المصدرية مرة واحدة على الأقل، بعد ذلك تبدأ بالتحقق من شرط التكرار، أي أنها تنفذ الشفرة المصدرية لمرة واحد ثم تتحول إلى while تماماً. تستطيع الاستفادة منها إذا كنت تحتاج لتنفيذ الشفرة المصدرية لمرة واحدة على الأقل.
//iteration statement - do while //printing all numbers until getting 9 (9 printed at the end) int randomNumber; do{ randomNumber = (int) (Math.random() * 10); System.out.println("random method generated " + randomNumber); }while(randomNumber != 9);
- الأداة for المحسّنة: مشابهة للأداة for، إلا أنها لا تحتاج إلى شرط، فهي تستقبل مصفوفة وتمر عبر المصفوفة من البداية إلى النهاية، كما أنها لا توفر لك رقم التكرار. تستطيع استخدامها في حالات مثل حساب المتوسط من مصفوفة.
//iterative statement - enhanced for int array[] = {1,2,3,4,5}; int sum = 0; for(int element : array){ sum += element; } System.out.println("Array sum = "+sum);
بهياكل التحكم (جمل التحكم) الثلاث تستطيع تحويل أفكارك البرمجية إلى برامج مهما كان نوع الفكرة، تسلسل واختيار وتكرار. والشكرُ -بعد الله- يُرجع إلى بوم وياكوبيني الّذين أخرجانا من دوّامة عبارة goto.
قطعاً لا نستطيع أن نستغني أي هيكل من الهياكل السابقة. ولكن شخصياً لا أدري كيف كان بإمكاننا كتابة البرامج إذا لم يتوفر هيكل التكرار! فهو يسهّل المهمّة كثيراً.