优化冗余的else语句

时间:2016-07-07 15:09:52

标签: c# .net

我有这段代码:

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语句,但如果duplicateVoucherChecker(voucher)返回false,我仍然希望完成其他阻止。

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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以外的值,并且您不应该运行相关代码,那么您拥有的代码就和您一样好会希望它是;充其量你可以将重复的代码重构成一个方法。

答案 2 :(得分: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();
}

答案 3 :(得分: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();
}