أفضل طريقة للعودة إلى حالة العلم و رسالة من طريقة في جافا

StackOverflow https://stackoverflow.com/questions/356248

  •  21-08-2019
  •  | 
  •  

سؤال

لدي مخادعة بسيطة السيناريو و أريد الحل بسيط, ولكن ليس من الواضح الذي هو "الراجح" أو "معظم جافا".

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

  • عودة منطقية و تمر في بـ stringbuilder لجمع الرسالة.هذا هو الأقرب إلى ج-نمط طريقة للقيام بذلك.
  • رمي استثناء بدلا من العودة كاذبة ، وتشمل الرسالة.أنا لا أحب هذا لأن الفشل ليس استثنائيا.
  • إنشاء فئة جديدة تسمى AuthenticationStatus مع منطقية و السلسلة.هذا يبدو مبالغة واحدة صغيرة الطريقة.
  • تخزين الرسالة في متغير عضو.هذا من شأنه أن أعرض حالة تعارض محتمل, و أنا لا أحب ذلك يعني بعض الدول التي ليست هناك حقا.

أي اقتراحات أخرى ؟

تحرير غاب هذا الخيار

  • العودة فارغة من أجل النجاح - هذا غير آمنة ؟

تحرير الحل:

ذهبت معظم OO الحل خلق صغير AuthenticationResult الدرجة.أنا لن أفعل هذا في أي لغة أخرى, ولكن أنا أحب ذلك في جاوة.أنا أيضا أحب اقتراح من إعادة String[] بما انها تحب null العودة ولكن أكثر أمانا.ميزة واحدة من نتيجة الصف هو أنه يمكن أن يكون رسالة النجاح مع مزيد من التفاصيل إذا لزم الأمر.

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

المحلول

العودة كائن صغير مع منطقية العلم و السلسلة الداخل هو على الأرجح الأكثر OO-مثل طريقة للقيام بذلك, على الرغم من أنني أتفق هذا يبدو مبالغة بسيطة مثل هذه الحالة.

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

نصائح أخرى

هل يمكن استخدام الاستثناءات....

try {
    AuthenticateMethod();
} catch (AuthenticateError ae) {         
    // Display ae.getMessage() to user..
    System.out.println(ae.getMessage());
    //ae.printStackTrace();    
}

ثم إذا حدث خطأ في AuthenticateMethod إرسال جديد AuthenticateError (يمتد استثناء)

تجنب العودة "الحارس القيمة" لا سيما null.سوف ينتهي بك الأمر مع تعليمات البرمجة الأساسية حيث أساليب لا يمكن فهمها من قبل المتصل دون قراءة التنفيذ.في حالة null, المتصلين قد ينتهي مع NullPointerExceptions إذا نسوا (أو لا يعلمون) أن الأسلوب قد ترجع فارغة.

Tuple اقتراح من Bas Leijdekkers هو فكرة جيدة أن تستخدم في كل وقت إذا كنت ترغب في العودة أكثر من قيمة واحدة من طريقة.واحد نستخدمها P2<A, B> من وظيفية جافا المكتبة.هذا النوع من نوع مشتركة بين اتحاد اثنين من الأنواع الأخرى (أنه يحتوي على قيمة واحدة من كل نوع).

رمي استثناءات من أجل السيطرة على تدفق قليلا من رمز رائحة, ولكن فحص الاستثناءات هي طريقة واحدة للحصول على أكثر من نوع واحد من قيمة من طريقة.أخرى نظيفة الاحتمالات موجودة على الرغم من.

  1. يمكن أن يكون Option<T> فئة مجردة مع اثنين من الفئات الفرعية Some<T> و None<T>.هذا هو قليلا مثل نوع آمن بديل null, وسيلة جيدة لتنفيذ جزئي المهام (المهام التي العائد قيمة لا يعرف بعض الحجج).على وظيفية جافا مكتبة كامل المواصفات Option الفئة التي تطبق Iterable<T>, لذلك يمكنك أن تفعل شيئا مثل هذا:

    public Option<String> authenticate(String arg) {
       if (success(arg))
          return Option.some("Just an example");
       else
          return Option.none();
    }
    
    ...
    
    for(String s : authenticate(secret)) {
       privilegedMethod();
    }
    
  2. وبدلا من ذلك يمكنك استخدام منفصلة اتحاد نوعين ، Either<L, R> فئة.أنه يحتوي على قيمة واحدة وهي إما من نوع L أو R.هذه الفئة تنفذ Iterable<T> لكل من L و R, لذلك يمكنك أن تفعل شيئا مثل هذا:

    public Either<Fail, String> authenticate(String arg) {
       if (success(arg))
          return Either.right("Just an example");
       else
          return Either.left(Fail.authenticationFailure());
    }
    
    ...
    
    Either<Fail, String> auth = authenticate(secret);
    for(String s : auth.rightProjection()) {
       privilegedMethod();
    }
    for(Fail f : auth.leftProjection()) {
       System.out.println("FAIL");
    }
    

كل من هذه الفئات ، P2, Option, ، Either هي مفيدة في مجموعة متنوعة من الحالات.

المزيد من الخيارات:

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

بسيطة tuple سبيل المثال ، التنفيذ الفعلي قد تحتاج إلى مزيد من:

class Tuple<L, R> {

    public final L left;
    public final R right;

    public Tuple( L left, R right) {
        this.left = left;
        this.right = right;
    }
}

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

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

فقط لأنه فشل في المصادقة شائعا لا يعني أنها ليست استثنائية.

