多分支结构的优化有很多好处:既方便代码维护,又可以提升代码执行效率。例如,设计有多个条件,只有当多个条件都成立时,才允许执行特定任务。

示例1

遵循简单的设计思路,使用多重分支逐个检测这些条件。

if (a) {

if (b) {

if (c) {

if (d) {console.log("所有条件都成立!"); }

else {console.log("条件 d 不成立!"); }

} else {console.log("条件 c 不成立!"); }

} else {console.log("条件 b 不成立!"); }

} else {console.log("条件 a 不成立!"); }

示例2

上述设计没有错误,结构嵌套合法。不过可以使用逻辑运算符进行优化。

if (a && b && c && d) {console.log("所有条件都成立!"); }

比较而言,使用 if 语句逐个检测每个条件的合法性,并对某个条件是否成立进行个性化处理,以方便跟踪。但是使用 if (a && b && c && d) 条件表达式,就没法进行过程跟踪。例如,如果 a 条件不成立,则程序会自动退出整个流程,而不管 b、c 和 d 的条件是否成立。这会使代码跟踪变得很困难。

示例3

优化设计思路,采用排除法,对每个条件逐一进行排除,如果全部成立则再执行特定任务。在排除过程中,使用一个标志变量把每一次条件检测联系在一起,最后根据这个标志变量决定是否完成特定任务。

var t = true; //初始化标志变量为true

