سؤال

في البرمجة الوظيفية، فإنه غالبا ما يكون هاما لتحسين أي رمز "حلقات" لتكون العودية الذيل. وعادة ما يتم تقسيم ذيل خوارزميات متكررة بين وظيفتين، ولكن - واحد الذي يحدد حالة قاعدة، وآخر التي تطبق حلقة الفعلية. ومن شأن حسن (ولو الأكاديمي) مثلا تكون وظيفة عكسية.

reverse :: [a] -> [a]
reverse = reverse_helper []

reverse_helper :: [a] -> [a] -> [a]
reverse_helper result [] = result
reverse_helper result (x:xs) = reverse_helper (x:result) xs

و"reverse_helper" ليست في الحقيقة جيدة، اسما وصفيا. ومع ذلك، "reverse_recursive_part" هو مجرد حرج.

وماذا اصطلاح التسمية التي ستستخدمها لوظائف مساعد مثل هذا؟

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

المحلول

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

نصائح أخرى

ويمكنك استدعاء أي شيء وظيفة المساعد تريد، وانها لن يهم ما دمت لا تضع وظيفة مساعد في مساحة الاسم "العالمي". ببساطة إضافة "رئيس الوزراء" يبدو أن ممارسة شائعة. :) على سبيل المثال، في هاسكل،

reverse :: [a] -> [a]
reverse = reverse' []
    where reverse' :: [a] -> [a] -> [a]
          reverse' result [] = result
          reverse' result (x:xs) = reverse' (x:result) xs

وأنا دائما استخدام do_، مثل "do_compute" مع "حساب". أجد أنه من وصفي تماما كما هو فعال من جانب وظيفة التي تنفذ العمل، في حين أن "حساب" أن يحصل على استدعاء احتياجات أن يكون له اسم وصفي بسيط للعالم الخارجي.

وأنا أتفق مع ShreevatsaR، إذا كنت لا تجعل وظيفة المساعد المستوى الأعلى (أو ما هو أسوأ، ووضعها في قائمة الصادرات)، من أنه لا يهم ما هو اسمها. أنا أميل إلى استدعاء وظائف المساعد f وg.

reverse :: [a] -> [a]
reverse = f []
  where
    f ys []     = xs
    f ys (x:xs) = f (x:ys) xs

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

ومع ذلك، إذا كنت لا تريد لتصدير بك وظيفة "مساعد" لأنه قد يكون من المفيد للآخرين، وأود أن نسميها:

reverseAccumulator

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

وأنا أتفق أيضا مع ShreevatsaR، في هذا المثال أنا من شأنه أن يجعل المساعد وظيفة خاصة.

لحالات أخرى حيث كنت بحاجة إلى وظائف المساعد لتكون واضحة في وحدة كاملة، ولكن لم تصدر، فإنني أميل إلى وظائف بادئة مع '_'. بالتأكيد، هناك بيان واضح الصادرات ولكن خلال تطوير أميل لتصدير جميع وظائف لتخفيف استكشاف تفاعلي، على سبيل المثال في ghci. في وقت لاحق I إضافة قائمة وظائف تصديرها وunderbar يجعل من السهل تذكر ما إذا كنت أنوي وظيفة لتكون محلية أم لا.

وأنا استخدم aux أو foo_aux (من أجل وظيفة foo الرئيسي)، وعش تعريف حتى انها ليست من الخارج وضوحا.

وإعداد وتنفيذ

وعلى سبيل المثال:

function whateverSetup() { ... }
function whateverExecute() { ... }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top