首页
学习
活动
专区
圈层
工具
发布

为什么if-else会影响我的代码的复杂度

关于if-else的争议 我之前写了一篇文章《我用规则引擎消除if语句,提高了代码的可扩展性》,这篇文章我想阐述的观点是复杂的if语句可能会影响代码的阅读和代码的扩展性,会将非业务的条件逻辑与业务逻辑混合在一起...时间长了代码会越来越臃肿,因此这种情况下我推荐使用一些设计模式例如策略模式,责任链模式等去优化if语句带来的问题,文中我发现使用规则引擎也能实现类似效果,因此介绍了怎么使用规则引擎Easy Rules去取代...这里我要阐明我的一个观点: “我的观点并不是说,我们在编码时不能使用if-else,而是说我们不应该简陋地用if-else去实现业务的分支流程,因为这样随意的代码堆砌很容易堆出一座座"屎山"。...” 当我们存在不同的业务逻辑时,我们通常习惯使用if-else来实现这些不同的逻辑,时间长了,代码就会难以维护。我相信大部分人写过下面类似的代码。...condition2 && condition3 && condition4) { do4(); } 其实if-else 以及类似的switch控制语句,本质上是一种硬编码行为,这种硬编码问题在于当需求发生改变时

2.5K10

问问问答答答!

