代码重构及编码习惯



关于本周培训(2013.12)


重点改下代码不规范,


1.把正常的情况放在if后面而不是else后面。这样流程会清晰很多。
易读的代码应该如下:
if(A==B)
{
.....
}else
{
string msg = "用户输入不正确。";
}


2.用了if就要考虑要不要用else,如果不用最好注释。
if(1=1)
{
//laskjfalksjd
...
}
else
{
//rtyertyerty
...
}






我们的项目有这样的代码
不好的代码如下:
if(A==1)
{
...
}


if(B==2)
{
...
}


if(A==3)
{
...
}


应该改成 
if(Dict==1)
{
...
}
else
if(Dict==2)
{
...
}
else
if(Dict==3)
{
...
}


如:Dict_
case 






3.考虑是否要交换if和else的内容。
如:判断是否是管理员,如果是管理员,可以接着执行,不是管理员退出。
if(A==“admin”)
{
;//不做什么事
}else
{
“您不是管理员,没有权限”;
}




if(A==“admin”)
{
;//不做什么事
if(A==“admin”)
{
..
if(A==“admin”)
{
..




...
.
...
.
}else
{

}
...
.
...
.
}else
{

}
}else
{
“您不是管理员,没有权限”;
}




4.很复杂的条件检测最好用一个布尔函数来调用。太复杂的条件会让读者很难捕捉到你这个判断到底在判断什么
如:
if(user > 0 and user.type == 5 or name = "admin")
{
...
}
像这样,可以通过一个函数来判断


if(check() == true)
{
...
}




check() 去实现上面的判断  if(user > 0 and user.type == 5 or name = "admin" )


再如:


if(user == (int)MyEnum.Dict_UserType.管理员 || user == (int)MyEnum.Dict_UserType.促销员促销员促销员促销员促销员促销员 || user == (int)MyEnum.Dict_UserType.公司老总 || user == (int)MyEnum.Dict_UserType.财务 || user == (int)MyEnum.Dict_UserType.总经理)


这么长的一段,完成可以这样写
if(user == (int)MyEnum.Dict_UserType.管理员 
|| user == (int)MyEnum.Dict_UserType.促销员 
|| user == (int)MyEnum.Dict_UserType.公司老总 
|| user == (int)MyEnum.Dict_UserType.财务 
|| user == (int)MyEnum.Dict_UserType.总经理)
{
...
}








5、保证所有的情况都要覆盖到。条件嵌套多了的时候很可能会漏掉某些情况的处理。
这个在现实开发中,很多地方要用到,
如:现在用户购买了一个月的广告,很多人的用法可能是这样:当前时间加一个月后,再减一秒。或折出时分钟再比较,看着那些代码,真不知道他是怎么想出来的。这里告诉大家一个简单的应用。
orderDateTime  购买时间。 1.5 12:12:12<= - <=2.5 12:12:11 299
nowDateTime    当前时间。




if(orderDateTime < nowDateTime && nowDateTime <=orderDateTime.addMonth(1))//这里直接加一个月,显示广告时,大于发布时间,并小于等于一个月后的当前时间即可。
{


}




实际应用还。
拼接SQL
很多人这样写 
string where ="1=1";
if(userID != "")
{
where += "and userID = " + userID;
}


看起来别扭,我喜欢这样


string where ="";
if(userID != "")
{
if(where != "")
{
where+=" and "

where += "userID = " + userID;
}












6、考虑是否可以用case语句来实现。


关于判断,在我们项目里,出现最多的问题是:
如下:
string logo = shop.Author.logo ;
在使用时,应该这样


string logo =default.logo;
if(shop != null && shop.Author != null && shop.Author.logo != null)
{
logo = shop.Author.logo ;
}


<img src="@logo">


其实,按我们现在的项目中实际的应用,代码也有可能这样(这种情况是要显示用户的信息。那么实例一个用户信息出来很重要)。
Author author = null;
string logo = shop.Author.logo ;
if(shop != null)
{
author = shop.Author;//店铺的Author是必填的。
if(author != null)
{
logo = author.logo ;
}
}








switch-case语句


要注意的也有几条:
一、case的顺序。这个是最常用的问题,一般来说把使用频率最高的,正常的case放在前面,符合人的阅读习惯。
如果各个case的地位都是平等的,那么可以考虑要字母顺序等。


二、每个case里的语句尽量简短,不要一个case写一页,太多了就改成函数。
这里要强调的是
switch(inputVar)
{
case 'A' :
...
...
...
break;
}


加个大括号,代码更易读
switch(inputVar)
{
case 'A' :
{
...
...
...
break;
}
}






三、用default的case去检查错误的情况,正常流程不应该跑到default里去。
不要default里还包括一个正常的case,那样很容易搞混,尤其要修改的时候,读代码的人可能根本不知道是这样的。


四、像C++中如果不break这个case执行完会执行下一个,要格外小心。
如果真的是想用这种特性,一定要注释,一般不提倡这样用。



三元表达式


不好的习惯:
userID = getUserID()>0 ? getUserID() : 3;
这里,getUserID() 就执行了两次了。


再如:
getUserID()>0 ? getUserID() : getAdmin() > 0 ? getAdmin() : 3;
套得多,并不代这个有多简洁,相反,这段代码无形中增加了维护者工作和难度。


 publishedStroages = PublishedStroage.Where(x => x.Dict_Type == mapCategory.Type && x.Category.Id == mapCategory.TargetId && x.IsPCShow && !x.IsBan, x => x.CreatedTime, OrderBy.Descending, pageIndex, pageSize);
如果是太长的条件,不应该直接写一行,分开拼接,并注明。
有的同志就这么认为,把把所有的很复杂的条件,拼成一行,执行后,得出结果,然后他就认为,自己的代码很简洁,效率多高,现实中不是这样。


好的代码,结构要清晰,方便以后的维护。








再如:我们要把当前用户选择的id.连接起来,放在前如,如下代码:12,3423,3423,342343   我做多年的项目管理,很多初学者完成这段代码是费心周折,漏洞百出,方法是五花八门。
简洁点的写法如下
List<User> Users = ...
string str = "";
foreach(User u in Users)
{
str += u.id + ",";
}
str.trim(',');














关于方法重载:
不好:


addCity(string name,int id)
addCity(string name,int parentId,int id)
addCity(string name,int id,int parentid,int LevelNum)



addCity(string name,int id)
addCity(string name,int id,int parentId)
addCity(string name,int id,int parentid,int LevelNum)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值