سؤال

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

اللغة الوحيدة التي رأيت فيها مفهومًا يسمى يحمي هو إرلانج ، لكن هذا لا يشبه عن بعد الرمز الذي وجدته. ما هي اللغات الأخرى التي يوجد بها مثل هذا المفهوم الذي قد يكون مؤلف رمز C ++ قد ألمح إليه؟

هل كانت مفيدة؟

المحلول

بالنسبة لي يبدو أنه كان يستخدم Raii.
يتم استخدام مُنشئ الفئة/المدمر للتعامل بشكل متكافئ من أشكال تخصيص/إصدار الموارد في سياق آمن استثناء (ما سيطلق عليه مبرمجي Java أخيرًا {} لأن المدمر هو guranteed ليتم استدعاؤه).

هذا هو المصطلح C ++ شائع جدًا وهو على نطاق واسع في C ++ الحديثة.

هل بدا الرمز هكذا:

void Plop()
{
     Guard   guard(lock);
     // Do lots of stuff
}

هنا يقوم الحارس بإغلاق القفل في المُنشئ ويفتح القفل في المدمر.

نصائح أخرى

يستخدم مصطلح "الحارس" في عدة لغات وظيفية الطريقة التي يتم استخدامها في إرلانج ، ولكن يبدو أن هذا الاستخدام لا يناسب وصفك. دون رؤية رمز C ++ ، من الصعب معرفة ما هو المقصود به.

سيكون تخمين وصفك هو أنه ينفذ شيئًا مثل هاسكل bracket, ، الأمر الذي يضمن أساسًا أن يتم إصدار بعض الموارد في حالة خروج الوظيفة ملفوفة ، حتى لو حدث ذلك باستثناء. في بيثون يمكن للمرء استخدامه finally لهذا ، في C ++ عادة ما يكون لديك رمز التنظيف في مدمرة كائن على المكدس.

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

f x
 | x < 0 = -x
 | otherwise = x

هذا يعادل وظيفة القيمة المطلقة: نفي رقمًا إذا كان سلبيًا إنتاج نظيره الإيجابي ؛ خلاف ذلك ، أعد نفس القيمة التي تم تمريرها. هناك حارسان هنا: x < 0, وهذا صحيح عندما يكون x أقل من الصفر ، و otherwise, ، وهذا صحيح دائما.

Haskell's Control.Monad Module guard:

guard :: MonadPlus m => Bool -> m ()
guard b هو return () لو b هو True, ، و mzero لو b هو False.

على سبيل المثال ، لحساب ثلاثية فيثاغورات حيث لا تزيد كل ساق من 25

triples = do
  a <- [1..25]
  b <- [a..25]
  c <- [b..25]
  guard (p a b c)
  return (a,b,c)
  where
    p a b c = a*a + b*b == c*c

للحصول على شرح لما يحدث ، انظر منشور مدونتي أوضح فاصلة منقوطة قابلة للبرمجة.

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

for (int i = 0; i < N; ++i)
  /* stuff */

هنا، i < N هو الحارس.

من الصعب الإجابة على سؤالك بشكل أكثر شمولية دون مزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top