السلام عليكم
شيفرة الإسبكتي Spaghetti Code, عبارة عن مصطلح تقني يصف ذلك النص البرمجي الذي يكون صعب القراءة, الفهم, و صعب المراس والتتبع من قبل المبرمجين(قراء البرنامج), و ذلك لأن شيفرة الإسبكتي قد تكون غير منظمة و قد تكون مقسمة إلى عدة أقسام بعضها يكون مختص بأعلى الملف البرمجي و البعض الآخر بأسفل منه.
(لوووول,,, فكرتوا انها مكرونة عن جد؟؟) ان شاء الله رايحة اعمل لغة تعمل بشاميل :pwease:
يمكننا كتابة شيفرة من هذا النوع بواسطة لغة C++ و لكننا غير مضطرين لهذا الشيء. عموماً هناك تصريح يسمى goto في هذه اللغة مسؤول عن كتابة برامج او أجزاء من البرنامج بصغية الإسبكتي(مثل المكرونة ملتوي و مطبق على بعض, لكن أكل مكرونة الإسبكتي مي صعبة و مملة مثل تتبع وقراءة شيفرة الإسبكتي "يم يم").
التصريح goto يقوم بأمر البرنامج إلى الإنتقال إلى عنوان جزء ما في الرنامج. هذا العنوان نكون كتبناه مسبقاً في البرنامج بواسطة طريقة الرقعة الإسمية label. على سبيل المثال البرنامج التالي الذي يقوم بالعد من 1 إلى 5مكتوب بلغة C++ يقوم بشرح كيفية عمل goto :
- //Spaghetti Code
- #include <iostream>
- using std::cout;
- using std::endl;
- int main()
- {
- int count = 0;
- start: //This is known as a label named with "start"
- //count from 1 to 5
- count++;
- cout << count << endl;
- if( count >= 5 )
- goto exit; //here is the usage of goto statement.
- goto start; // and here too.
- exit: // This is another label named with "exit"
- cout << "end of the program..." << endl;
- return 0;
- }
التصريح goto والذي يعني إذهب إلى... ثم يليه العنوان الذي نريد من البرنامج الإنتقال إليه مثل start و exit. لاحظوا انا مجزئة البرنامج إلى جزئين (داخل الإجراء الرئيسي) جزء معنون بـ start و جزء معنون بـ exit ولاحظوا كمان علامة الكولون : عند نهاية كل عنوان. لاحظوا إن البرنامج ينزل عادي من أعلى إلى اسفل و رح يقوم بتعريف وتعين قيمة استهلالية للمتغير count نزولا بزيادة هذا المتغير و طباعة قيمته الجديدة(بعد الزيادة) ثم يتحقق من الشرط عن ما لو كان المتغير count اكبر من أو يساوي العدد 5؟ لو نعم: رح ينتقل البرنامج إلى جزء البرنامج المعنون بـ exit و لو لا: رح ينتقل البرنامج إلى السطر التالي و اللي بيكون تصريح goto آخر للإنتقال إلى الجزء المعنون بـ start مرة أخرى.
انا متعمدة اكتب امثلتي ببرامج بسيطة مثل هذا البرنامج (العد من 1 إلى 5) ليسهل التركيز على الموضوع الرئيسي وليس البرنامج نفسه. لهذا السبب ركزوا على عمل goto وبس. و انا موثقة البرنامج بتعليقات عند كل سطر تقريباً و لكن باللغة الإنجليزية البحتة.
ملاحظة: يمكننا كتابة البرنامج السابق بكل بساطة بواسطة جملة التكرار for أو أي جملة تكرار أخرى.
أوكي!!! تخيلوا لو كان البرنامج مليان بإذهب إلى... و مليان عنواين وأجزاء !!! كيف رح نقدر نتبع البرنامج و نفهمه أو نراجعه او نعدله في وقت لاحق؟؟؟ هذا هو ما يعرف بشيفرة الإسبكتي و هي غير محبذة تقنياً و برمجياً و يجب الإبتعاد عنها بقدر الإمكان (لأنها تزيد غموض البرنامج و تعسر عملية تتبعه).
أوكي! مؤلف لغة C++ و هو العالم Bjaren Stroustrup ترك goto هذي بالرغم من اكتفاء اللغة هذي بطرق وتقنيات تغني تماماً عن استخدام goto اللي بدورها تجعل من الشيفرة مكرونة إسبكتي و هي طريقة غير مرغوب فيها برمجياً. يا ترى لماذا؟؟؟
اوكي! لأنه ذكي و حاب يجعل من لغة C++ لغة غنية بقدر الإمكان بكل أسلوب برمجي ممكن, ومن بينها أسلوب كتابة البرامج بطريقة الإسبكتي هذي. حتى لو كانت مستمدة من لغة C لكن هو تركها على ماهي عليه.
اوكي! انتهينا من العيب الكامن بالتصريح goto ومشكلة شيفرة الإسبكتي في ما سبق... خلونا هنا نتعرف على فائدة التصريح goto و بش ممكن تنفعنا في لغة C++. !!
اوكي! كلنا نعرف إن الأمر break يقوم بإخراج البرنامج من البلوك الداخلي إلى البلوك الخارجي الحاضن له مباشرة ( بلوك يعني block هو كل ما بين الأقواس المجعدة {…}.). لكن لو كان عندنا مجموعة بلوكات متداخلة و معششة داخل بعض Nested Blocks, و نريد الخروج مباشرة من أقصى بلوك داخلي إلى آخر بلوك خارجي يحتويه؟؟؟
هنا يأتي الدور المفيد والنافع للتصريح goto. على سبيل المثال لو كان لدينا مجموعة بلوكات معششة واحدة داخل الآخرى, نكتب عنوان يليها مباشرة ثم نقوم بكتابة التصريح goto إذهب إلى العنوان...داخل أقصى بلوك داخلي نريد الخروج منه. وسيقوم البرنامج بالخروج مباشرة إلى حيث العنوان. وهذه لا يمكن تنفيذها بواسطة الأمر break. شاهد المقصوصة التالية:
- //Example:
- for( ) {
- for( ) {
- while( ) {
- if( ) goto stop;
- .
- }
- }
- }
- stop:
- cout << "Error in program.n";
المثال بالأعلى من كتاب C++ from the GROUND UP لـ Herbert Schildt.
الآن يخرج البرنامج إلى جزء البرنامج المعنون بـ stop مباشرة وليس مثل الأمر break الذي سيخرج إلى البلوك الحاضن مباشرة لهذا البلوك.
يا ريت اكون وصلت الفكرة و تعريف شيفرة الإسبكتي على النحو المراد!!
مع تمنياتي لكم بالتوفيق




