您的位置:首页 > Web前端

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

2019-01-14 22:10 435 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: