حارس (علوم الحاسوب)
في برمجة الحاسوب ، الشرط هو تعبير منطقي يجب أن تكون قيمته صحيحة لاستمرار تنفيذ البرنامج في الفرع المحدد. وبغض النظر عن لغة البرمجة المستخدمة، فإن عبارة الشرط أو رمز الشرط أو بيان الشرط هو فحص لشروط السلامة المسبقة يُستخدم لتجنب الأخطاء أثناء التنفيذ.
مصطلح "شرط الحماية" هو نمط تصميم برمجي يُنسب إلى كينت بيك، الذي قام بتدوين العديد من ممارسات البرمجة غير المُسماة في أنماط تصميم برمجية مُسماة. يعود استخدام هذه التقنية إلى أوائل الستينيات على الأقل. يُضاف شرط الحماية عادةً في بداية الإجراء، ويُقال إنه "يحمي" باقي الإجراء من خلال معالجة الحالات الشاذة مُسبقًا.
الاستخدامات
ومن الأمثلة النموذجية التحقق من أن المرجع الذي سيتم معالجته ليس فارغًا، مما يتجنب حالات فشل المؤشر الفارغ .
وتشمل الاستخدامات الأخرى استخدام حقل منطقي للتكرار (بحيث تكون الاستدعاءات اللاحقة عبارة عن عمليات لا تفعل شيئًا )، كما هو الحال في نمط التخلص .
public String foo ( String username ) { if ( username == null ) { throw new IllegalArgumentException ( "اسم المستخدم فارغ." ); }// باقي كود الدالة يتبع هنا... }كتابة كود أبسط مع تقليل التداخل
يوفر الحارس مخرجًا مبكرًا من روتين فرعي ، وهو انحراف شائع الاستخدام عن البرمجة الهيكلية ، حيث يزيل مستوى واحدًا من التداخل ويؤدي إلى رمز أكثر تسطحًا: [ 1 ] استبدال if guard { ... }بـ if not guard: return; ....
يُعدّ استخدام عبارات الحماية أسلوبًا لإعادة هيكلة الكود وتحسينه. وبشكل عام، يُفضّل تقليل التداخل، لأنه يُبسّط الكود ويُخفّف العبء المعرفي.
على سبيل المثال، في لغة بايثون :
من typing استورد Any و Optional# لا تحتوي هذه الدالة على شرط حماية def f_noguard ( x : Any ) -> Optional [ int ] if isinstance ( x , int ): # الكود هنا return x + 1 else : return None# دالة مكافئة مع شرط حماية. لاحظ أن معظم الكود أقل إسنادًا، مما يسهل قراءته وفهمه. def f_guard ( x : Any ) -> Optional [ int ] if not isinstance ( x , int ): return None # الكود هنا return x + 1مثال آخر مكتوب بلغة C :
// هذه الدالة لا تحتوي على شرط حماية int funcNoGuard ( int x ) { if ( x >= 0 ) { // الكود هنا return x + 1 ; } else { return 0 ; } }// دالة مكافئة مع شرط حماية int funcGuard ( int x ) { if ( x < 0 ) { return 0 ; }// الكود هنا return x + 1 ; }مصطلحات
يُستخدم هذا المصطلح بمعنى محدد في لغات البرمجة APL و Haskell و Clean و Erlang و occam و Promela و OCaml و Swift ، [ 2 ] و Python بدءًا من الإصدار 3.10، و Scala . في Mathematica ، تُسمى الشروط قيودًا . تُعدّ الشروط مفهومًا أساسيًا في لغة الأوامر المحمية (Guarded Command Language) ، وهي لغة تعتمد على الأساليب الرسمية . يمكن استخدام الشروط لتعزيز مطابقة الأنماط بإمكانية تخطي نمط ما حتى لو تطابقت بنيته. عادةً ما تنطبق هذه التعريفات للشروط على التعبيرات المنطقية في العبارات الشرطية، على الرغم من أنها تُسمى شروطًا .
الرياضيات
في مثال Haskell التالي، تظهر الشروط بين كل زوج من "|" و "=":
دالة f (x) إذا كان x > 0 تساوي 1 ، وإلا تساوي 0.وهذا مشابه للترميز الرياضي المقابل:
في هذه الحالة، تكون الشروط في عبارات "إذا" و "وإلا".
حراس متعددون
إذا وُجدت عدة حراسات متوازية، فعادةً ما تُجرَّب بترتيب تصاعدي، ويُختار فرع أول حارس ينجح. وتكون الحراسات في قائمة الحالات متوازية في الغالب.
مع ذلك، في عبارات بناء القوائم في لغة هاسكل ، تكون الشروط متسلسلة، وإذا فشل أي منها، فلن يتم إنتاج عنصر القائمة. وهذا يُشابه دمج الشروط المنفصلة باستخدام عامل الربط المنطقي "و" ، باستثناء أنه يمكن أن توجد عبارات بناء قوائم أخرى بين الشروط.
تطور
يحتوي التعبير الشرطي البسيط، الموجود أصلاً في لغة CPL منذ عام 1963، على شرط حماية للتعبير الفرعي الأول، وتعبير فرعي آخر يُستخدم في حال تعذر استخدام الأول. إليك بعض الطرق الشائعة لكتابة هذا التعبير:
(x>0) -> 1/x; 0 إذا كانت x>0 ؟ 1/x : 0
إذا كان التعبير الفرعي الثاني يمكن أن يكون تعبيرًا شرطيًا بسيطًا آخر، فيمكننا تقديم المزيد من البدائل لتجربتها قبل الوصول إلى الحل الأخير :
(x>0) -> 1/x; (x<0) -> -1/x; 0
في عام 1966، احتوت لغة ISWIM على صيغة تعبير شرطي بدون حالة انتقال إلزامية، مما فصل الحماية عن مفهوم اختيار أحد الخيارين. في حالة ISWIM، إذا تعذر استخدام أي من البدائل، تكون القيمة غير مُعرَّفة ، أي أنها لا تُحسب أبدًا.
كانت لغة KRC ، وهي "نسخة مصغرة" [ 3 ] من لغة SASL (1976)، واحدة من أوائل لغات البرمجة التي استخدمت مصطلح "الحماية". يمكن أن تحتوي تعريفات وظائفها على عدة بنود، ويتم اختيار البند المراد تطبيقه بناءً على الحماية التي تلي كل بند:
القوات المسلحة n = 1 , n = 0 = n * القوات المسلحة البوروندية ( n - 1 ), n > 0يعود استخدام عبارات الحماية، ومصطلح "عبارة الحماية"، على الأقل إلى ممارسة لغة سمول توك في التسعينيات، كما قام كينت بيك بتقنينها . [ 1 ]
في عام 1996، اعتمدت لغة Dyalog APL أسلوبًا وظيفيًا بحتًا بديلًا، حيث تُعدّ الحماية هي بنية التحكم الوحيدة. [ 4 ] يحسب هذا المثال، في لغة APL، زوجية العدد المُدخل:
التكافؤ ← { 2 ∣ ⍵ : 'فردي' 'زوجي' }واقي النمط
إضافةً إلى الشرط المرفق بنمط، يُمكن أن يُشير مصطلح "شرط النمط" إلى استخدام مطابقة الأنماط في سياق الشرط. في الواقع، تُعتبر مطابقة النمط بمثابة "اجتياز". وقد طُرح هذا المعنى في اقتراحٍ للغة هاسكل من قِبل سيمون بيتون جونز بعنوان "نظرة جديدة على الشروط" في أبريل 1997، وتم استخدامه في تنفيذ الاقتراح. تُتيح هذه الميزة إمكانية استخدام الأنماط في شروط النمط.
مثال في لغة هاسكل الموسعة:
clunky env var1 var2 | Just val1 <- lookup env var1 , Just val2 <- lookup env var2 = val1 + val2 -- ...معادلات أخرى لـ clunky...يُقرأ هذا كالتالي: "يُعدّ هذا الأسلوب غير عملي بالنسبة لبيئة ومتغيرين، ففي حال أسفرت عمليات البحث عن المتغيرات من البيئة عن قيم ، يكون مجموع القيم هو..." كما هو الحال في تراكيب القوائم ، تكون الشروط متسلسلة، وإذا فشل أي منها، فلن يتم تنفيذ الفرع.
انظر أيضاً
- التأكيد
- لغة الأوامر المحمية ، وهي لغة برمجة تعتمد على الشروط غير الحتمية
- نظام تعليق محمي
- قوس إيفرسون
- الشرط المنطقي
- عبارة التبديل
مراجع
- 1 2 بيك، كينت (1997). "شرط الحماية". أنماط أفضل ممارسات لغة سمول توك، ص 178-179 .
- ↑ كوك، نيت. "الحماية والتأجيل" . NSHipster . تم الاسترجاع في 26 فبراير 2016 .
- ↑ تيرنر، د.أ. "بعض تاريخ لغات البرمجة الوظيفية" (PDF) .
- ↑ سكولز، جون. "الوظائف المباشرة في لغة البرمجة APL الديناميكية" (PDF) .
روابط خارجية
- الحارس في قاموس الحوسبة المجاني على الإنترنت - FOLDOC ، دينيس هاو (محرر).
- بند الحماية ، ويكي ويكي ويب
- تقرير هاسكل 98 ، الفصل 3: التعبيرات .
- كتاب ماثيماتيكا، القسم 2.3.5 وضع قيود على الأنماط
- دليل مستخدم نظام تجميع هاسكل غلاسكو الرائع ، الإصدار 6.4، القسم 7.3.2. حراس الأنماط
- البنى الشرطية
- مصطلحات الأساليب الرسمية