为什么可以用 4 位的「首部长度」字段来定义 TCP 包头的长度? 我的回答: 首先,「首部长度」字段确是定义 TCP 包头的长度的,但是不是你这样计算的。...我的回答: 如果 seq2 和 seq3 都丢了,接收方收到seq4会回ack2,收到seq5会回ack2,seq6会回ack2。...自旋锁为什么是悲观锁,而不是乐观锁? 我图解系统里提到,自旋锁是悲观锁,然后有个读者说自旋锁底层是 CAS 实现的,为什么不是乐观锁呢? 我的回答: 乐观锁是先修改同步资源,再验证有没有发生冲突。...例如,当数据到达但检查时校验和错误并被丢弃时,可能会发生这种情况。可能存在文件描述符被虚假报告为已就绪的其他情况。因此,在不应阻塞的套接字上使用 O_NONBLOCK 可能更安全。...当客户端发送另一个请求时,它会使用同一个连接。这一直继续到客户端或服务器端提出断开连接。

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

    Python API 优化,缓存API,解决request重复请求!

    在写代码之前,得先明白 “为什么” 和 “选什么”,不然写出来的东西可能不适用自己的场景。1....省流量 / 省钱:重复请求会浪费网络带宽,要是调用的是第三方付费 API(比如天气、地图 API),重复请求就是直接烧钱。...第一步:写个 “没缓存” 的 API 调用,感受下痛点先写个最基础的代码,不做任何缓存,看看重复调用的耗时 —— 这样才能对比出缓存的好处。...这是最简单的办法,适合数据更新不频繁的场景,缺点是过期前会有短暂的不一致;第二种是 “主动更新缓存”,比如后台有个 “更新产品数据” 的功能,当管理员更新产品后,程序会主动删除这个产品对应的缓存文件。...最后,为了帮你更快落地,我可以帮你整理一份 《API 缓存实战代码模板》,包含带参数缓存、缓存清理、异常处理的完整代码,你以后做项目直接复制修改就能用。要不要我帮你整理一下?

    20110

    这些不会的话,就别去面试了

    回答时想不起来,最后俩周没消息。这里想说一下,俩周没消息,面试基本凉了。...关于这部分多线程知识的学习,我强烈建议一步一个脚印,一行代码一行代码的敲,当你对这块的知识理解达到任你出题千万,我一眼看破本质的地步,那你面试基本和玩似的。 ?...一般情况下会这样,但如果面试官提了如何优化数据库,你回答了索引,那数据库索引底层的原理你就不得不去了解了。...也许你会回答哈希表或者B+树,那问题又来了,来同学,说一下B+树,你整一句:B+树的内节点只存放key,只有叶子节点存放数据。虽然也不错,但是如果能回答的更具体一些,我觉得你会让面试官对你双眼一亮。...脏读、不可重复读、幻读 也是必须会的。为啥?没有这三个问题,就没有解决这三个问题的隔离机制。 未提交读、已提交读、可重复读、串行。

    85021

    程序员不仅要学会百度,更要懂得提问

    认真思考问题的解决方案 当问题特别明显,只要有动脑就能解决这个问题时,没有人会喜欢回答这种基础问题, 例如: 当你知道echo "hello world"语句,却不知道怎么输出"EasySwoole天下第一...同样,当一个问题直接搜索就能出现答案,却一直拿出来问时,没有人会给伸嘴党喂饭,这是对回答者的一种侮辱 请在提问的时候,先尝试在搜索引擎中搜索,或许答案就在第一页 开发手册 当你在搜索引擎没有找到一些...问题的基础 千万不要问你对该问题一无所知的问题,当你没学过php时,请不要问为什么if(){}括号里不加条件就会报错的问题 当你提出一个问题的,该问题相应的基础你应该要会,否则你会被人耻笑....例如: 当你上传文件这个逻辑出现问题时,你问:"为什么我没法上传文件",是没有人能回答的了你的,你得自行排查,直到一个小范围. 例如: 上传文件,选择文件之后,发生错误....为什么协程要是用mysql连接池 等 代码问题 代码问题,我们需要截图代码,以及报错信息,并且说明自己要实现什么功能,例如: 我想要实现文件上传,我已经尝试了修改权限,但是不知道为什么代码会报错(附上错误信息

    1.2K20

    Java高频面试题- 每日三连问?【Day11】 — 集合容器篇(三)

    ② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小(HashMap 中的 tableSizeFor()方法保证,下面给出了源代码...底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于64,那么会选择先进行数组扩容,...当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。...正经回答: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode...,HashSet 会假设对象没有重复出现。

    46620

    60行代码爬取知乎“神回复”,句句戳中泪点

    知乎上的回答太多了,一下子爬取所有的回答会很费时,我们可以选定几个话题,爬取这几个话题里的内容。...A: 程序员女朋友颜值高,我是服的,因为随便问十个程序员他的女朋友是谁,有九个回答是新垣结衣 17 Q: 为什么一部分人宁可买几个机械键盘换着用,也不愿意给自己敷一下面膜? A: 老子不靠脸吃饭。...老子的辛辛苦苦挣来的钞票。老子想怎么花就怎么花。 18 Q: 程序员夫妻结婚戒指刻什么字好? A: 0 error 0 warning 19 Q: IT 工程师被叫「码农」时是否会不舒服?...A: 当他拼着自己早已养成的寡言少语的习惯去死命的跟你套近乎的时候 36 Q: 为什么程序员不应该会修电脑? A: 范冰冰需要会修电视机吗?...A: 实不相瞒,我也不是装逼:我的 C++ 水平全国第 0。 38 Q: 为什么 iPhone 删软件时,所有图标都要抖?

    1.2K10

    HashMap的工作原理

    面试官可能会问出下面的问题: “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”...你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。...当获取对象时,通过键对象的equals()方法找到正确的 键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    71010

    网络层—简单的面试问题

    这是无量测试之道的第190篇原创 TCP 在面试的时候,如果问大家,TCP 的三次握手,大家一般准备下,都会很容易的回答上这个问题。但是如果这样问:TCP 为什么要三次握手,二次行不行?你还会吗?...2.等待一段时间后,发现没有接受到服务端的ack确认报文时,客户端会启用超时重传策略,重新syn发送报文给server。...但是当后续的某个时候,服务端收到了之前因为超时而晚到的syn报文,server端就认为又要建立一个连接。这就出现问题了。 问题2: TCP 是怎么保证可靠传输的? TCP 是怎么保证可靠传输的?...(怎么保证报文:无差错、 不丢失、 不重复、 按序到达) 可靠传输在 TCP 层面是通过【停止等待协议】实现的: 无差错情况 无差错情况下,客户端会按顺序的发送一个报文,得到 server 端响应后发送下一个报文...【如果回答 get 的请求参数是拼接在url后面,post是放在方法体里面的,这是非常简单的,需要回答专业和深刻点,按照语义来,(安全、幂等、可缓存的)】 今天的分享就到这里了,最近在整理这些面试题的时候

    35110

    HashMap的工作原理

    面试官可能会问出下面的问题: “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”...你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。...当获取对象时,通过键对象的equals()方法找到正确的 键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    57320

    面试官问:为什么kafka这么快,又能保证消息不丢失?

    面试官: 我看你项目中用到了kafka,你觉得你这个场景一定需要kafka吗,有没有其它替代方案?...面试官似乎还想在kafka上为难小菜鸡: 那你知道为什么kafka这么快,又能保证消息不丢失? 小菜鸡实在没有过多的接触过kafka,只能投降了。 要回答上述问题,需要对kafka有较深入的理解。...Kafka 采用的是至少一次(At least once),消息不会丢,但是可能会重复传输。...当设置为 async,会大幅提升性能,因为生产者会在本地缓冲消息,并适时批量发送。 如果对可靠性要求高,那么这里可以设置为 sync 同步发送。...消费消息 如果更注重可靠性,则需要显示提交 Offset,也就是当所有业务都处理完成的时候,再提交 Offset。这样会导致重复消费,需要提供幂等性接口。 为什么 Kafka 性能高?

    2.2K10

    HashMap的工作原理

    面试官可能会问出下面的问题: “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”    ...你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。”    ...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。    ...当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    76330

    为什么C语言会有头文件

    前段时间一个刚转到C语言的同事问我,为什么C会多一个头文件,而不是像Java和Python那样所有的代码都在源文件中。...其实我在准备这些例子的时候也是这样,很多时候没有注意相关代码的顺序导致报错,而针对重复定义的报错很难排查。...C语言编译过程 在上面我基本上回答了为什么需要一个头文件,但是本质的问题还是没有解决,为什么像Python这类动态语言也有对应模块、多文件,但是它不需要像C那样要先声明才能使用?...编译完成之后进行链接,首先扫描所有的obj文件,先查找main函数,然后根据main函数中代码的执行流程来一一组织代码结构,当碰到之前保留的符号时,去所有的obj中的符号表中根据变量符号查找对应的地址,...当它发现找到多个地址的时候就会报重复定义的错误。

    2.6K50

    实现一个基本的计算器来计算一个简单的字符串表达式 s 的值

    ,思路是大同小异的,你看前几步代码都差不多,但是为什么写出来差别这么大呢!!!...undefined 之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。undefined 设回答了 "2" 的兔子为蓝色。...看了人家写的才发现这个题用dp确实挺合适。。而且我特意挑了一个注释写的很全的代码贴出来的。dp其实也是一步一步往下走,但是因为记住了每一步,所以有一些重复数据是不用来回来去计算的了。...我去琢磨琢磨为什么是上一个*2+上上上一个。...好吧,我果断没琢磨出来,所以这里看了题解,并且看题解都找了好几个才懂,大概的思路下面一点点说: 我们求dpn时 考虑从dpn-1基础上补2×1列图案,只有用1个多米诺的1种方案; 考虑从dpn-2基础上补

    2.3K30

    想成为Python专业开发者?这些核心知识点必须吃透!

    三、使用 Python 多态时的常见坑虽然多态很好用,但新手很容易踩坑,我总结了几个常见问题:1. 接口不一致导致多态失效最常见的错误是,不同类的同名方法参数不一样。...比如给完全不相关的类强行加一个同名方法,结果后来维护代码的人根本看不懂为什么这两个类会有同一个方法。记住:多态是为了让 "相似的对象" 能被 "统一处理",不是为了强行统一不相关的对象。3....四、面试常考问题及回答技巧这些知识点在 Python 面试中经常被问到,我整理了几个高频问题和回答思路:问题 1:int ()、str () 这些函数不带参数时返回什么?...回答思路:重点说接口一致性:同名方法的参数要一致。提一下不要过度使用,保持代码可读性。可以说一个自己踩过的坑(比如上面说的参数不一致问题),显得更真实。...问题 4:为什么说这些默认行为(int () 返回 0 等)体现了多态?回答思路:因为这些都是类型名()的调用方式(同一个操作)。

    18200

    为什么永远不要用 from module import _?

    下次你用Series时,发现它变成了函数,不是列表,代码直接报错,你还得回头查 “我没改代码啊,怎么突然变了?”三、澄清误区:from module import * 会占用更多内存?错!...& 怎么回答(加分技巧)面试 Python 岗时,导入相关的问题很常见,尤其是考察你对 “规范” 的理解。...下面的问题和回答思路,结合前面的知识点,保证你能答到点子上。1. 为什么不推荐用 from module import *?回答思路:分点说核心风险,结合实际场景,别只说 “不好用”。...“主要有 3 个原因,都是实际开发中会踩的坑:容易发生命名空间冲突:比如自己写了个get函数,又从 requests 导入get,会覆盖掉之前的,报错都不知道为啥,排查成本高;代码可读性差:别人看代码时...为什么?回答思路:先明确 “错”,再讲 Python 模块加载机制,破除误解。

    38210

    关于多线程中抛异常的这个面试题我再说最后一次!

    这个题是我遇到的一个真实的面试题,当时并没有回答的很好。然后通过上面的文章,我在源码中寻找到了答案。 先给大家看两个案例。 sayHi 方法是会抛出运行时异常的。...当执行方式是 execute 方法时,在控制台会打印堆栈异常: ? 当执行方式是 submit 方法时,在控制台不会打印堆栈异常: ? 那么怎么获取这个 submit 方法提交时的异常信息呢?...然后一个读者找我聊天,说为什么他这样写,通过 future.get 方法没有抛出异常呢,和我文章里面说的不一样呢? 我说:那肯定是你操作不对,你把代码发给我看看。 ?...我回答到:你这不是把会抛出运行时异常的 sayHi 方法用 try/catch 代码块包裹起来了吗?异常在子线程里面就处理完了,也就不会封装到 Future 里面去了。...他还追问到:怎么实现的呢?为什么当 submit 方法提交任务的时候,子线程捕获了异常,future.get 方法就不抛出异常了呢? 其实听到这个问题的时候都把我干懵了。

    1.3K10

    经常被问到的有深度有内涵的数据结构面试题

    从这里开始,真正的困惑开始了,一些面试者会回答因为hashcode相同,所以两个对象是相等的,HashMap将会抛出异常,或者不会存储它们。...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...面试官会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?除非面试者直到HashMap在链表中存储的是键值对,否则他们不可能回答出这一题。...你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?

    1.1K90
    领券