في رأيي فشل المصادقة هي ملصق الطفل استخدام حالة التحقق من الاستثناءات.(حسنا...ربما الملف غير الوجود الكنسي في حالة استخدام, ولكن فشل مصادقة الوثيقة رقم 2.)

يمكنني استخدام "صغيرة من الفئة" نفسي عادة مع الطبقة الداخلية.أنا لا أحب استخدام الحجج لجمع الرسائل.

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

هل هذا هو الأسلوب الوحيد حيث لديك مثل هذا الشرط ؟ إذا ليس فقط توليد استجابة عامة فئة مع isSuccessful العلم رسالة السلسلة ، واستخدام ذلك في كل مكان.

أو هل يمكن أن يكون مجرد طريقة العودة فارغة لإظهار النجاح (لا جميلة و لا يسمح العودة النجاح و رسالة).

يجب أن تذهب على الأرجح عن شيء مثل :


class SomeClass {
public int authenticate (Client client) {
//returns 0 if success otherwise one value per possible failure
}
public String getAuthenticationResultMessage (int authenticateResult) {}
//returns message associated to authenticateResult
}

مع هذا "التصميم" ، يمكنك أن تسأل عن الرسالة فقط عند فشل المصادقة (والتي آمل هو السيناريو الذي يحدث 99,99% من الوقت؛))

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

هذا يبدو وكأنه لغة مشتركة في لغات البرمجة الأخرى, ولكن أنا لا يمكن معرفة أي واحد ( ج أعتقد كما قرأت في السؤال ) .

تقريبا نفس السؤال هو نشر هنا و هنا

محاولة العودة قيمتين من وظيفة واحدة, قد تكون مضللة.ولكن كما أثبتت محاولات من القيام بذلك ، قد يكون من المفيد جدا أيضا.

بالتأكيد إنشاء فئة صغيرة مع النتائج يجب أن يكون الطريق الصحيح للمضي قدما إذا كان هذا هو تدفق مشترك في التطبيق كما نشر من قبل.

هنا هو اقتباس عن العودة قيمتين من وظيفة:

كمسألة أسلوب البرمجة, هذه الفكرة ليست جذابة في وجوه المنحى لغة البرمجة.العودة الكائنات لتمثيل وحساب النتائج هو على لغة بإرجاع قيم متعددة.بعض أقترح عليك أن لا تعلن الطبقات لا علاقة لها بالقيم ولكن لا ينبغي أن لا علاقة لها القيم التي يتم إرجاعها من أسلوب واحد.

لقد وجدت أنه في ميزة طلب جافا تسمح عودة متعددة القيم

أن ننظر في "التقييم" القسم بتاريخ:2005-05-06 09:40:08

المصادقة الناجحة ينبغي أن تكون الحالة "العادية" ، لذلك فشل مصادقة هو حالة استثنائية.

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

if (authenticate()) {
  // normal behaviour...
}
else {
  // error case...
}

يمكنك عن طريق الخطأ استدعاء الأسلوب تجاهل قيمة الإرجاع.إن "السلوك العادي" رمز ثم أعدموا دون المصادقة الناجحة:

authenticate();
// normal behaviour...

إذا كنت تستخدم استثناءات لا يمكن أن يحدث.إذا قررت عدم استخدام الاستثناءات على الأقل اسم الطريقة حتى أنه من الواضح أنه يعود الدولة ، هـ.ز.:

if (isAuthenticated()) {
//...
}

هناك الكثير من إجابات جيدة لذلك أنا هنا سوف يبقيه قصيرة.

أعتقد أن فشل المستخدم لمصادقة يمكن أن تعتبر صالحة حالة فحص استثناء.إذا كان لديك أسلوب البرمجة يفضل التعامل مع الاستثناءات ثم لن يكون هناك أي سبب لعدم القيام بذلك.فإنه يزيل أيضا "كيفية إرجاع قيم متعددة من طريقة, طريقة بلدي لا شيء واحد المصادقة المستخدم"

إذا كنت تنوي العودة قيم متعددة ثم قضاء 10 دقائق إنشاء عامة PairTuple (يمكن أيضا أن تكون أكثر من زوج TripleTuple, لن أكرر المثال المذكور أعلاه) والعودة القيم الخاصة بك بهذه الطريقة.أنا أكره صغيرة dto نمط الكائنات للعودة مختلفة متعددة القيم أنها مجرد فوضى المكان.

ماذا عن عودة سلسلة.فارغة أو فارغة للنجاح.رسالة خطأ في حالة الفشل.أبسط من شأنها العمل.ولكن ليس متأكدا مما إذا كان يقرأ جيدا.

عودة الكائن.انها تسمح لك لوضع وظائف إضافية في الصف إذا كنت في حاجة إليها.قصيرة الكائنات في جافا سريعة لخلق وجمع.

وأود أن اختيار استثناء الخيار في المقام الأول.

ولكن في المركز الثاني ، وأود أن تفضل ج-نمط الأسلوب:

public boolean authenticate(Client client, final StringBuilder sb) {
    if (sb == null)
        throw new IllegalArgumentException();
    if (isOK()) {
        sb.append("info message");
        return true;
    } else {
        sb.append("error message");
        return false;
    }
}

هذا ليس غريب و يتم ذلك في العديد من الأماكن في هذا الإطار.

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

public static void main(String[] args)
{
    Object[] result = methodReturningStatus();
    if(!(Boolean)result[0])
        System.out.println("Method return: "+ result[1]);
}

static Object[] methodReturningStatus()
{
    Object[] result = new Object[2];

    result[0] = false;
    result[1] = "Error happened";

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