前言
在编写代码实现业务需求过程中,会使用到大量的if...else 判断语句。随业务复杂程度不同,导致判断语句出现多层嵌套、多分支等情况,导致代码可读性变差、增加维护难度。要减少、消除这种复杂的、面条式代码,需要编写代码时多注意编程风格,尽量规避if...else 的复杂化。学习一些代码的优化之道,培养自己的易读、美观代码风格。
方案
1、提前 return ,去除不必要的 else
缺点:对较多的 if...else 没什么大的效果。
示例:
#region 优化前
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
MessageBox.Show("订单号不能为空,请输入订单号。");
this.txtOrderNo.Focus();
}
else
{
// 出处业务逻辑
}
#endregion
#region 优化后
if (string.IsNullOrEmpty(this.txtOrderNo.Text))
{
MessageBox.Show("订单号不能为空,请输入订单号。");
this.txtOrderNo.Focus();
return;
}
// 出处业务逻辑
#endregion
2、使用条件三目运算符
缺点:对只有 一个 if...esle 两个选择时,才会有效果。如果有多个时,阅读理解会更费力。
示例:
#region 优化前
if ("CaiNiao".Equals(templateType, StringComparison.OrdinalIgnoreCase))
{
// 设置按钮可见
this.btnCaiNiao.Visible = true;
}
else
{
// 设置按钮不可见
this.btnCaiNiao.Visible = false;
}
#endregion
#region 优化后
// 设置按钮是否可见
this.btnCaiNiao.Visible = "CaiNiao".Equals(this.templateType, StringComparison.OrdinalIgnoreCase) ? true : false;
#endregion
3、使用 switch
if...else 的使用场景,都能用 switch 代替,在分支选择较多时,尽量使用 switch。
示例:
#region 优化前
if (keyValue==120)
{
// 按 F9 快捷键光标定位到产品输入框
this.txtProductNo.Focus();
}
else if (keyValue==121)
{
// 按 F10 快捷键光标定位到订单输入框
this.txtOrderNo.Focus();
}
else if (keyValue==122)
{
// 按 F11 快捷键审核
this.ApproveOrder();
}
#endregion
#region 优化后
switch (this.CurrentKeyValue)
{
case 120:
// 按 F9 快捷键光标定位到产品输入框
this.txtProductNo.Focus();
break;
case 121:
// 按 F10 快捷键光标定位到订单输入框
this.txtOrderNo.Focus();
break;
case 122:
// 按 F11 快捷键审核
this.ApproveOrder();
break;
default:
break;
}
#endregion
4、合并条件表达式
梳理和归纳逻辑判断,使其变更为更简单易懂的逻辑判断代码。
示例:
#region 优化前
string expressCode ="DOUYIN-YTO"
string templateurl=string.Empty;
string[] splitCode = expressCode..Split('-');
if (splitCode.Length >= 2)
{
if (expressCode.Contains(splitCode[1]))
{
templateurl="http://url.com/test.html"
}
}
#endregion
#region 优化后
string expressCode = "DOUYIN-YTO";
string templateurl = string.Empty;
string[] splitCode = expressCode.Split('-');
if (splitCode.Length >= 2 && expressCode.Contains(splitCode[1]))
{
templateurl = "http://url.com/test.html";
}
#endregion
5、使用枚举
将条件作为枚举的值,这种可以避免使用大量的 if...else 语句。
示例:
#region 优化前
int platformID = 0;
string platformCode ="DOUYIN";
if ("PINDUODUO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 1;
}
else if ("DOUYIN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 2;
}
else if ("KUAISHOU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 3;
}
else if ("SHIPINHAO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 4;
}
else if ("AIKUCUN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 5;
}
else if ("XIAOHONGSHU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 6;
}
#endregion
#region 优化后
// 定义一个数据枚举
public enum Platform
{
PINDUODUO=1,
DOUYIN,
KUAISHOU,
SHIPINHAO,
AIKUCUN,
XIAOHONGSHU
}
Platform platform;
bool result=Enum.TryParse<Platform>("SHIPINHAO", out platform);
int platformID = Convert.ToInt32(platform);
// 需判断SHIPINHAO是否枚举
if (platformID==0)
{
// 异常处理
}
#endregion
6、使用字典
将条件作为字典的键,将处理方法作为字典的键值。这样可以避免使用大量的 if...else 语句。
示例:
#region 优化前
int platformID = 0;
string platformCode ="DOUYIN";
if ("PINDUODUO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 1;
}
else if ("DOUYIN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 2;
}
else if ("KUAISHOU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 3;
}
else if ("SHIPINHAO".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 4;
}
else if ("AIKUCUN".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 5;
}
else if ("XIAOHONGSHU".Equals(platformCode, StringComparison.OrdinalIgnoreCase))
{
platformID = 6;
}
#endregion
#region 优化后
// 定义一个数据字典
Dictionary<string,int> platformDictionary = new Dictionary<string,int>();
platformDictionary.Add("PINDUODUO",1);
platformDictionary.Add("DOUYIN", 2);
platformDictionary.Add("KUAISHOU", 3);
platformDictionary.Add("SHIPINHAO", 4);
platformDictionary.Add("AIKUCUN", 5);
platformDictionary.Add("XIAOHONGSHU", 6);
int platformID = 0;
string platformCode = "DOUYIN";
if (platformDictionary.ContainsKey(platformCode))
{
platformID = platformDictionary[platformCode];
}
#endregion
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。