ما هي أفضل طريقة للتخلص من المؤسسة الدولية للعلوم المتداخلة في التعليمات البرمجية أثناء التحقق من الشروط؟

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

سؤال

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

وتأخذ التعليمات البرمجية التالية على سبيل المثال:

private void doCallMonitoring(int callId){
    /*This is the part that I want to avoid. Having
      multiple nested ifs. Here's just two conditions
      but as I add more, it will get unmantainable
      very quickly.*/
    if(Options.isActive().booleanValue()){
        callTime = new Timer();
        TimerTask callTimeTask = new TimerTask(){
            public void run(){
                callTimeSeconds++;
        if((callTimeSeconds == Options.getSoftLimit().intValue()) && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)){
                    injectDTMFTone(Phone.getActiveCall());
        }else if((callTimeSeconds >= Options.getHardLimit().intValue()) && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)){
                    injectEndCall();
                }
             }
        };     
        callTime.schedule(callTimeTask, 0,1000);
    }else{
    System.out.println("Service not active");
    }
}

وكيف لي أن تريد أن تعمل هو التحقق من جميع الخيارات مع مكالمة واحدة ومن هناك تحديد لعنة العمل. كيف يمكنني تحقيق مثل هذا التصميم؟

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

المحلول

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

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

public void run() {
    callTimeSeconds++;
    do {
        if (handleInjectDMTFTone())
            break;
        if (handleInjectEndCall())
            break;
    } while(false);

    callTime.schedule(callTimeTask, 0,1000);
}

boolean handleInjectDMTFTone() {
    if ((callTimeSeconds != Options.getSoftLimit().intValue()) ||
        (Phone.getActiveCall().getStatus() != PhoneCall.STATUS_CONNECTED))
        return false;

    injectDTMFTone(Phone.getActiveCall());
    return true;
}

boolean handleInjectEndCall() {

    if ((callTimeSeconds < Options.getHardLimit().intValue()) ||
        (Phone.getActiveCall().getStatus() != PhoneCall.STATUS_CONNECTED))
        return false;

    injectEndCall();
    return true;
}

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

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

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

نصائح أخرى

ويمكنك استخدام "طريقة استخراج" إعادة بيع ديون، وجميع تلك الشيكات إلى شرط واحد "للقراءة".

وانظر هذا هل قليلا طويلة ولكن النقطة هي ليحل محل يبني مثل هذا:

       }else if((callTimeSeconds >= Options.getHardLimit().intValue()) && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)){
                injectEndCall();
            }
         }

لشيء من هذا القبيل:

       ....
       }else if(shouldInjectEndCall() ){
                injectEndCall();
            }
         }
       ...

وتذكر الأشياء لا يكون دولة وقد تستخدم كائن آخر لمساعدتهم على القيام بعملها.

والخيار الآخر هو أن تفعل نوعا من "استبدال مشروطة مع تعدد الأشكال".

وعلى الرغم من أنه يبدو وكأنه مجرد كتابة المزيد من التعليمات البرمجية التي يمكن أن تحل محل كل تلك القواعد مع كائن "المصادقة"، وجميع التصديقات في بعض مجموعة وحلقة من خلالهم.

وشيء من هذا القبيل هذا الرمز الصفر.

  private void doCallMonitoring(int callId){
     // Iterate the valiators and take action if needed. 

      for( Validation validation : validationRules ) { 
          if( validation.succeed() ) { 
              validation.takeAction();
          }
      }
   }

وأنت تنفيذها مثل هذا:

abstract class Validation { 

      public boolean suceed();
      public void takeAction();
}

class InjectDTMFToneValidation extends Validation { 
    public boolean suceed() { 
        return (callTimeSeconds == Options.getSoftLimit().intValue()) 
               && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)
     }
     public void takeAction() { 
         injectDTMFTone(Phone.getActiveCall());
     }
}

class InjectEndCallValidation extends Validation { 
    public boolean suceed() { 
        return (callTimeSeconds >= Options.getHardLimit().intValue()) 
                && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)
     }
     public void takeAction() { 
         injectEndCall();
     }
}

وتثبيتها في النهاية في القائمة:

private List<Validation> validationRules = new ArrayList<Validation>();{
   validationrules.add( new InjectDTMFToneValidation() );
   validationrules.add( new InjectEndCallValidation () );
   ...
   ...
}

والفكرة هنا هي لتحريك منطق فرعية. بطبيعة الحال، سوف تحصل على بنية أفضل وربما <م> suceed و <م> takeAction يمكن الاستعاضة عن طرق أكثر وضوحا أخرى، فإن الهدف هو سحب المصادقة من حيث هو.

ويصبح أكثر تجريدا؟ .. نعم.

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

وجميع تلك الإجابات هي على الأرجح أفضل الإجابات OO. لمرة واحدة سأذهب للإجابة سريعة وقذرة.

وأود حقا أن تبسيط المؤسسة الدولية للعلوم المتداخلة المعقدة مثل ذلك عن طريق عكس لهم.

if(!Options.isActive().booleanValue()) {
    System.out.println("Service not active");
    return;
}
the rest...

وأنا أعرف بعض الناس لا يحبون عوائد منتصف الأسلوب، ولكن عندما كنت التحقق من شروط الدخول التي كانت دائما نمط رهيبة بالنسبة لي، لم يسبق لي ان أعرب عن أسفه استخدامه.

وانها حقا يبسط طريقة طريقة الخاص بك يبدو.

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

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