if (! a) {

console.log("条件 a 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (! b) {

console.log("条件 b 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (! c) {

console.log("条件 c 不成立!");

t = false //如果条件a不成立则标志变量为false

}

if (! d) {

console.log("条件 d 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (t) { //如果标志变量为true,则执行特定任务

console.log("所有条件都成立!");

}

排除法有效避免了条件嵌套的复杂性,不过这种设计也存在一定的局限性,例如,一旦发生错误,后面的操作将被放弃。为此还可以再设计一个标志变量来跟踪错误。

数据映射

在多分支检测中,表达式的重复运算会影响性能。如果检测的条件满足下面两条,可以考虑使用数据映射来快速匹配,这样有助于代码的可读性,大大提高了代码的响应速度。

条件体的数量庞大

测试的条件值呈现离散状态

实现方法:通过数组或普通对象实现。

示例1

在下面代码中,使用 switch 多分支检测离散值。

function map(value) {

switch (value) {

case 0 : return "result0";

case 1 : return "result1";

case 2 : return "result2";

case 3 : return "result3";

case 4 : return "result4";

case 5 : return "result5";

case 6 : return "result6";

case 7 : return "result7";

case 8 : return "result8";

case 9 : return "result9";

default : return "result10"

}

}

示例2

针对示例 1 可以使用数组查询替代 switch 语句。下面代码把所有离散值存储到一个数组中,然后通过数组下标快速检测元素的值。

function map(value) {

var results = ["result0","result1","result2","result3","result4","result5",

"result6","result7","result8","result9","result10"]

return results[value];

}

使用数据映射法可以消除所有条件判断,但由于没有条件判断,当候选值数量增加时,基本不会增加额外的性能开销。

如果每个键映射的不是简单的值,而是一系列的动作,则使用 switch  更适合。当然,也可以把这些动作包装在函数中,再把函数作为一个值与键进行映射。

示例3

如果条件查询中键名不是有序数字,则无法与数组下标映射,这时可以使用对象数据映射法。

function map(value) {

var results = {

"a" : "result0","b" : "result1","c" : "result2","d" : "result3","e" : "result4","f" : "result5",

"g" : "result6","h" : "result7","i" : "result8","j" : "resukt9","k" : "result10"

}

return results[value];

}

调整分支顺序

在多分支结构中,各种条件存在先后、轻重的顺序。如果把最可能的条件放在前面,把最不可能的条件放在后面,那么程序被执行时总会按照代码先后顺序检测所有条件,直到发现匹配的条件时才停止。如果把最可能的条件放在前面,就等于降低了程序的检测次数,自然也就提升了分支结构的执行效率,避免空转。这在大批量数据检测中效果非常明显。

示例1

对于一个论坛系统来说,普通会员的数量要远远大于版主和管理员的数量。大部分登录的用户都是普通会员,如果把普通会员的检测放在分支结构的前面,就会减少每次检测的次数。

switch (level) { //优化分支顺序

case 1 :

console.log("普通会员");

break;

case 2 :

console.log("版主");

break;

case 3 :

console.log("管理员");

break;

default :

console.log("请登录");

}

在性能影响不大的情况下,遵循条件检测的自然顺序会更易于理解。

示例2

设计检测周一到周五值日任务安排的分支结构。可能周五的任务比较重要,或者周一的任务比较轻,但是对于这类有着明显顺序的结构,遵循自然顺序比较好。打乱顺序,把周五的任务安排在前面,对于整个分支结构的执行性能没有太大帮助,打乱的顺序不方便阅读。因此,按自然顺序来安排结构会更富有可读性。

switch (day) {

case 1 :

console.log("周一任务安排");

break;

case 2 :

console.log("周二任务安排");

break;

case 3 :

console.log("周三任务安排");

break;

case 4 :

console.log("周四任务安排");

break;

case 5 :

console.log("周五任务安排");

break;

default :

console.log("异常处理");

}

分支之间的顺序应注意优化,当然,对于同一个表达式内部也应该考虑逻辑顺序问题。由于逻辑与或逻辑或运算时,有可能会省略右侧表达式的计算,如果希望右侧表达式不管条件是否成立都被计算,就应该考虑逻辑顺序问题。

示例3

有两个条件 a 和 b,其中条件 a 多为真,而 b 是一个必须执行的表达式,那么下面逻辑顺序的设计就欠妥当。

if (a && b) {

//执行任务

}

如果条件 a 为 false,则 JavaScript 会忽略表达式 b 的计算。如果 b 表达式影响到后面的运算,则不执行表达式 b,自然会对后面的逻辑产生影响。因此,可以采用下面的设计思路,在 if 结构前先执行表达式 b,这样即使条件 a 的返回值为 false,也能够保证 b 表达式被计算。

var c = b;

if (a && b) {

//执行任务

}

python多分支结构实例_JS优化多分支结构(经典)相关推荐

  1. 微课|中学生可以这样学Python(3.1节):单分支选择结构

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第3章  选择结构 3.1  单分支选择结构 京东购买链接:https://item.jd.com ...

  2. 微课|中学生可以这样学Python(3.3节):多分支选择结构

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第3章  选择结构 3.3  多分支选择结构 京东购买链接:https://item.jd.com ...

  3. c语言最新标准c22,【C语言实例】c22-选择分支结构.doc

    [C语言实例]c22-选择分支结构 1.从键盘输入现在的时间(小时.分钟.秒),根据不同的时间段提示不同的问候语,例如,输入:16:25:46 ,提示:下午好! #include main() { i ...

  4. Abaqus高级实例分析视频教程-材料 静力 结构优化分析教程

    Abaqus高级实例分析视频教程-材料 静力 结构优化分析教程 链接:https://pan.baidu.com/s/11ri8tIpbMWYvtTciQYK8Wg 提取码:i3qw

  5. python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3

    顺序 自上而下,依次执行 分支 分支的基本语法 if 条件表达式: 语句1 语句2 语句3 ...... 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句, ...

  6. python分支结构保留字_Python控制语句(分支结构与选择结构,循环结构)

    这里写目录标题 一.分支结构与选择结构 (1)单分支结构 (2)二分支结构 (3)紧凑形式 代码演示: (4)多分支结构 (5)pass语句 二.循环结构 1.for语句 (1)计数遍历循环: (2) ...

  7. python 随机森林分类 DecisionTreeClassifier 随机搜索优化参数 GridSearchCV

    @python 随机森林分类模型 随机优化参数 学习笔记 随机森林 1.随机森林模型 随机森林算法是基于决策树算法的Begging优化版本,通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策 ...

  8. Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

    官网链接:https://optics.ansys.com/hc/en-us/articles/360042800333-Y-branch-optimization-using-particle-sw ...

  9. python 爬虫实例-Python 爬虫:Scrapy 实例(二)

    原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...

最新文章

  1. Android添加权限大讲解
  2. 全网最详细之一网打尽数据结构中与树相关的算法
  3. mysql get_mysql GET DIAGNOSTICS 语法
  4. HttpMessageConverter转换类型
  5. golang多核的使用
  6. iptables 防火墙设置
  7. 用python实现链表_用Python实现链表
  8. 自动平衡男女比例的随机分组软件B2G使用教程,献给组织
  9. 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
  10. SQLALCHEMY_DATABASE_URI格式实例
  11. C#通过SSH连接MySql
  12. LeetCode 694. 不同岛屿的数量(BFS/DFS+set)
  13. 转:javascript方法--bind()
  14. java 预览图片_jquery实现图片预览的方法
  15. 多进程参数args元组方式与kwargs字典方式
  16. java遍历hashMap、hashSet、Hashtable
  17. HDOJ 3507 Print Article(DP + 斜率优化)
  18. 使用Xavier读取RealSense D435i的踩坑经历
  19. 魔兽世界lua笔记(4、集合石插件修改,实现集合石亮灯hack)
  20. Linux监控平台介绍

热门文章

  1. 英文期刊催稿信模板_手把手教你写投稿信,另附查尔斯沃思高质量模板
  2. t分布 u分布 卡方分布_中心极限定理|z分布|t分布|卡方分布
  3. react动态改变选中不选中_当使用react hooks选中任何复选框时,如何使启用按钮起作用?...
  4. RS232与串口通信的4个注意事项详解
  5. 简要分析光端机选购必备条件
  6. 【渝粤教育】 国家开放大学2020年春季 1373特殊教育概论 参考试题
  7. lora无线模块基于LoRaWAN网关技术在国家物联网应用
  8. linux自动挂载fcoe存储,在sdb上挂载USB 设备
  9. oracle impdp导入时卡住,Oracle:impdp导入等待statement suspended, wait error to be cleared
  10. OD汇编指令集(不断更新)