前言
在编写代码实现业务需求过程中,会使用到大量的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
小结
以上介绍了一些优化 if...else 语句的方法,使代码更加清晰、易于维护和扩展。当然还有其它优化方法(可留言提供你的方法一起进步)。希望本文的一些方法能为你带来帮助。如有不到之处,请多多包涵。