好吧,我的计算器里面有一个代码,但它似乎很乱。
这里的逻辑是当显示器等于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();
}
希望得到积极回应!
答案 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 = "";
依旧......
你会更短,更容易忽视代码