算法艺术(二):判断(if)的使用策略
一段时间的忙碌,还是要腾出点时间来继续算法艺术系列。
对于一个程序员来说,用得最多的可能就是if语句来,往往在很多项目中都会发现里面充斥着大量的判断语句。繁琐的判断让人有时候让人读起来苦涩不堪,有一些可以说是一塌
糊涂。
1, 尽快结束 if语句
例如下面这个JavaScript语句,看起来就很恐怖:
function findShape(flags, point, attribute, list) {
if(!findShapePoints(flags, point, attribute)) {
if(!doFindShapePoints(flags, point, attribute)) {
if(!findInShape(flags, point, attribute)) {
if(!findFromGuide(flags,point) {
if(list.count() > 0 && flags == 1) {
doSomething();
}
}
}
}
}
}
但如果这么写就好看得多:
function findShape(flags, point, attribute, list) {
if(findShapePoints(flags, point, attribute)) {
return;
}
if(doFindShapePoints(flags, point, attribute)) {
return;
}
if(findInShape(flags, point, attribute)) {
return;
}
if(findFromGuide(flags,point) {
return;
}
if (!(list.count() > 0 && flags == 1)) {
return;
}
doSomething();
}
或者:
function findShape(flags, point, attribute, list) {
if(!findShapePoints(flags, point, attribute)
&&!doFindShapePoints(flags, point, attribute)
&&!findInShape(flags, point, attribute)
&&!findFromGuide(flags,point)
&&(list.count() > 0 && flags == 1)) {
doSomething();
}
}
2, 如果只是简单的布尔运算(逻辑运算),不要使用if语句
function isStringEmpty(str){
if(str === "") {
return true;
}
else {
return false;
}
}
可以写为:
function isStringEmpty(str){
return (str === "");
}
3,效率判断优先
效率优先即将频繁使用的判断优先进行。
例如,a=1000出现的可能是90以上,那么在下面的片段中就应该优先判断。
如过用下面这段代码,那么判断次数显然多出很多
function isOk(a){
if(a<0) return -1;
else if(a>999&&a<100) return 0;
return -1;
}
我们可以改为如下代码:
function isOk(a){
if(a>1000) return 1;
else if(a>999&&a<100) return 0;
return -1;
}
4,在判断中使用&&,||,!,&,|,移位等技巧
有时候判断中可以技巧性的使用逻辑或者以为符号,优化你的代码,提高你的效率。
对于一个程序员来说,用得最多的可能就是if语句来,往往在很多项目中都会发现里面充斥着大量的判断语句。繁琐的判断让人有时候让人读起来苦涩不堪,有一些可以说是一塌
糊涂。
1, 尽快结束 if语句
例如下面这个JavaScript语句,看起来就很恐怖:
function findShape(flags, point, attribute, list) {
if(!findShapePoints(flags, point, attribute)) {
if(!doFindShapePoints(flags, point, attribute)) {
if(!findInShape(flags, point, attribute)) {
if(!findFromGuide(flags,point) {
if(list.count() > 0 && flags == 1) {
doSomething();
}
}
}
}
}
}
但如果这么写就好看得多:
function findShape(flags, point, attribute, list) {
if(findShapePoints(flags, point, attribute)) {
return;
}
if(doFindShapePoints(flags, point, attribute)) {
return;
}
if(findInShape(flags, point, attribute)) {
return;
}
if(findFromGuide(flags,point) {
return;
}
if (!(list.count() > 0 && flags == 1)) {
return;
}
doSomething();
}
或者:
function findShape(flags, point, attribute, list) {
if(!findShapePoints(flags, point, attribute)
&&!doFindShapePoints(flags, point, attribute)
&&!findInShape(flags, point, attribute)
&&!findFromGuide(flags,point)
&&(list.count() > 0 && flags == 1)) {
doSomething();
}
}
2, 如果只是简单的布尔运算(逻辑运算),不要使用if语句
function isStringEmpty(str){
if(str === "") {
return true;
}
else {
return false;
}
}
可以写为:
function isStringEmpty(str){
return (str === "");
}
3,效率判断优先
效率优先即将频繁使用的判断优先进行。
例如,a=1000出现的可能是90以上,那么在下面的片段中就应该优先判断。
如过用下面这段代码,那么判断次数显然多出很多
function isOk(a){
if(a<0) return -1;
else if(a>999&&a<100) return 0;
return -1;
}
我们可以改为如下代码:
function isOk(a){
if(a>1000) return 1;
else if(a>999&&a<100) return 0;
return -1;
}
4,在判断中使用&&,||,!,&,|,移位等技巧
有时候判断中可以技巧性的使用逻辑或者以为符号,优化你的代码,提高你的效率。
如果大家有什么问题的可以去知识问答找找答案。