2016-07-07 145 views
2

我的代码块:优化冗余else语句

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(); 
} 

我怎样才能让这个非冗余?

我想摆脱第二个else语句,但我仍然想要这个else块做,如果duplicateVoucherChecker(voucher)返回false

+1

听起来更适合[codereview.se] – Xan

回答

2

如果对话框未显示或结果为是,您可以使用bool来跟踪,如果它是true,则只执行该逻辑。

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

这将运行冗余代码,如果'DialogResult'不是'No',这是不是原来的代码做(同Servy答案) –

+0

@艾哈迈德·伊布拉辛你是对的。固定。 – juharr

+0

这不会编译,你的如果有“dialogShownAndNoPicked”,但你的布尔是“dialogShownAndYesNotPicked” – Mason11987

0

您可以使用有意义的变量来存储状态。如果你有重复的代码,这也表明你可以创建可重用的方法,f.e. AddVoucher

在这种情况下,你可以使用一个bool变量作为标志:

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

嵌套if语句在概念上一样简单地取与这些操作:

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(); 
} 

注意这需要的代码随时提问Messages.Question返回除No以外的任何值,而不仅仅是返回Yes。如果Messages.Question可以返回除YesNo以外的值,并且您不应该运行有问题的代码(如果有),那么您拥有的代码大概与您希望的一样好;最好你可以将重复的代码重构成一个方法。

1

您只需要在存在重复凭证的情况下存储dialogResult的状态。

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(); 
}