العربية  

books scale block

If you do not find what you're looking for, you can use more accurate words.

View more

كتلة النطاق (Info)


تسمح العديد من لغات البرمجة المهيكلة للكتل ، وليس كلها ، بتقييد النطاق على كتلة ، والتي تعرف باسم نطاق الكتلة. بدأ هذا بـ ALGOL 60 ، حيث "[...] الإعلان ... صحيح فقط لهذه الكتلة." ، واليوم يرتبط بشكل خاص باللغات في عائلة باسكال وجيم وتقاليدها. غالباً ما يتم احتواء هذه الكتلة داخل دالة ، وبالتالي تقييد النطاق إلى جزء من الدالة ، ولكن في بعض الحالات ، مثل Perl ، قد لا تكون الكتلة داخل دالة.

unsigned int sum_of_squares(const unsigned int N) { unsigned int ret = 0; for (unsigned int n = 1; n <= N; n++) { const unsigned int n_squared = n * n; ret += n_squared; } return ret; }

المثال المعتمد لاستخدام نطاق المنع هو الكود C الموضح هنا ، حيث يتم تحديد نطاق متغيرين للحلقة: المتغير n، الذي تتم تهيئته مرة واحدة ويزداد في كل تكرار للحلقة ، والمتغير المساعد n_squared ، والذي تتم التهيئة في كل تكرار. والغرض من ذلك هو تجنب إضافة متغيرات إلى نطاق الدوال ذي الصلة فقط بكتلة معينة - على سبيل المثال ، يمنع الأخطاء حيث تم بالفعل تعيين متغير الحلقة العامة الذي قمت بطريق الخطأ إلى قيمة أخرى. في هذا المثال ، لن يتم تعيين تعبير n * nبشكل عام لمتغير مساعد ، وببساطة يكون نص الحلقة مكتوبًا ret += n * n ولكن في الأمثلة الأكثر تعقيدًا تكون المتغيرات المساعدة مفيدة.

تستخدم الكتل في المقام الأول لتدفق التحكم ، كما هو الحال في حالة ، بينما ، وللحلقة ، وفي هذه الحالات ، فإن نطاق الكتلة يعني أن نطاق المتغير يعتمد على بنية تدفق تنفيذ الدالة. ومع ذلك ، فإن اللغات ذات نطاق الكتل تسمح عادةً باستخدام الكتل "المجردة" ، التي يكون غرضها الوحيد هو السماح بالتحكم الدقيق في النطاق المتغير. على سبيل المثال ، يمكن تعريف المتغير الإضافي في كتلة ، ثم استخدامه (على سبيل المثال ، إضافة إلى متغير مع نطاق الوظيفة) والتخلص منه عند انتهاء الكتلة ، أو قد تكون حلقة أثناء محاطة بكتلة تقوم بتهيئة المتغيرات المستخدمة داخل الحلقة يجب أن يتم تهيئتها مرة واحدة فقط.

إن دقة العديد من لغات البرمجة ، مثل Algol 68 و C (كما هو موضح في هذا المثال والموحدة القياسية منذ C99) ، هي أنه يمكن الإعلان عن متغيرات نطاق الكتلة ليس فقط داخل جسم الكتلة بل أيضًا ضمن بيان التحكم ، إذا أي. ويماثل ذلك مع معلمات الدالة ، التي يتم تعريفها في تعريف الدالة (قبل بدء تشغيل كتلة الدالة) ، وفي نطاق جسم الوظيفة بالكامل. يُستخدم هذا بشكل أساسي في الحلقات ، التي تحتوي على عبارة التهيئة منفصلة عن حالة الحلقة ، على عكس الحلقات ، وهي لغة شائعة.

يمكن استخدام نطاق الحظر للتظليل. في هذا المثال ، داخل الكتلة ، يمكن أيضًا تسمية المتغير المساعد n ، وتظليل اسم المعلمة ، ولكن هذا يعتبر أسلوبًا سيئًا نظرًا لاحتمالية حدوث أخطاء. علاوة على ذلك ، بعض المتحدرين من C ، مثل Java و C # ، على الرغم من وجود دعم لنطاق الكتلة (حيث يمكن جعل متغير محلي يخرج من النطاق قبل نهاية الدالة) ، لا تسمح لمتغير محلي واحد بإخفاء آخر . في مثل هذه اللغات ، قد يؤدي محاولة إعلان n الثاني إلى حدوث خطأ في بناء الجملة ، وسيتعين إعادة تسمية أحد المتغيرات n.

إذا تم استخدام قالب لتعيين قيمة متغير ، يتطلب نطاق الكتلة أن يتم الإعلان عن المتغير خارج الكتلة. هذا يعقد استخدام البيانات الشرطية مع مهمة واحدة. على سبيل المثال ، في بايثون ، التي لا تستخدم نطاق الحظر ، يمكن للمرء أن يهيئ المتغير على هذا النحو:

if c: a = 'foo' else: a = ''

حيث يمكن الوصول إليها بعد العبارة if.

في Perl ، الذي يحتوي على نطاق الحظر ، يتطلب ذلك بدلاً من ذلك تحديد المتغير قبل الكتلة:

my $a; if (c) { $a = 'foo'; } else { $a = ''; }

غالبًا ما يتم إعادة الكتابة بدلاً من ذلك باستخدام تعيين متعدد ، مع تهيئة المتغير إلى قيمة افتراضية. في بايثون (حيث لا يكون ضروريًا) على هذا النحو:

a = '' if c: a = 'foo'

بينما في Perl سيكون هكذا:

my $a = ''; if (c) { $a = 'foo'; }

في حالة تخصيص متغير واحد ، يكون البديل هو استخدام المشغل الثلاثي لتجنب كتلة ، ولكن هذا ليس ممكنًا بشكل عام لتخصيصات متعددة ومتغيرة ، ويصعب قراءته بالنسبة للمنطق المعقّد.

هذه مشكلة أكثر أهمية في C ، خاصةً لتخصيص السلسلة ، حيث يمكن أن تقوم تهيئة السلسلة تلقائيًا بتخصيص الذاكرة ، بينما يتطلب تعيين سلسلة إلى متغير تم تهيئته بالفعل تخصيص الذاكرة ونسخة سلسلة والتحقق من نجاحها.

sub increment_counter () { my $counter = 0; return sub () { return ++$counter; } }

تسمح بعض اللغات بمفهوم نطاق الكتلة ليتم تطبيقه ، بدرجات متفاوتة ، خارج الدالة. على سبيل المثال ، في مقطع Perl على اليمين ، $ counter هو اسم متغير بنطاق كتلة (بسبب استخدام الكلمة الرئيسية الخاصة بي) ، بينما increment_counter هو اسم دالة بنطاق عالمي. ستزيد كل مكالمة إلى increment_counter من قيمة العداد بالدولار الواحد وتعيد القيمة الجديدة. يمكن أن يؤدي الرمز خارج هذا الحظر إلى الاتصال بـ increment_counter ، ولكن لا يمكنه الحصول على قيمة العداد بالدولار أو تغييره. هذا المصطلح يسمح للمرء بتعريف الإغلاق في perl.

Source: wikipedia.org
 
(1)
Self-harm Scale

Self-harm Scale

 

 
(10)
Burnout Scale

Burnout Scale