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

上篇我们讲到更合理的定义变量名,以及变量类型,今天我们讲代码工整很重要的一个环节,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逻辑,可以考虑用三元表达式代替

 

 

posted @   鱼丸粗面一碗  阅读(617)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示