感谢本文作者:http://www.blogjava.net/Ericzhang5231/articles/299443.html
无疑 if/else几乎是所有编程语言的一个重要语法,我们不但可以在简单的函数里面发现它的足迹,更不用说在具有复杂逻辑、代码行数累累的功能里面了。所以尽管if/else是一个简单的语法结构,但它的功能很强大。
if/else的强大使得我们在遇到任何分支逻辑里面都会优先考虑它的使用,所以无论是简单的,还是复杂逻辑功能函数都会出现if/else,但是这种“优先考虑”更多的时候却变成了一种怂恿和诱惑。特别在复杂逻辑功能函数里面,不乏if/else错用、滥用和嵌套用。if/else错用、滥用和嵌套用都会在不同程度上减少代码的可读性,降低代码的可维护性,增加潜在bug的可能性。
if/else错用。什么是if/else错用?由于人的思维快速性,使得我们能够一下子对一些中等复杂的逻辑理解,能够一下子把中等复杂的逻辑结构浮现在脑海,因此在编程的时候就容易过于自信,依葫芦画瓢,想到哪写到那。通常这容易使得某些人在使用if/else的时候导致错用,下面是一个if/else错用的例子:
在这个例子里面,由于只有3个逻辑可能性,所以很容易就会分别对3个逻辑可能性的一一建立分支。也许在简单的、行数较少的代码里面,一一建立分支的做法并无大碍,但如果功能复杂,行数较多,代码自描述性较差的代码里面,你大半会被这里的逻辑搞晕的。这就是if/else错用了,其实并不需要一一建立分支,至少在上面的例子里面,对于C的判断是不需要的。
if/else滥用。滥用是指过多的使用if/else进行逻辑控制,同样也是因为思维的快速性和不具有良好编程经验的人容易烦的错误。例如下面的代码:
很明显上面的这段代码不是一个良好结构的代码段,当然这里还存在if/else错用和嵌套用的问题。但是这就也说明了if/else错用和嵌套用的基本原因是我们滥用了if/else,因此如果当我们使用超过3个嵌套if/else之后就应该思考这段代码是否能够进行重构。重构的方法很多,本文就不进行具体介绍了,有兴趣可以参考Martin Fowler的《Refactoring: Improving the Design of Existing Code》以及wiki对refactoring的介绍。
if/else嵌套用。嵌套用很好解释,也很好理解其害处。人脑的堆栈容量是有限的,一般不建议if/else或其他逻辑结构嵌套超过三层以上,否则人对其的记忆就会大大减弱,相信谁也不会想不断翻之前的代码行去查看某个东西吧。我们在说if/else滥用的例子就是一个典型的嵌套用法,层数达到4层以上。这种问题很容易产生,因为程序本来就是要控制逻辑的,逻辑存在多种分支在大部分时候我们都会遇上。那怎么避免这种嵌套用呢?要做到避免其实在一开始是很难做到的,除了经验丰富的人除外。所以我的建议是,先把事情做对了(程序逻辑实现了),然后进行重构。对于大点的程序进行重构建议遵循Martin的观点,先写好相关的test。而这里的重构方法也可以说相当简单,思路一:使用Joshua
Bloch在《effective java》中介绍的方法,把嵌套里面的if/else一一揪出并放到所在嵌套层的上一层,如果揪出后还能继续在新所在层揪到新所层的上一层就继续揪,同时要注意else是否能消掉;思路二:是否能够使用switch实现,3个以上的逻辑判断用switch的话更容易让人看懂你写的东西。最后还应该根据实际情况,是否需要把逻辑代码段抽取出来成为一个单独的函数或者类。例如上例我们可以进行如下重构:
if/esle虽小,而且功能强大,但如果不正确使用,不但会让代码维护困难,更可怕是留下潜在的bug。以上3个问题是比较普通出现的问题,只要我们细心的话,这些问题都可以避免,修改和完善。
分享到:
相关推荐
本篇文章将深入解析这段代码所涉及的关键知识点,并通过实际案例帮助理解如何使用Struts2中的`<s:if>`标签进行逻辑控制。 ### Struts2概述 Struts2是基于MVC设计模式的Web应用开发框架,它提供了丰富的标签库以及...
### IF-ELSE条件语句的翻译程序设计报告书 #### 1. 引言 本设计旨在通过设计、编制及调试一个针对IF-ELSE条件语句的语法及语义分析程序,来加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法...
1、问题描述 1 2、问题分析 1 3、词法分析 1 3.1总体分析 1 3.2具体分析 1 4、文法描述 2 5、语法分析方法描述及语法分析表设计 3 6、中间代码形式的描述及中间...9、收获与心得 13 10、参考文献 14 11、附源代码 14
1. **基本语法**:包括变量定义、数据类型、运算符、流程控制(如if-else,switch,for,while循环)等。 2. **指针**:深入讲解指针的概念,如何声明、使用及操作指针,以及指针与数组、函数的关系。 3. **内存管理...
if(i==(each-1)&&writeStringToBytes.length%tempLength!=0){ System.arraycopy(writeStringToBytes, i*tempLength, temp, 0, writeStringToBytes.length%tempLength); ops.write(new String(temp,...
else if+语句2;...;else if+语句N;else+语句;。除此之外,还了解了两种都可以运行但优劣不同if语句的代码风格。当然,我自己在学习的时候也会跟着老师敲部分代码,挺有趣的,并且在自己动手的过程中会发现自己写的...
### 关于eWebEditor常见问题及其个人使用心得 #### 一、引言 eWebEditor是一款功能强大的在线富文本编辑器,广泛应用于网页设计、内容管理系统(CMS)等领域。然而,在实际使用过程中,用户可能会遇到一些兼容性...
在开始个人项目之前,通常需要对Python的基础语法有深入理解,如变量、数据类型、控制结构(if/else、for、while)、函数、类和模块的使用。这些基础知识是构建任何项目的基石。 描述中虽然没有具体信息,但可以...
关于缓存的一点心得 一、缓存的基本概念与分类 缓存技术是现代软件开发中提高系统性能的重要手段之一,特别是在Web应用中扮演着关键角色。根据存储内容的不同,缓存可以分为两大类:页面缓存和数据缓存。 1. **...
Winform 项目开发心得是指在使用 Winform 进行项目开发时所需了解和掌握的技术要点和经验总结。以下是 Winform 项目开发中的重要知识点: 一、登录界面验证成功后进入主界面 在 Winform 项目中,登录界面验证成功...
- 学习流程控制语句(if/else、for/while 循环等),这是编写任何程序的基础。 2. **面向对象编程**: - 理解类和对象的概念,学会如何定义类以及创建对象。 - 学习封装、继承和多态等面向对象的特性,并能够在...
### Vue.js 学习资料与心得 #### 一、Vue.js 基础结构与配置 在学习 Vue.js 的过程中,首先要理解其基础结构。一个典型的 Vue 实例由多个部分组成,包括 `el`(元素)、`data`(数据)、`methods`(方法)等。 1....
- **逻辑结构**:程序的基本逻辑结构包括顺序结构、分支结构(如IF…THEN…ELSE)和循环结构(如FOR…NEXT)。 - **子程序与调用**:理解子程序的概念以及如何调用子程序。 - **编程视角**:不同级别的编程任务有...
4. **控制流程**:包括条件语句(if-else,switch-case)和循环结构(for,while,do-while),它们决定了程序的执行路径。 5. **函数**:函数是C语言中的模块化单位,可以封装一段代码并重复使用。函数定义、调用...
### 《编程之法:面试和算法心得2》算法心得 #### 第四章 查找匹配 本章节主要探讨了两种常见的查找技术:有序数组的查找和行列递增矩阵的查找。这两种查找方法不仅在面试中频繁出现,而且在实际开发过程中也具有...
此外,理解控制流程是至关重要的,如条件语句(if-else)和循环结构(for、while)。掌握这些基础知识是编写任何Java程序的前提。 接着,类与对象是Java的核心概念。面向对象编程(OOP)使得代码更加模块化和易于...
2. **条件判断**:使用`if`、`else if`、`else`来实现条件分支。 3. **循环控制**:`for`、`while`、`do...while`循环。 4. **跳转语句**:`break`用于退出循环,`continue`用于跳过当前循环中的剩余代码块并进入下...
### 预处理命令的学习心得 在学习编程的过程中,预处理命令是不可或缺的一部分,尤其是在C语言这样的编程环境中。本文将详细介绍预处理命令的基本概念、用途以及一些常见的应用场景,旨在帮助初学者更好地理解并...
此外,我们还需要了解C语言的编程技巧,如ifelse和switchcase的使用等。 知识点: * C语言的语法根底:变量的定义方式、语句的格式和形式等 * C语言的编程技巧:ifelse和switchcase的使用等 C语言学习心得体会五...