我怎样才能重构我的if-else语句?

时间:2015-06-02 08:56:20

标签: c#

好吧,我的计算器里面有一个代码,但它似乎很乱。

这里的逻辑是当显示器等于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();
    }

希望得到积极回应!

2 个答案:

答案 0 :(得分:2)

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

  

我希望能够输入数学表达式“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);
}

答案 1 :(得分:1)

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

您希望何时执行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 = "";

依旧......

你会更短,更容易忽视代码