-
怎么才能不使用if分支跳转,减少代码复杂度
2013-06-17 11:55:29读取了一个值,然后需要和四五个常量值比较大小,目前用了五个if分支语句,觉得很丑陋 可以用switch来让代码变漂亮点吗? 求老鸟介绍经验 -
C#中if else判断的结果怎么在下面的代码中使用?
2015-10-19 14:24:55if (Type_Id == 0) { string str1 = ""; } else { string str1 = "and Type_Id=" + Type_Id; } 我在下面引用str1会告诉我没有定义- -用var也不行和javascript不一样啊,求各位大大指点 -
-
vue前端怎么代码自测_你可以这样优化 ifelse 代码结构
2020-12-10 07:40:45来自公众号:小生方勤前言最近部门在对以往的代码做一些优化,我在代码中看到一连串的 if(){}elseif(){} 的逻辑判断。这明显是有优化空间的。由于内部代码不适合分享,这里我就用 来讲讲逻辑判断优化的一些方案。...点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!
来自公众号:小生方勤
前言
最近部门在对以往的代码做一些优化,我在代码中看到一连串的
if(){}elseif(){}
的逻辑判断。这明显是有优化空间的。由于内部代码不适合分享,这里我就用 来讲讲逻辑判断优化的一些方案。
这里先声明,免有人疑惑:
我们在项目中使用的很可能会有多层的嵌套,不像我的例子只有一层。不过其优化的思想是大致相同的。由于
returnWeekday()
方法异常之简单,所以提前声明。需求
写一个
returnWeekday()
方法返回"今天是星期*"。接下来我们就一步一步来。
优化过程
这里我简单的分为 “初学 —> 入门 —> 中级” 这几个阶段。
初学
当我们开始拿到需求的时候,看到一系列的逻辑判断,首先想到的应该就是
if
语句了。代码如下:
function returnWeekday(){
letstring= "今天是星期";
let date = newDate().getDay();
if(date === 0) {
string+= "日";
} elseif(date === 1) {
string+= "一";
} elseif(date === 2) {
string+= "二";
} elseif(date === 3) {
string+= "三";
} elseif(date === 4) {
string+= "四";
} elseif(date === 5) {
string+= "五";
} elseif(date === 6) {
string+= "六";
}
returnstring
}
console.log(returnWeekday())
当我们写完了这样的代码,第一感觉就是
elseif
块是不是太多了。可是当我们还在思考如何优化的时候,产品就在钉钉发消息给你问这个需求完成的怎么样了?还带了一个坏笑的表情包。这个时候你告诉自己,这个优化后面再说吧。可是久而久之,需求加之。这个再也没有优化过了,直到下一个接手。
上面的代码确实
elseif
块太多了,看着就不舒服。我们在看《JavaScript 高级程序设计》的时候,看到这样一句话:
switch
语句与if
语句的关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。所以我们是不是可以考虑使用
switch
语句来优化一下呢?入门
这里我们使用
switch
语句优化一遍代码。注意:
switch
语句在比较值的时候使用的是全等操作符,不会有类型转换的情况。代码如下:
function returnWeekday(){
letstring= "今天是星期";
let date = newDate().getDay();
switch(date) {
case0:
string+= "日";
break;
case1:
string+= "一";
break;
case2:
string+= "二";
break;
case3:
string+= "三";
break;
case4:
string+= "四";
break;
case5:
string+= "五";
break;
case6:
string+= "六";
break;
}
returnstring
}
console.log(returnWeekday())
我们在
case
里面拼接字符,以达到输出预期结果的目的。这里的结构看起来确实比if
语句清晰了一点。可是还是有点疑惑?假设哪一天,相关组织发现,星象有变。每周需要变成八天(产品的思维,你无法想象)。我们这个
returnWeekday()
方法就需要多加一层判断了。我们的希望是已经封装好的方法,不要频繁的修改。可是需求的变动是你无法控制的。
所以我们继续思考该怎么优化。
中级
我们看到这里的
case
是数字,和数组的下标是一致的。即:
['天','一','二','三','四','五','六']
的下标。所以我们可以考虑使用数组来优化。
代码如下:
function returnWeekday(){
letstring= "今天是星期";
let date = newDate().getDay();
// 使用数组
let dateArr = ['天','一','二','三','四','五','六'];
returnstring+ dateArr[date]
}
console.log(returnWeekday())
以上代码是不是比
switch
语句和if
语句清晰多了。而且就算一周变为八天,只需要修改dateArr
数组就好了。倘若我们的每个
case
是不规律的字符串呢?那我们使用对象,每个case
为一个key
代码如下:
function returnWeekday(){
letstring= "今天是星期";
let date = newDate().getDay();
// 使用对象
dateObj = {
0: '天',
1: "一",
2: "二",
3: "三",
4: "四",
5: "五",
6: "六",
};
returnstring+ dateObj[date]
}
console.log(returnWeekday())
以上使用数组或者对象的写法,提高代码的可读性的同时,维护起来也变得简单了。
使用 charAt 字符方法
字符串有个和使用数组下标类似的方法:
// charAt 定位方法
function returnWeekday(){
return"今天是星期"+ "日一二三四五六".charAt(newDate().getDay());
}
console.log(returnWeekday())
需求变动
这个时候,有人希望
returnWeekday()
方法不仅返回今天是周几,还需要区分工作日和休息日,调用相关方法。如果是使用
switch
、if
或数组
维护起来就有点麻烦,需要改写的地方还挺多的。function returnWeekday(){
letstring= "今天是星期";
let date = newDate().getDay();
// 使用对象
dateObj = {
0: ['天','休'],
1: ["一",'工'],
2: ["二",'工'],
3: ["三",'工'],
4: ["四",'工'],
5: ["五",'工'],
6: ["六",'休'],
}
// 类型,这里也可以对应相关方法
dayType = {
'休': function(){
// some code
console.log('为休息日')
},
'工': function(){
// some code
console.log('为工作日')
}
}
let returnData = {
'string': string+ dateObj[date][0],
'method': dayType[dateObj[date][1]]
}
return returnData
};
console.log(returnWeekday().method.call(this))
其他常见优化手段
这里在给出一些常见的优化手段。
三元运算
适合简单的
if(){}else{}
情况。//滚动监听,头部固定
handleScroll: function() {
let offsetTop = this.$refs.pride_tab_fixed.getBoundingClientRect().top;
if( offsetTop < 0){
this.titleFixed = true
} else{
this.titleFixed = false
}
// 改成三元
(offsetTop < 0) ? this.titleFixed = true: this.titleFixed = false;
// 我们发现条件块里面的赋值情况是布尔值,所以可以更简单
this.titleFixed = offsetTop < 0;
}
这样在精简代码的时候,可读性也没有降低。
逻辑与运算符
有些时候我们可以使用逻辑与运算符来简化代码
if( falg ){
someMethod()
}
可以改成:
falg && someMethod();
使用
includes
处理多重条件if( code === '202'|| code === '203'|| code === '204'){
someMethod()
}
可以改成
if( ['202','203','204'].includes(code) ){
someMethod()
}
Vue 相关文章输出计划
最近总有朋友问我 Vue 相关的问题,因此接下来我会输出 10 篇 Vue 相关的文章,希望对大家有一定的帮助。我会保持在 7 到 10 天更新一篇。
Vuex 注入 Vue 生命周期的过程(完成)
学习 Vue 源码的必要知识储备(完成)
浅析 Vue 响应式原理(完成)
新老 VNode 进行 patch 的过程
如何开发功能组件并上传 npm
从这几个方面优化你的 Vue 项目
从 Vue-Router 设计讲前端路由发展
在项目中如何正确的使用 Webpack
Vue 服务端渲染
Axios 与 Fetch 该如何选择
鹅厂前端大佬对于前端学习路线的一些建议(内含自测题)
我的VS Code设置,助你每天少加班1小时
值得学习的10个Vue开发技巧
在字节跳动实习30天的4点成长感受
-
怎么将无聊的ifelse彻底移除你的代码
2018-10-04 10:59:30我们最常见的就是写 if else if 这种东西对于初学者来说确实是很方便,但是维护起来肯定是一堆得麻烦,下面我们来看看怎么使用enum(1),enum+class.forname(2)来解决这个问题,枚举类的使用可以让代码十分的清晰,...-
前言
在漫长的编码生涯中,我们最常见的就是写 if else if 这种东西对于初学者来说确实是很方便,但是维护起来肯定是一堆得麻烦,下面我们来看看怎么使用enum(1),enum+class.forname(2)来解决这个问题,枚举类的使用可以让代码十分的清晰,并且极大程度上可以完成解耦的工作,维护起来也非常简单, -
原代码
需求: A系统的定义的附件类型和B系统的附件类型 不一致,A需要将附件传给B,但是 B系统的附件类型会一直变化,但是 A系统是面对客户的,不可能每次都因为B增加附件而发布一次,所以需要想个办法解决
初始版本:
public String convertImgType(String type) throws RequestException { String convert; if ("1".equals(type)) { convert = "1";// 身份证正 } else if ("2".equals(type)) { convert = "2"; // 身份证反 } else if ("3".equals(type)) { convert = "3";// 本人照片 } else { convert = "0"; } return convert; }
很明显这样写,是十分愚蠢的,怎么改善呢,经过沟通,以后A B 两个系统会进行一致性的附件类型增加,
于是我们考虑就用 enum 来解决之前的愚蠢
首先写一个枚举类:很明显就把这两个type 对应起来就行了public enum ImageEnum implements IUnexEnum<ImageEnum>{ TYPE_1("1","1"), TYPE_19("19","0"), TYPE_20("21","0"), ; ImageEnum(String code, String desc) { this.code = code; this.desc = desc; } private final String code; private final String desc; @Override public String code() { return code; } @Override public String desc() { return desc; } // 判断code是否相等 @return true-相等, false-不等 @Override public boolean equals(String code) { return this.code.equals(code); } }
抽象的动作 IunexEnum
public interface IUnexEnum<E extends Enum<?>> { String code(); String desc(); boolean equals(String var1); }
enum工具类
public static <E extends Enum<?>> E code2Enum(Class<E> enumClass, String code) { if (!IUnexEnum.class.isAssignableFrom(enumClass)) { return null; } else { Enum[] var5; int var4 = (var5 = (Enum[])enumClass.getEnumConstants()).length; for(int var3 = 0; var3 < var4; ++var3) { IUnexEnum<?> ce = (IUnexEnum)IUnexEnum.class.cast( var5[var3]); if (ce.equals(code)) { return (E)var5[var3]; } } return null; } }
- 初始改造的结果
public String convertImgType(String type) throws RequestException { String convert = "0"; ImageEnum imageEnum = UnexEnumUtil.code2Enum(ImageEnum.class, type); if (imageEnum == null) { convert =type; }else{ convert=imageEnum.desc(); } return convert;
- 可能在实践生产中,我们会遇到的还不止 type 转化的问题,还有根据 传入的参数,获取不同的model 所以这里我们也给一个这样的例子 enum+class.forname
初始版本:一个抽象的 区间类,暂时有四个子类,所以直接用了if else
public static SectionAb createSections(String sybolend, String sybolStart) { boolean endFlag = !Strings.isNullOrEmpty(sybolend)?true:false; boolean starFlag = !Strings.isNullOrEmpty(sybolStart)?true:false; SectionAb result = null; if (endFlag && !starFlag) { result = new SectionAbSingleEnd(); } if (endFlag && starFlag) { result = new SectionAbBoth(); } if (!endFlag && starFlag) { result = new SectionAbSingleStart(); } if (!endFlag && !starFlag) { result = new SectionAbNotAll(); } return result; }
为了正交性和解耦:其实为了以后不再这里改代码,代码应该就是 不鼓励改动,但是允许扩展
2. 创建 枚举类public enum SectionTypeEnum implements IUnexEnum<SectionTypeEnum> { PROMO_SCOPE("0101", "BOTH"), PROMO_CONDITION("0201", "SINGSTART"), PROMO_CONDITION_PARAM("0202", "NOTALL"), PROMO_INCENTIVE("0102", "SINGEND"); }
包含类路径的枚举类
public enum SectionEnum { BOTH("com.xx.install.calc.model.SectionAbBoth"), NOTALL("com.xx.install.calc.model.SectionAbNotAll"), SINGEND("com.xx.install.calc.model.SectionAbSingleEnd"), SINGSTART("com.xx.install.calc.model.SectionAbSingleStart"); SectionEnum(String className) { this.setClassName(className); } private String className; public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } }
- 改造后
如果以后还有更改,我们只需要扩展 枚举类和对传入的因子做修改,如果传入的因子会很多种的变化,我们会采用另外一种方法,
public static SectionAb createSectionByEnum(String sybolend, String sybolStart ) throws Exception{ String endFlag = !Strings.isNullOrEmpty(sybolend)?"01":"02"; String starFlag = !Strings.isNullOrEmpty(sybolStart)?"01":"02"; String result = UnexEnumUtil.code2Enum(SectionTypeEnum.class , String.valueOf(endFlag+starFlag)).desc(); String className = SectionEnum.valueOf(result).getClassName(); SectionAb sectionAb = (SectionAb) Class.forName(className).newInstance(); return sectionAb; }
-
-
Java跳出If代码块
2020-06-12 12:09:13在处理某个业务逻辑时需要使用If判断然后进入If或则Else的代码块,但是如果需要在代码块执行过程中出现某种情况需要跳出If代码块怎么做? 可以使用设置语句标签,然后使用break 标签 如下: out:if (u.getId() == ...在处理某个业务逻辑时需要使用If判断然后进入If或则Else的代码块,但是如果需要在代码块执行过程中出现某种情况需要跳出If代码块怎么做?
可以使用设置语句标签,然后使用break 标签
如下:out:if (u.getId() == null) { //todo 处理逻辑 if (u.getId() != null) { break out; } //todo 处理逻辑 if (u.getId() != null) { break out; } //todo 处理逻辑 }); } }
/** * 跳出If代码块 */ public static void method() { int i = 0; out:if (i < 10) { System.out.println(0); //实际操作应该是每次处理都会不一样 如果每次处理一样可以使用do while来处理循环判断 i+=5; if (i >= 10) { break out; } System.out.println(1); i+=5; if (i >= 10) { break out; } System.out.println(2); i+=5; if (i >= 10) { break out; } System.out.println(3); } }
注:此功能类似于C++的goto语法。
goto作为Java语法中的保留字,但不支持使用goto。 -
python中def中如何使用if_python 中def 的问题 新手不知道怎么该改这段代码
2020-12-21 00:42:04这是一本python书中的代码 书中支持的python是2.5.x 我系统的环境是2.7.6 不知道这两处怎么修改 求助啊!!! ============================================ o(╯□╰)o 我知道了 是缩进造成的 ,,, ============...stack=[]defpushit():stack.append(raw_input('Enternewstring:').strip())defpopit():iflen(stack)==0:print'Cannotpopfromanemptystack!'else:print'Removed[',`stack.pop()`,']'de...
stack = []
def pushit():
stack.append(raw_input(' Enter new string: ').strip())
def popit():
if len (stack)==0:
print 'Cannot pop from an empty stack!'
else:
print 'Removed [', `stack.pop()`,']'
def viewstack():
print stack #call str() internally
CMDs = {'u': pushit, 'o': popit, 'v': viewstack}
def showmenu():
pr = ''' #报错1 原因好像是 局部变量已声明但为使用
p(U)sh
p(O)p
(V)iew
(Q)uit
Enter choice: '''
while True:
while True:
try:
choice = raw_input(pr).strip()[0].lower() #报错2 未定义
except (EOFError,KeyboardInterrupt,IndexError):
choice = 'q'
print '\nYou picked: [%s]' % choice
if choice not in 'uovp':
print "Invalid option, try again"
else:
break
if choice == 'q':
break
CMDs[choice]()
if __name__ == '__main__':
showmenu()
####################################################
这是一本python书中的代码 书中支持的python是2.5.x
我系统的环境是2.7.6 不知道这两处怎么修改 求助啊!!!
============================================
o(╯□╰)o 我知道了 是缩进造成的 ,,,
============================================
展开
-
专家说别用 if-else 编码方式,那代码怎么写
2020-10-18 16:24:10你已经看了无数使用 if-else 语句的教程,你可能也读过不少使用 if-else 作为事实上的分支技术的编程书籍。它可能是也是你日常默认的编码模式。但是,让我们从今天起结束这种方法,... -
python if elif用法_怎么快速掌握使用python中if和elif?
2020-12-04 11:48:03引入:如果平时执行的过程超过两个分支,则使用if-elif语句if-elif语句结构if判断条件:要执行的代码elif判断条件:要执行的代码……else:要执行的代码判断条件:一般为关系表达式或者bool类型的... -
if怎么循环python_如何在循环中使用“if”?
2021-01-14 10:36:56”本质上,我所做的是,编写一些代码,将取一个基本值(例如10),从信用卡余额中扣除(考虑利息),如果将余额设为负数(如已还清)所需的总月数超过12个月,则将其添加到“minmonth”(每月要偿还的金额)中直到月数等于或... -
LIC(线积分卷积)源代码,怎么结合具体图像怎么使用?
2015-10-18 12:55:46运行没有错误,刚接触图形学,不知道如何使用这段代码。 /*----------------------------------------------------------*/ /* 代码参考如下链接: */ /* http://www.zhanpingliu.org/Research/FlowVis/LIC/LIC.htm ... -
python里elif必须在if后面_怎么快速掌握使用python中if和elif?
2021-01-16 02:37:54引入:如果平时执行的过程超过两个分支,则使用if-elif语句if-elif语句结构if判断条件:要执行的代码elif判断条件:要执行的代码……else:要执行的代码判断条件:一般为关系表达式或者bool类型的... -
python中if elif同时成立时_怎么快速掌握使用python中if和elif?
2020-12-23 23:23:26引入:如果平时执行的过程超过两个分支,则使用if-elif语句if-elif语句结构if判断条件:要执行的代码elif判断条件:要执行的代码……else:要执行的代码判断条件:一般为关系表达式或者bool类型的... -
用枚举代替写if-else的一个案例,看大佬是怎么写代码的,升职加薪就靠它了。
2020-11-30 23:58:41平常使用过程中我们对于enum很少使用,实际上枚举有很多用处,下面是一个关于用枚举代替if-else的一个案例。可以让你的代码更具可扩展性,减少加班改需求的可能。 下面是一个关于加减乘除四则运算的设计 一般的写法... -
python空行代码怎么写_如何使用Python计算java源代码的注释行和空行?
2020-12-02 18:45:59我想计算总线条、空白线条、注释线条和代码行。但我不能运行这个程序。我知道我计算评论行的方法是错了。真的吗需要帮助。在def FileLineCount(filename):(shotname,extension) = os.path.splitext(filename);if ... -
线性序列的求和累加问题,是怎么使用 C语言的程序设计的思想方法编写的代码设计怎么做
2019-06-11 11:02:24The way they use to divide is : everyone can choose one people to join in her group, Such as if A chooses B to join in her group , then B will leave the group she is in now , and joins in the group ... -
python if怎么用_python if在逻辑运算符中怎么用?
2021-01-14 23:06:25想要学好python,基础语句的学习是必不可少的。python语句比较多,最老生常谈有for和while,这个我们之前讲的比较多。...只有多个条件都满足,才能够执行后续代码,这个时候需要使用到逻辑运算符。逻辑运算符... -
代码块是什意思,怎么使用?求解答
2016-12-27 01:55:13if (var != m_availInst.end()) //判断选中的指令集是否正确 { m_instructionType = var->second.type; var->second.extra.width = width; tool.SetInstExtraInfo(&var->second.extra); } else { ... -
cmd跑绿色代码_ifelse“烦不烦”,让代码简单、高效、优雅起来
2020-12-02 02:04:30if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到想吃,而且阅读起来比较困难,维护起来也比较困难,很容易出 Bug,如下图怎么才让代码简单、高效、优雅起来。1,提前 ... -
代码怎么制作全屏店招代码_PyCharm制作自定义代码模板
2021-01-15 10:28:13当在代码区输入main时,第一项就是if _name=='main_':,回车后就可以自动将main结构代码显示在代码区里,非常方便。除了PyCharm提供的这些智能选项模板外,我们自己也可以根据需要来制作代码模板。与函数、类等基本... -
else 策略模式去掉if_用策略模式重构很多if else的代码
2020-12-20 13:01:38做的一个比较老的系统,不要吐槽别人的代码烂 发现不足并改变就是进步代码中有很多if else的代码 可读性很差 在想怎么能进行优化在,找到并学习了策略模式的使用if (msgType = "文本") {// dosomething} else if... -
flag在java怎么用_java – 使用flag或if子句更有效吗?
2021-02-27 12:44:31在Java循环中,使用布尔标志而不是if语句是否更有效?看看这两行代码.使用标志:public boolean isSomethingForAnyone() {boolean flag = false;for (Item item : listOfItems) {flag = flag || item.isSomething();}... -
实现一个表达式自动能计算的计算器,怎么使用C语言的程序编写的代码,具体的代码编写的思想怎么做
2019-05-29 19:53:41If the expression is legal, output its value, else ouput an error message. Input There are several test cases, each occupies one line that contains an infix expression. Proceed until the end ... -
类似if一样的自定义代码块
2017-12-19 05:44:27Xcode编译器是智能的,至少要比之前嵌入式时候使用的keil编译器智能。Xcode已经定义了很多的代码块,...事件的起源是某天深夜的时候同时发QQ问我,怎么能把自己现在写的代码像系统那样保存下来,使用的时候只需要填... -
考虑到性能的代码应当怎么写?1、使用 as 而不要用 is
2019-06-24 19:53:00public class ShouldAsNotIs { public void ShouldAs() { object a = new ShouldAsNotIs(); var b = a as ShouldAsNotIs; if (b == null) ... -
错误的曲线的标注问题,怎么使用C语言的程序的编写过程的方式有效实现的代码怎么写
2019-06-21 15:57:43It's very easy to calculate the minimal error if there is only one test error curve. However, there are several datasets, which means Josephina will obtain many parabolic curves. Josephina wants to ... -
python if函数多个条件怎么用_如何在使用PYTHON的函数中使用条件语句(多个IF和ELSE语句)...
2021-01-28 16:57:39我是编程新手,正在上一门课程edx.org网站....有什么方法可以在代码中使用return关键字吗?下面是问题和我的代码。在###create a functions using startswith('w')###w_start_test() tests if starts with "w"# f... -
三角形的分区方法,怎么使用C语言的程序的设计的思想编写程序来做的,代码怎么写
2019-06-01 23:39:56Problem Description Chiaki has 3n points p1,p2,…,p3n.... If there are multiple solutions, you can output any of them. Sample Input 1 1 1 2 2 3 3 5 Sample Output 1 2 3 -
vue使用element-ui 怎么处理v-for和v-if 不能同时使用(tag标签closable)
2021-01-28 20:18:31tag标签中有一个closable属性,但是要在某一条件下删除标签,首先想到的是使用v-if条件判断,但是在此标签中,已使用了v-for,,那么就不能再使用v-if,但是又要实现需求,可以把closable写成变量,并附有条件 ... -
数字的模式的匹配的问题,怎么使用C语言的程序编写代码的基础知识来编写实现代码的
2019-06-06 20:12:51In Computer Science, pattern matching is the act of checking if a certain sequence conforms (matches) a given pattern. Patterns are usually specified using a language based on regular expression. In ...