سؤال

في طلبي، أنا أعمل معاملة يمكن أن تكون في ثلاث دول مختلفة في نهاية التنفيذ:

  • نجاح
  • فشل
  • قيد الانتظار

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

public interface Result() {
     State getState();
     Widget getWidget(); // Success
     Reason getFailureReason(); // Failure
     Callable<Result> getTask(); // Pending
}

الفكرة هي أن العميل يتحقق من حالة كائن النتيجة، ويستدعي الطريقة المناسبة حسب قيمةها، على سبيل المثال

if (result.getState() == State.PENDING) {
    result.getTask();
}

كنت أفكر أنه قد يكون من الأفضل استخدام رد الاتصال بدلا من ذلك، على سبيل المثال

public interface TransactionCallback() {
    void onFailure(Reason reason);
    void onSuccess(Widget widget);
    Delay onPending(Delay previous);
}

أين Delay هو فئة تمثل مؤقت والفترة، والسماح للتطبيق بإعادة جدولة تنفيذ المعاملات. بديل آخر هو إلقاء استثناء من التفاف سبب الفشل (كما يجب أن تفشل إلا في ظروف استثنائية)، والحفاظ على onSuccess و onPending طرق.

لذا فإن سؤالي لذلك هو: هل استخدام رد اتصال نمط مناسب لهذه المشكلة بالذات، أو يمكن لأي شخص أن يقترح شيئا أكثر ملاءمة؟

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

المحلول

لا أعتقد أن هذا هو الاستخدام الجيد لنمط رد الاتصال.

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

تعديل - إعادة تعليق المرجع.

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

نصائح أخرى

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

يجب أن تشمل حجج رد الاتصال كائن مصادر المكالمة. يبدو أنني بخير بالنسبة لي، لكن استخدام رد اتصال قد ينطوي على بعض مشكلات المزامنة - لا يمكنك التأكد من عدم تلقي رد الاتصال. ليس مستحيلا، ولكن قد تحتاج إلى الاعتبار.

بالطبع مع الاقتراع النتيجة، ستحتاج إلى مزامنة على الجانب الآخر. ولكن هذا يبدو أكثر بساطة لمزامنة.

حل رد الاتصال قابل للتمديد بكثير، بينما قد ترغب في نقطة واحدة في تغيير السلوك إلى مكالمة غير متزامنة.

العيب هو رمزك سيكون أقل قابلية للقراءة، خاصة بالنسبة لتلك المبرمج المبتدئين. إذا لم تكن هذه مشكلة لك، فانتقل ...

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