2016-07-07 11 views
2

ich diesen Code-Block haben:Optimierung redundante else-Anweisung

if (duplicateVoucherChecker(voucher)) 
{ 
    DialogResult dialogResult = Messages.Question("Podany bon był już użyty na tej stacji", "Uwaga", false); 

    if (dialogResult == DialogResult.No) 
    { 
     ViewTyped.PaymentValueEditor.Focus(); 
    } 
    else if (dialogResult == DialogResult.Yes) 
    { 
     Vouchers.Add(voucher); 
     Payment.OriginalToPay = Payment.ToPay; 
     ViewTyped.PaymentNumberEditor.Focus(); 
     ViewTyped.ChangeEditor.Focus(); 
    } 
} 
else 
{ 
    Vouchers.Add(voucher); 
    Payment.OriginalToPay = Payment.ToPay; 
    ViewTyped.PaymentNumberEditor.Focus(); 
    ViewTyped.ChangeEditor.Focus(); 
} 

Wie kann ich dies nicht überflüssig machen?

Ich möchte zweite else-Anweisung loswerden, aber ich möchte immer noch diesen else-Block getan werden, wenn duplicateVoucherChecker(voucher)false zurückgibt.

+1

Klingt wie eine bessere Passform für [codereview.se] – Xan

Antwort

2

Sie können eine bool verwenden, um zu verfolgen, ob das Dialogfeld nicht angezeigt wurde oder das Ergebnis war Ja und nur diese Logik, wenn es true ist.

bool dialogNotShownOrYesPicked = true; 
if (duplicateVoucherChecker(voucher)) 
{ 
    DialogResult dialogResult = Messages.Question(
     "Podany bon był już użyty na tej stacji", "Uwaga", 
     false); 
    if (dialogResult == DialogResult.No) 
    { 
     ViewTyped.PaymentValueEditor.Focus(); 
    } 
    if (dialogResult != DialogResult.Yes) 
    { 
     dialogNotShownOrYesPicked = false; 
    }  
} 

if(dialogNotShownOrYesPicked) 
{ 
    Vouchers.Add(voucher); 
    Payment.OriginalToPay = Payment.ToPay; 
    ViewTyped.PaymentNumberEditor.Focus(); 
    ViewTyped.ChangeEditor.Focus(); 
} 
+0

Dies wird den redundanten Code ausgeführt werden, wenn 'DialogResult' ist nicht' No', das ist nicht das, was der ursprüngliche Code funktioniert (das gleiche wie Servy Antwort) –

+0

@ Ahmad Ibrahim Sie haben Recht. Fest. – juharr

+0

Dies wird nicht kompilieren, Ihre wenn "dialogShownAndNoPicked" aber Ihre bool ist "dialogShownAndYesNotPicked" – Mason11987

0

Sie können sinnvolle Variablen zum Speichern eines Status verwenden. Wenn Sie Code wiederholen, der auch darauf hinweist, dass Sie wiederverwendbare Methoden erstellen könnten, z. AddVoucher.

In diesem Fall könnten Sie eine bool Variable als Flag verwenden:

bool duplicateVoucher = duplicateVoucherChecker(voucher); 
bool addVoucher = !duplicateVoucher; 
if(!addVoucher) 
{ 
    DialogResult dialogResult = Messages.Question("Podany bon był już użyty na tej stacji", "Uwaga", false); 
    addVoucher = dialogResult == DialogResult.Yes; 
    if (dialogResult == DialogResult.No)  
    { 
     ViewTyped.PaymentValueEditor.Focus(); 
    } 
} 
if(addVoucher) 
{ 
    Vouchers.Add(voucher); 
    Payment.OriginalToPay = Payment.ToPay; 
    ViewTyped.PaymentNumberEditor.Focus(); 
    ViewTyped.ChangeEditor.Focus(); 
} 
1

Nested if Aussagen sind vom Konzept her die gleichen wie einfach ANDing diese Operationen:

if (duplicateVoucherChecker(voucher) && 
    Messages.Question("Podany bon był już użyty na tej stacji", "Uwaga",false) 
     == DialogResult.No) 
{ 
    ViewTyped.PaymentValueEditor.Focus(); 
} 
else 
{ 
    Vouchers.Add(voucher); 
    Payment.OriginalToPay = Payment.ToPay; 
    ViewTyped.PaymentNumberEditor.Focus(); 
    ViewTyped.ChangeEditor.Focus(); 
} 

Beachten Sie, dass dies den Code läuft in Frage jederzeit Messages.Question gibt einen anderen Wert als No zurück, anstatt nur, wenn es Yes zurückgibt. Wenn Messages.Question einen anderen Wert als Yes oder No zurückgeben kann und Sie den betreffenden Code nicht ausführen sollten, ist der Code, den Sie haben, ungefähr so ​​gut, wie Sie möchten; Im besten Fall könnte man den duplizierten Code in eine Methode umwandeln.

1

Sie müssen nur den Zustand der dialogResult im Falle eines doppelten Gutscheins speichern.

var addVoucher = true; 
if (duplicateVoucherChecker(voucher)) 
{ 
    DialogResult dialogResult = Messages.Question("Podany bon był już użyty na tej stacji", "Uwaga", false); 
    addVoucher = (dialogResult == DialogResult.Yes); 
    if (dialogResult == DialogResult.No) 
    { 
     ViewTyped.PaymentValueEditor.Focus(); 
    } 
} 
if (addVoucher) 
{ 
    Vouchers.Add(voucher); 
    Payment.OriginalToPay = Payment.ToPay; 
    ViewTyped.PaymentNumberEditor.Focus(); 
    ViewTyped.ChangeEditor.Focus(); 
}