如何重构if-else语句?

本文关键字:if-else 语句 重构 何重构 | 更新日期: 2023-09-27 17:52:42

我这里有一个计算器的代码,但是看起来很乱。

这里的逻辑是,当显示等于0时,下一个输入将替换显示,除了0本身。试着看看这个图像。https://www.dropbox.com/s/qtec2r6mcsmjvvt/refactor.jpg?dl=0

    private void btn1_Click(object sender, EventArgs e)
    {
        num = btn1.Text;
        if (isEqual)
        {
            if (operator_pressed == true)
            {
                if (expr.EndsWith("0"))
                {
                    tbScreen.Clear();
                    tbScreen.Text += num;
                    expr = expr.Remove(expr.Length - 1, 1);
                    expr += num;
                }
                else
                {
                    tbScreen.Clear();
                    expr = "";
                    tbScreen.Text += num;
                    expr += num;
                }
            }
            else
            {
                if (tbScreen.Text == "0")
                {
                    tbScreen.Clear();
                    tbScreen.Text += num;
                    expr += num;
                }
                else
                {
                    tbScreen.Clear();
                    expr = "";
                    tbScreen.Text += num;
                    expr += num;
                }
            }
        }
        else {
            if (operator_pressed == true)
            {
                if (expr.EndsWith("0"))
                {
                    tbScreen.Clear();
                    tbScreen.Text += num;
                    expr = expr.Remove(expr.Length - 1, 1);
                    expr += num;
                }
                else
                {
                    tbScreen.Clear();
                    tbScreen.Text += num;
                    expr += num;
                }
            }
            else
            {
                if (tbScreen.Text == "0")
                {
                    tbScreen.Clear();
                    tbScreen.Text += num;
                    expr += num;
                }
                else
                {
                    tbScreen.Text += num;
                    expr += num;
                }
            }
        }
        isEqual = false;
        operator_pressed = false;
        btnEqual.Focus();
    }

希望得到积极的回应!

如何重构if-else语句?

首先,您应该改进变量的命名。这种方法的目的尚不清楚。我只能建议你在创建某种计算器。当您编写代码时,业务价值应该是清晰的,当您要求重构代码时,您应该解释您的代码在业务术语中应该做什么。例如

我想能够键入数学表达式"1 + 5 - 2",然后当我按"等于"按钮,我应该看到计算和结果计算历史中的表达式。这个方法计算表达式结果和更新控件。Operator_pressed是一个被设置的标志当用户按下操作按钮时。等

不知道你的代码的目的,我只能专注于删除重复。但其他开发商的意图仍不甚明朗。所有当前的代码都可以简化为

num = btn1.Text;
if (IsInputStarted)
    tbScreen.Clear();
if (IsExpressionStarted)
    expr = "";
if (operator_pressed && expr.EndsWith("0"))
    expr = expr.Remove(expr.Length - 1, 1);
tbScreen.Text += num;
expr += num;
isEqual = false;
operator_pressed = false;
btnEqual.Focus();

提取两个属性(或者您可以使用方法)。检查是否应该清除屏幕:

private bool IsInputStarted
{
    get { return isEqual || operator_pressed || tbScreen.Text == "0";  }
}
第二步验证是否应该清除当前表达式
private bool IsExpressionStarted
{
    get
    {
        if (!isEqual)
            return false;
        if (operator_pressed)
            return !expr.EndsWith("0");
        return tbScreen.Text != "0";
    }
}

进一步建议 -不要将UI代码(UI控件,UI事件)与业务逻辑混合。这些东西应该单独存在和变化。我建议您创建某种Calculator类,它将负责进行计算和存储表达式。你的代码看起来像

private void EqualsButton_Click(object sender, EventArgs e)
{
   double result = calculator.ExecuteExpression();
   resultsTextBox.Text = result.ToString();    
   historyListBox.Items.Add(calculator.Expression);
}

在你的情况下,我建议为你想要执行的每一个动作考虑一个条件。

何时执行tbScreen.Clear() ?

if (isEqual || operator_pressed || tbScreen.Text == "0" )
    tbScreen.Clear();

何时执行tbScreen += num; ?-总是这样,所以直接写

tbScreen += num;

何时执行expr = "";

if (isEqual && ((operator_pressed && !expr.EndsWith("0")) || (!operator_pressed && tbScreen.Text != "0"))
   expr = "";

等等…

你会得到更短,更容易忽略的代码