كيف تتوقف عن كتابة رمز سلسلة؟
-
28-09-2019 - |
سؤال
فمثلا...
if ( /* Condition */ ) {
if ( /* Condition */ ) {
if ( /* Condition */ ) {
// Superb!
} else {
// Error 3
}
} else {
// Error 2
}
} else {
// Error 1
}
هل تعرف كيف تتجنب هذا؟ شكرًا لك!
المحلول
إذا كانت هذه وظيفة مكتبة ، throw
قد يكون الإجراء المناسب.
if (!condition1) {
throw "Condition 1 failed.";
}
if (!condition2) {
throw "Condition 2 failed.";
}
if (!condition3) {
throw "Condition 3 failed.";
}
// Superb!
قد تكون الإجراءات المقبولة الأخرى:
- عودة
0
,null
, ، أوundefined
. - عرض خطأ للمستخدم والعودة.
سيكون عليك تحديد إجراء الفشل المناسب لحالة الاستخدام الخاصة بك.
نصائح أخرى
يبدو أن لديك 3 شروط للتحقق و 4 إجراءات (3 أخطاء مختلفة + 1 نجاح). لسوء الحظ في الحالة العامة ، سيتطلب 3 شيكات مشروطة و 4 إجراءات. أعتقد أنه يمكن تنظيف الكود قليلاً باستخدام الهيكل التالي رغم ذلك
if (! /* condition 1 */ ) {
// Error 1
} else if (! /* condition 2 */ ) {
// Error 2
} else if (! /* condition 3 */ ) {
// Error 3
} else {
// superb
}
حسنًا ، يمكنك استخدام الاستثناءات أو الفواصل داخل كتلة أو وظائف متعددة. غالبًا ما يتطلب هذا قلب شروطك للحصول على الرمز المطالب بالطريقة الصحيحة.
do {
if (! /* Condition 1 */ ) {
// Error 1
break;
}
if (! /* Condition 2 */ ) {
// Error 2
break;
}
if (! /* Condition 3 */ ) {
// Error 3
break;
}
// Superb!
} while (false);
الحلقة (FALSE) التي تنفذها (FALSE) هي وسيلة لصنع كتلة يمكنك الخروج منها باللغات التي لن تتسامح مع كتلة مجهولة. يمكن أن يكون بسهولة وظيفة واستخدام الإرجاع ، أو تجربة تجرب مع استثناءات.
هل تفضل هذا؟
if ( /* Condition 1*/ && /* Condition 2*/ && /* Condition 3 */) {
// Superb!
}
else if (! /* Condition 1*/){
// Error 1
}
else if (! /* Condition 2*/){
// Error 2
}
else if (! /* Condition 3*/){
// Error 3
}
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}
if (! condition 2){
Error 2
throw someSortOfOtherException
}
if (! condition 3){
Error 3
throw another Exception
}
// Success!
اعتمادًا على الموقف ، قد يفضل الكود الخاص بك. ربما ترغب في التقاط هذه الاستثناءات في مكان ما على سبيل المثال.
if (!condition1)
// Error 1 (and exit scope if necessary)
if (!condition2)
// Error 2 (and exit scope if necessary)
if (!condition3)
// Error 3 (and exit scope if necessary)
// Superb!
نعم؛ يمكنك تكوينك معًا if
البيانات في عبارة مركب واحد باستخدام المشغل والمشغل ، والتعامل مع ظروف الخطأ في كتلة واحدة. اعتمادًا على احتياجات معالجة الأخطاء ، قد تحتاج مرة أخرى إلى الحصول على متعددة if
S للتأكد من أنك تتعامل بشكل صحيح مع الخطأ (يعتمد ذلك على دقة التعامل مع الأخطاء ، حقًا).
لخفة الظل:
if (CondA && CondB && CondC)
{
// Execute success
}
else
{
if (!CondA)
// Do error A
else if (!CondB)
// Do error B
else if (!CondC)
// Do error C
}
}
هناك بعض الطرق ، والأبسط هو ببساطة كسر بعض الوظائف وتجريد الطبقات المختلفة (يجب أن يتم ذلك على أي حال إذا وجدت نفسك عميقًا.)
if ( /* Condition */ ) {
value = aFunctionSaysWhat();
} else {
// value = Error 1
}
....
value aFunctionSaysWhat(){
if ( /* Condition */ ) {
return aSecondFunctionHere();
} else {
// return Error 2
}
}
الفرضية الأساسية هي أن الوظيفة يجب أن تعيش على طبقة واحدة من التجريد إن أمكن ، وأن تفعل شيئًا واحدًا.
الاحتمال التالي هو تسطيح كل شيء ، وهذا متفوق على الطريقة المتداخلة الأولية ، ولكن في الأساس لديه تعقيد مماثل. قد يكون أنظف بكثير من النهج الوظيفي إذا كان لديك بعض الخيارات فقط ولا تخطط لإضافة المزيد.
if(ErrorCondition1){
//Error 1
}else if(ErrorCondition2){
//Error 2
}else if(ErrorCondition3){
//Error 3
}else{
//Superb
}
أخيرًا ، يمكنك تخزين تجزئة أو خريطة مع الإجابات المطلوبة وإزالة IF تمامًا ، تعتمد القدرة على تنفيذ هذا على قدرتك على تجزئة بعض النتائج:
Results = {'Result1':'Error1', 'Result2':'Error2', 'Result3':'Error3', 'Success':'Superb'}
return Results[ConditionHash(Condition)];