如何重构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();
}
希望得到积极的回应!
首先,您应该改进变量的命名。这种方法的目的尚不清楚。我只能建议你在创建某种计算器。当您编写代码时,业务价值应该是清晰的,当您要求重构代码时,您应该解释您的代码在业务术语中应该做什么。例如
我想能够键入数学表达式"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 = "";
等等…
你会得到更短,更容易忽略的代码