关于本周培训(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)