如何写出优雅漂亮的c#代码_ifelse(二)

上篇我们讲到更合理的定义变量名,以及变量类型,今天我们讲代码工整很重要的一个环节,if else

例:

检查年龄

写一个方法,参数为int类型,如果大于18岁则输出已成年,否则输出未成年。

		private void CheckAge(int age)
        {
            if (age > 18)
            {
                Console.WriteLine("已成年");
            }
            else
            {
                Console.WriteLine("未成年");
            }
        } 

这是常规的做法,这个需求很简单,这么做也无可厚非,但是我更推荐另一种做法

        private void CheckAge(int age)
        {
            if (age > 18)
            {
                Console.WriteLine("已成年");
                return;
            }
            Console.WriteLine("未成年");
        } 

这样做的好处是什么呢,减少嵌套。如果大于18岁肯定已成年,我们无需在考虑else中的内容。所以直接ruturn,Console.WriteLine(“未成年”)也不必嵌套在else中,本例比较简单。两种写法可能区别并不大,接下来我们修改下需求。

如果年龄小于三岁,在家玩,否则需要上幼儿园
大于三岁上幼儿园,,如果年龄为三岁则
每天上午12点之前做游戏
如果12点之后,14点之前,则睡午觉。
剩下的时间学画画

这个代码并不难,学过编程的人都能轻易写出来。但是经验不足的新人很容易将代码写成这样

        private void CheckAge(int age)
        {
            if (age < 3)
            {
                //在家玩
            }
            else
            {
                //上幼儿园
                if (age == 3)
                {
                    if (DateTime.Now.Hour < 12)
                    {
                        //做游戏
                    }
                    else
                    {
                        if (DateTime.Now.Hour > 12 &&         
                            DateTime.Now.Hour < 14)
                        {
                            //睡觉
                        }
                        else
                        {
                            //学画画
                        }
                    }
                }
            }
        }    

恐怖的缩进,我们看到这个代码居然有四层嵌套,如果逻辑在复杂些,按照这个逻辑写10层嵌套都是做的到的。

易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else
易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else
易读的代码请不要超过两层嵌套,能用if搞定,尽量不要用else

接下来我们对这段代码进行优化

		public void CheckAge(int age)
        {
            //年龄小于三岁在家玩就够了,所以我们没有必要判断其他的直接 
            //return出去就可以了
            if (age <= 3)
            {
                //在家玩
                return;
                //因为这里return了,所以不需要else
            }

            //三岁,12点之前在做游戏,没有其他,不需要else直接return
            if (age == 3 && DateTime.Now.Hour < 12)
            {
                //做游戏
                return;
            }
            //三岁,12点之后14点钱在睡午觉,没有其他
            if (age == 3 && DateTime.Now.Hour > 12 && 
                DateTime.Now.Hour < 14)
            {
                //睡觉
                return;
            }
            //三岁,12点之后14点钱在学画画,没有其他
            if (age == 3 && DateTime.Now.Hour > 14)
            {
                //睡觉
                return;
            }
        }

好的,这是我们优化后的结果。原本的四层嵌套变成了现在单层if,代码量也减少了很多,哪个易读,相信大家都看的出来。

三元表达式

我们重新回到第一个例子

 		private void CheckAge(int age)
        {
            if (age > 18)
            {
                Console.WriteLine("已成年");
                return;
            }
            Console.WriteLine("未成年");
        } 

根据上面的经验我们已经了解了,如果杜绝多余的else,可是我们还有更完美的做法,三元表达式。

		public void CheckAge(int age)
        {
            string txt = age > 18 ? "已成年" : "未成年";
            Console.WriteLine(txt);
        }

代码变得更加简单易读,推荐:情况简单,逻辑不复杂时用三元表达式代替if else

接下来我们再举几个例子

例:

用户登录:

输入用户名密码,如果不正确,抛出相应的提示。
如果正确,判断用户状态是否可用
如果不可用,判断是否锁定,是否封禁,是否密码过期。
如果可用,判断用户权限。
如果是游客,则访问游客界面
如过是普通用户,则访问普通用户界面
如果是管理员,则访问管理员界面

 		class User
        {
            public enum Role
            {
                Guest,
                NormalUser,
                Admin
            }
            public enum State
            {
                Lock,
                PasswordExpired,
                Killed
            }
            public Role role { get; set; }
            public bool Enable { get; set; }

            public State state { get; set; }
        }
        public void Login()
        {
            User user = GetUser();
            if (user == null)
            {
                //用户名或密码不正确
            }
            else
            {
                if (user.Enable)
                {
                    switch (user.state)
                    {
                        case User.State.Killed:
                            //封号
                            break;
                        case User.State.Lock:
                            //锁定
                            break;
                        case User.State.PasswordExpired:
                            //密码过期
                            break;
                        default:
                            break;
                    }
                }
                else
                {
                    switch (user.role)
                    {
                        case User.Role.Admin:
                            //管理员页面
                            break;
                        case User.Role.Guest:
                            //游客界面
                            break;
                        case User.Role.NormalUser:
                            //普通用户界面
                            break;
                        default:
                            break;
                    }
                }
            }
        }
        /// <summary>
        /// 查询登录用户
        /// </summary>
        /// <returns>如果用户名密码不正确则返回空</returns>
        private User GetUser()
        {
            return new User();
        }

优化后主方法所有嵌套全部消除,40余行代码变为30几行,可读性明显提升。

		public void Login()
        {
            User user = GetUser();
            if (user == null)
            {
                //用户名或密码不正确
                return;
            }
            if (user.Enable && user.state == User.State.Killed)
            {
                //封号
                return;
            }
            if (user.Enable && user.state == User.State.Lock)
            {
                //锁定
                return;
            }
            if (user.Enable && user.state == User.State.PasswordExpired)
            {
                //密码过期
                return;
            }
            if (!user.Enable && user.role == User.Role.Admin)
            {
                //管理员页面
                return;
            }
            if (!user.Enable && user.role == User.Role.Guest)
            {
                //游客界面
                return;
            }
            if (!user.Enable && user.role == User.Role.NormalUser)
            {
                //普通用户界面
                return;
            }
        }

模拟开车

检查外观,如果正常则检查内部。
内检无问题,则启动引擎。
引擎启动正常,则挂挡。
挂挡成功,踩油门开车。
各项检查不通过均要给出对应提示。

 		private void Drive()
        {
            if (CheckExterior())
            {
                if (CheckInside())
                {
                    if (PutIntoGear())
                    {
                        Throttle();
                    }
                    else
                    {
                        //变速箱损坏,无法挂挡
                    }
                }
                else
                {
                    //油量不足
                }
            }
            else
            {
                //左前轮胎气压不足
            }
        }

优化后

	    private void Drive()
        {
            if (!CheckExterior())
            {
                //左前轮胎气压不足
                return;
            }
            if (!CheckInside())
            {
                //油量不足
                return;
            }
            if (!PutIntoGear())
            {
                //变速箱损坏,无法挂挡
                return;
            }
            Throttle();
        }

总结下,if else一定注意避免嵌套,if + return能搞定的事,不要用else,如嵌套超过两层就要考虑如何优化,简单的if else逻辑,可以考虑用三元表达式代替

猜你喜欢

转载自blog.csdn.net/qq_32777817/article/details/86483096