小朋友,你是否有很多if-else
if-else代码优化的八种方案
背景
需求总是不断的接,代码不停地写,每次回过头来看自己的代码是否依旧能感到熟悉,还是陌生到需要从头梳理一遍逻辑?每次迭代中不断的修改更新自己或者同事的方法模块,是否能从中总结点什么?
今天分享一下 if-else 太多的代码该怎么优化的五种方案,事实上如果你心里有了这些方法,在编程的过程中就应该很好的应用进代码中,上线着急,开发时间短都不是接口,编码方式是一种习惯,这些习惯直接决定了你的编程风格,而不是开发后慢慢的优化修改成你的编码风格。
方案
一: 提前 return
这是 if-else 嵌套太多层的直接原因,提前 return 是解决太多代码嵌套的最有效的保障。
//修改前
public String shopping() {
if (商品列表 != 空) {
if (巧克力分类 != 空) {
if (瑞士莲巧克力 != 空) {
return "瑞士莲巧克力";
} else if (德芙巧克力 != 空) {
return "德芙巧克力";
} else {
return "不想买了";
}
}
}
return "不想买了";
}
//修改后
public String shopping() {
if(商品列表==空){
return "不想买了";
}
if(巧克力分类==空){
return "不想买了";
}
if(瑞士莲巧克力!=空){
return "瑞士莲巧克力";
}
if(德芙巧克力!=空){
return "德芙巧克力";
}
return "不想买了";
}
二: 条件表达式
有些代码的判断,可以使用一个条件表达式来协助判断,提升一下代码的阅读性,比如上方的四个if-else,虽然解决了嵌套太多的问题,但是迎来了新的问题,流水账式的代码太长,使用下列的条件表达式帮忙再优化一下
public String shopping() {
Boolean 有巧克力吗 = 商品列表 != 空 && 巧克力分类 != 空;
if (!有巧克力吗) {
return "不想买了";
}
if (瑞士莲巧克力 != 空) {
return "瑞士莲巧克力";
}
if (德芙巧克力 != 空) {
return "德芙巧克力";
}
return "不想买了";
}
public String shopping() {
Boolean 有巧克力吗 = 商品列表 == 空 || 巧克力分类 == 空;
if (!有巧克力吗) {
return "不想买了";
}
if (瑞士莲巧克力 != 空) {
return "瑞士莲巧克力";
}
if (德芙巧克力 != 空) {
return "德芙巧克力";
}
return "不想买了";
}
三: 拆方法
将上方的巧克力的判断逻辑拆出去,避免未来有更多的巧克力品牌判断增加更对的if-else,同时职责单一了当前方法,拆出的方法,其他模块也能公用
public String shopping() {
Boolean 有巧克力吗 = 商品列表 != 空 && 巧克力分类 != 空;
if (!有巧克力吗) {
return "不想买了";
}
return getChocolates(巧克力分类);
}
private String getChocolates(巧克力分类){
if (瑞士莲巧克力 != 空) {
return "瑞士莲巧克力";
}
if (德芙巧克力 != 空) {
return "德芙巧克力";
}
return "不想买了";
}
四: 三元运算符
有些代码的判断,还可以使用一个三元运算符来协助判断一下,比如上方的 getChocolates 方法
private String getChocolates(巧克力分类){
if (瑞士莲巧克力 == 空) {
return 德芙巧克力 == 空 ? "不想买了" : 德芙巧克力;
}
return "瑞士莲巧克力";
}
五: 使用枚举
private String getChocolatesEnum(巧克力分类){
return ChocolatesEnum.find(巧克力分类);
}
public enum ChocolatesEnum{
LINDT(瑞士莲),MARSINC(德芙);
ChocolatesEnum find(当前巧克力){
fot(){
if(当前巧克力 == 瑞士莲){
return 瑞士莲;
}
if(当前巧克力 == 德芙){
return 德芙;
}
}
return "不想买了";
}
}
总结:还有很多比如 Optional、表驱动法、策略模式、模板方法等,在不同的场景使用不同的方式都能让代码的风格和阅读质量提升,实在不行,至少第一种方案要考虑用一下,至少阅读理解方便起来了,巧克力的例子不好再继续举例子了,先介绍到这里吧。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!