首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

过多 if-else 分支的优化

我想谈一谈这个话题是因为我的上一篇博客在 ITEye 上有一些朋友回复,说 if-else 过多的分支可以使用 switch 或者责任链模式等等方式来优化。...反之,某一些精巧的设计,可能会带来可阅读性和可理解性下降的问题。 寻找代替分支判断的方式 接下去我们再来考虑怎么样去重构优化过多的 if-else 分支。 程序逻辑最基本的组成就是分支、判断和循环。...而过多 if-else 正是由于在某一个变化的点上,有许多判断条件和结果分支造成的。所以最基本的解决办法就是把多个判断条件合成一个,也就是把若干个分支合成一个。...当然,这样的方式经常被用来做从字符串到具体对象的转换。 还有一些朋友说的这个模式那个模式来解决多 if-else 的问题,这些都是正确的,当然本质上也无一例外基于多态来实现的,所以我就不提及了。...Java 最有价值的地方不是它的语义语法也不是它的虚拟机跨平台和有多高性能,而在于它的社区它的无比丰富的类库,在于使用它的人可以从设计上和宏观上去思考问题。

60710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL 某状态耗时过多的优化

    引言 此前的文章中,我们介绍了 mysql 最常用的存储引擎 — innodb 的性能优化。 主要围绕参数、索引设置等方面进行。...Mysql Innodb 性能优化 事实上,在实际使用中,最为常见的性能问题大多是不合理的使用方式,即 sql 语句的问题引起的,因此与参数、索引优化相比,直接优化和修改 sql 语句获得的收效往往更加明显...本文,我们就来看看如何查看 mysql 中正在运行的 sql 语句的状态,以及如何进行相应的优化。 2. 查看 sql 执行状态 2.1....如果表是在内存中创建的,但稍后被转换为磁盘上的表,则该操作期间的状态将复制到磁盘上的tmp表 4. closing tables 时间过长 closing tables 通常是因为磁盘 IO 能力不足引起的...临时表的创建条件 UNION查询; 用到TEMPTABLE算法或者是UNION查询中的视图; ORDER BY 和 GROUP BY 的子句不一样时; 表连接中,ORDER BY 的列不是驱动表中的;

    1.5K20

    Javascript错误处理

    try/catch try/catch语句是js处理异常的一种方式,它非常好理解,try里面是写我们的代码,catch是我们try中的代码如果出错怎么显示报错。...注意:当我们使用try/catch方法的时候,浏览器会认为错误被处理了。它很像php里的@ 屏蔽错误。这样只有我们程序开发者才能知道错误,用户是不知道的。...八种错误类型 一、Error Error是基类型,其他错误类型都是继承该类型,主要用于自定义错误类型 二、InternalError InternalError类型的错误会在底层JavaScript引擎抛出异常时由浏览器抛出....例如,递归过多导致了栈溢出.这类型并不是代码中通常要处理的错误。...,如-20.又或者没有给递归设置停止条件时触发.

    82930

    帮你干掉过多的if-else

    日常开发,if-else语句写的不少吧??...当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势...:干掉过多的if-else!!!...本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 融入策略模式; 策略模式+工厂+单例模式,锦上添花; 接下来先附上一段很久以前自己写的业务代码,核心逻辑就是在支付回调中根据用户购买的价格包赋予用户对应的权益...,用户充值后根据价格包(付的多少钱)给用户增加VIP天数及抽检机会次数的逻辑,我这里就简化成"根据-价格包区分给用户增加不同的体育会员视频VIP天数"这个动作来讲解: 表面上看,代码稍微优雅了点

    47441

    TIME_WAIT状态过多的排查

    第二个按照以往的性质,在很少用户访问的情况下,服务器的资源几乎没有使用,比如CPU,不超过5%。现在没有什么用户的的情况下,CPU损耗坚持在40%左右,夜间也不停歇。...-2状态;第三次还是被动方等自己的应用断开连接的时候,发送FIN信号给主动方,被动方的状态变成LAST-ACK;第四次是主动方收到被动方的FIN信号,然后发送的ACK信号,瞬间自己变成TIME-WAIT...好的一点是后端是docker容器,分开的。 (一)TCP连接上的IP 1.下图是容器的IP 命令:for i in $(docker ps|awk 'NR!...对API的请求是600,对nginx的请求是300,说明所有的TIME-WAIT,一部分是请求nginx的,一部分是nginx请求API的。...webserver占用的CPU上升,刚好就说明容器使用的系统资源就是由这种请求引起的。下面用tail看看api的access日志。 ?

    3.6K00

    kafka分区数过多引发的弊端

    上篇文章我们了解到,如果一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。那么,分区数越多就越好吗?显然不是。今天我们来聊下kafka在分区数过多的情况下,会带来哪些弊端。...假如有 10000 个分区,按照默认配置,这部分缓存就要占用约 157MB 的内存。而consumer端呢?抛开拉取数据所需的内存不说,单说线程的开销。...因此,如果分区数越多,所需要保持打开状态的文件句柄数也就越多,最终可能会突破单台broker的ulimit -n的上限。...如果宕机的是controller节点,不可用时间将会更严重。 上述问题,通常情况下,都可以通过扩容集群来缓解,毕竟在不考虑成本的情况下,堆机器可以解决 90%的问题。...当然正常情况,还是得在合理的成本范围内,进行合理的规划和调优,上述弊端一般都是能在可控范围内的。

    5.8K20

    4.3递归运行的机制:递归的微观解读

    前言:在4.1节和4.2节中我们分别通过数组以及链表对递归进行了应用,那时我们只是对递归进行了宏观理解--递归是将问题化为更小问题的子过程。...这一节我们对在4.1节中递归在数组中的应用和4.2节中递归在链表中的应用进行微观解读: 一.关于4.1节中递归在数组中的应用 1) 我们先来看看4.1节中的代码实现,如下图: ?...2)现在我们对已经拆分的代码进行分析为此来说明:递归函数的调用,本质就是函数调用。  ...通过递归得到了我们最终的结果为16。 从上述的过程中印证了:递归函数的调用,本质就是函数调用(自身函数)---也就是使用不同的参数,执行相同的逻辑。...到此递归调用得以结束,完成过程如下: ? 递归的调用是由代价的:函数调用(时间开销)+系统栈空间,但是使用递归书写逻辑是更为简单的。  关于本小节,若您觉得还行、还过得去,记得给个推荐哦~,谢谢!!

    44720

    TIME_WAIT过多的解决办法

    TIME_WAIT存在的两个理由: 1 可靠的实现TCP全双工连接的终止 2 允许老的重复的分节在网络上的消逝 第一个:如果客户端不维持TIME_WAIT状态,那么将响应给服务端一个RST,该分节被服务器解释成一个错误...如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确的处理。执行主动关闭的那一端是处于TIME_WAIT状态的那一端。...TCP必须防止来自某个连接的老的重复分组在该连接已经终止后再现,从而被误解成处于同一个连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。...TIME_WAIT状态的持续时间是MSL的2倍,使得某个方向上的分组最多存活MSL秒被丢弃,另一个方向上的应答最多存活MSL秒被丢弃,这样保证每建立一个TCP连接的时候,来自连接先前的化身的老的重复分组都已在网络中消逝...基本意思是这个用于防止Dos攻击,我们不应该人工减少,如果网络条件需要的话,反而应该增加。 但其实对于我们的局域网或者公司内网应用来说,这个风险并不大。

    1.1K20

    递归求数组的和_java递归教程

    大家好,又见面了,我是你们的朋友全栈君。 使用递归实现数组求和示例分享 思路如下: 给定一个含有n个元素的整型数组a,求a中所有元素的和。问题的难点在于如何使用递归上。...此时可以完成递归功能。总之,递归就是在某个函数的执行过程中首先判断它的终止条件参数,终止条件参数满足终止条件则执行完毕,终止条件参数不满足终止条件则调用它自身执行某项运算,比如这里求和就是执行加法。....在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解....你定义函数f(n)=nf(n-1) 而f(n-1)又是这个定义的函数..这就是递归 二.为什么要用递归:递归的目的是简化程序设计,使程序易读 三.递归的弊端:虽然非递归函数效率高,但较难编程,可读性较差....递归函数的缺点是增加了系统开销,也就是说,每递归一次,栈内存就多占用一截 四.递归的条件:需有完成任务的语句,需满足递归的要求(减小而不是发散) 五.递归进阶: 1.用递归算n的阶乘: 分析:n!

    1.3K40

    二叉树的非递归遍历(递归和非递归)

    因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...1.递归实现 void in_order(BTree* root)     {     //必不可少的条件,递归的出口  if(root !...1.递归实现 void post_order(BTree* root)     {     //必不可少的条件,递归的出口  if(root !...       后序遍历的非递归实现是三种遍历方式中最难的一种。

    1.5K100

    递归的使用

    1 引言 递归函数更实用于有规律的多项式数组,它可以让你的求和更方便,就如同高中学习的等差和等比数列,了解递归,你就可以用程序来做高中的数列题,还可以在你的弟弟妹妹面前装一手。...当n = 1,返回1.当n = 0,返回0,当n > 1,使用递归 4实验结果与讨论 通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。...return 0 elif x == 1: return 1/1 else: return 1/x + f(x - 2) a = int(input()) print(f(a)) 5 结语 了解和使用递归函数...,代表你对函数的定义域使用都有了一定的基础,这对以后的python学习大有益处,使用递归函数,你首先要了解算法,找出规律。...这就需要我们多加练习,加强对算法的敏感度

    52610

    解决TCP连接数过多的问题

    解决TCP连接数过多的问题 TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题 TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着...上面我碰到的这个问题主要因为TCP的结束流程未走完,造成连接未释放。...此问题的典型特征是: 一端处于FIN_WAIT2 ,而另一端处于CLOSE_WAIT. 不过,根本问题还是程序写的不好,有待提高 ---- CLOSE_WAIT,TCP的癌症,TCP的朋友。...断开连接的时候, 当发起主动关闭的左边这方发送一个FIN过去后, 右边被动关闭的这方要回应一个ACK,这个ACK是TCP回应的,而不是应用程序发送的, 此时,被动关闭的一方就处于CLOSE_WAIT状态了...只有被动关闭的这一方调用了 closesocket,才会发送一个FIN给主动关闭的这一方,同时也使得自己的状态变迁为LAST_ACK。  比如被动关闭的是客户端.

    5.5K20

    该不该扼杀过多的if-else

    面对过多的if-else,代码可能看起来比较冗余,搞不好又是一张被人到处转发的“我们项目几百几千行if”的图。但是经过各种设计模式和封装,if大大减少,但可读性可能稍微降低了,而且比较抽象。...那我们应该如何取舍呢 抛开其他因素,如果if-else过多,可读性也许会好也可能会降低,可维护性也是或高或低;如果if-else少,代码高度抽象,可读性会低或者不变,可维护性可能会高也可能会低。...这里大概可能会有几种情况 if平铺条件单一 这种情况,if精简不精简,可读性是不会变的,但是精简程度和可维护性是正相关的。至于为什么,看一下代码就可以感受到了 ?...如果后面业务逻辑,的确是以type为主导的,那重构也是早晚的事情了。...所以,前期的设计以及产品逻辑,将会决定后面的维护舒服不舒服了 小结: if条件有嵌套情况,拆分if,其实就是平铺的if嵌套平铺的if,如果有规律可循,那么按照前面的平铺来减少if。

    65110

    关于如何清理过多索引的思考

    今天同事提了一个问题,还是值得思考的,某个作为数据分发的MySQL库,有时候需要在不同的环境中同步创建数据库,但受工具限制,只能做数据同步,索引这些对象则需要单独创建,该数据库的索引太多,导致生成过程非常地耗时...(2)如果是具有一定优化经验的同学,可能会根据SQL中用到的条件,创建索引,但是有可能根本就不管这张表之前都创建了什么索引,当前是否有必要再创建一个索引,只是针对正在开发的这条SQL语句,需要创建什么字段的索引...索引多了,影响的是索引字段增删改维护索引的成本(注意:这里说的是索引字段的增删改,例如update一个非索引字段,不会产生索引维护的操作,因此这是比较严谨的说法,但是insert/delete,通常都是会涉及到所有的字段进而影响所有的索引...,查询使用索引条件的语句是否执行过,或者对应索引的执行计划是否出现过,间接得到判断的线索。...MySQL服务器操作场景》 《一个job问题引出的Oracle官方文档的差错》 《来自二阳人的一些感想》 近期的热文: 《推荐一篇Oracle RAC Cache Fusion的经典论文》 《"红警

    20120

    函数的递归

    1.递归思想: 把一个复杂的问题拆分成一个一个小的问题,直到小的问题不能再被拆分。 递是传递的意思,归是回归的意思,下文举例说明。 1条件: (1)递归存在条件,当不满足这个条件时就停止递归 。...(2)每一次递归都会越来越接近限制条件。 2.举例 1.1计算一个数的阶乘 (1)一个数的阶乘是从1开始一直乘到这个数为止,例如5!=1*2*3*4*5,n!...的阶乘就是n*(n-1)*(n-2)*........*1,这是一道数学问题,要把他转化为编程逻辑,一般 先想到的是循环,从1一开始一直乘到n结束,使用递归也同样简单,如图 利用这种方法完成递归,首先创建一个子函数...=1,10%10=2, 1<10,取余自然是1本身  我们可以想到每次把a取余的数放在一个数组中,最后在逆序打印这个数组,这个办法简单,但是执行起来编写的代码较多,较为麻烦,此时利用递归可以刚好解决这个问题...,却能执行复杂的计算,一定程度上为程序员节省了时间,但是递归有时也有缺点,计算过程复杂导致计算慢,更多的需要程序员去探索

    5710
    领券