اصطياد العقود الآجلة المتدلية أو غير المستخدمة في سكالا

1

مشكلة شائعة في رمز Scala لدينا هي أن المكالمة التي ترجع Future[T] لن ننتظر (نستخدم عادةً مكتبة scala-async لأن الكثير منا على دراية بـ async / ينتظر من C #) أو يستخدم على الإطلاق ؛ يتم التخلص منه ببساطة. هل هناك أي طريقة للحصول على تحذير أم أن هناك أداة لتحليل الكود تابعة لجهة خارجية ستلتقط هذا؟

من الواضح أن هذا ينطبق بشكل أساسي على العقود الآجلة "ذات التأثير الجانبي" ، مثل تخزين كائن في قاعدة بيانات. أدرك أنه يمكن حل ذلك باستخدام نهج أكثر وظيفية بحتة مثل IO Monad ، لكن لنفترض أننا قد انتهينا من استخدام المستقبل المدمج من أجل الجدل.

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

storeObject()
commitToBroker()

// instead of...
await(storeObject())
await(commitToBroker())

// or...
storeObject().flatMap(_ => commitToBroker())

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

1 إجابة

0

لست على دراية بالمكوِّن الإضافي للمترجم الذي سيقوم بذلك ، لكن لدي بعض التوصيات:

أولاً ، استخدم علامة scalac -Ywarn-unused بالتزامن مع -Xfatal-warnings . بهذه الطريقة في أي وقت تقوم فيه بإرجاع المستقبل ، أو أي قيمة أخرى ، لم يتم استهلاكها ستحصل على خطأ.

ثانيًا ، تجنب إنشاء العقود الآجلة بالطرق المضمنة وبدلاً من ذلك قم بإنشاء المنشئ / المصنع الخاص بك الذي ينشئ العقود الآجلة بسياسة تسجيل افتراضية.

ثالثًا ، لإنفاذ النقطة الثانية ، إنشاء قواعد سكلاست التي تتحقق من وتمنع Future {...} ، Future.successful أو Future.failure .

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام