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

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

关于if-else的争议 我之前写了一篇文章《我用规则引擎消除if语句,提高了代码的可扩展性》,这篇文章我想阐述的观点是复杂的if语句可能会影响代码的阅读和代码的扩展性,会将非业务的条件逻辑与业务逻辑混合在一起...时间长了代码会越来越臃肿,因此这种情况下我推荐使用一些设计模式例如策略模式,责任链模式等去优化if语句带来的问题,文中我发现使用规则引擎也能实现类似效果,因此介绍了怎么使用规则引擎Easy Rules去取代...if-else增加了代码复杂度 文章发布后,有很大一部分读者认为只用设计模式会增加代码阅读性,还是会觉得if-else好,就算if写得再复杂,也要使用if-else。...实际工作中,能见到一个方法包含10个、20个甚至更多的逻辑分支的情况。...从软件设计角度讲,代码中存在过多的 if-else 往往意味着这段代码违反了违反单一职责原则和开闭原则。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷。所以,软件系统的扩展性是非常重要的。

1.5K10

为什么在代码运行时会出现内存溢出的错误,如何有效地避免和处理这种情况?

在代码运行时出现内存溢出的错误通常是由于程序使用的内存超过了系统的可用内存限制。...内存泄漏:当程序使用动态分配的内存块,但在使用完毕后未及时释放,就会导致内存泄漏。内存泄漏会逐渐耗尽可用内存,最终导致内存溢出。为避免内存泄漏,应确保在使用完毕后及时释放不需要的内存块。...内存过度分配:如果程序在运行时分配了过多的内存,超出了系统可用的物理内存或虚拟内存限制,就会导致内存溢出错误。为避免这种情况,可以评估程序的内存需求,尽量减少内存使用,合理分配内存空间。...为有效避免和处理内存溢出错误,可以采取以下措施: 避免无限递归,确保递归函数有递归终止条件。 及时释放不需要的内存,避免内存泄漏。 使用合理的数据结构和算法,减少对内存的需求。...对于某些特殊情况,可以考虑增加系统的物理内存或虚拟内存限制。 总之,避免和处理内存溢出错误需要综合考虑代码逻辑、内存管理和资源限制等因素,采取合理的措施来优化程序和管理内存。

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

    关系型数据库之oracle

    而数据库还在持续发展中,逐个举例肯定行不通,因为我也不知道,而且查资料找出来大家也不怎么会用到。那么我们就来搞搞我们很大几率能够用到的。今天就来搞搞关系型数据库中三大经典之一的oracle数据库。...数据库中常称为主键,由一个或多个列组成(多列组成的也可以称为联合主键)。 关系模式:指对关系的描述,其格式为:关系名(属性1,属性2,…,属性N)。在数据库中通常称为表结构。...因为这些很重要,我们放在后边细细的去搞。 02 — oracle实际使用 就如上边所说,我们今天的文章定位就是实际使用中可能会遇到的问题。...启动sqlplus,然后登陆数据库出现错误:TNS:协议适配器错误 原因有3个: (1).监听服务没有启动:services.msc或开始—>程序—>管理工具—>服务,打开服务面板:启动oraclehome92TNSlistener...关于基本使用我们就说到这里,后续会详细跟进上边提到的还有没提到的知识点。

    1.5K30

    sqlplus登录缓慢的问题分析过程及解决小记

    因此,判断该系统就是在sqlplus登录的时候才可能出现卡顿。 由于客户的业务并未反馈使用有问题,所以当时仅将该问题记录到日常错误处理日志中。...但是过了几天后,突然客户的业务使用人员说,他们的某功能经常出现连接超时问题。这个时候,我就很肯定业务也受到了sqlplus登录缓慢所带来的影响。于是专门翻出这个问题进行进一步的分析和排查。...sqlplus在登录的时候会解析DNS,而在解析这一步耗费的时间较长,从而影响了sqlplus登录过程所消耗的时间。...为什么会导致这么慢?此时我也有点无从下手了,还好有公司二线专家,请教了二线专家后,让我在strace中在加入-Fr参数,更近一步的去fork调用的子进程。...而经过查询,发现mmap函数主要是Linux下内存映射到文件的一种方法(具体的该函数的内容和功能,我没有详细研究),因此可以猜测,sqlplus登录缓慢的问题,可能出现在内存映射上。

    1.6K71

    一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法

    执行计划的定义:执行目标SQL的所有步骤的组合。 有很多查看执行计划的方法,不仅局限于以下几种。...Outline Data主要是执行SQL时用于固定执行计划的内部HINT组合,可以将这部分内容摘出来加到目标SQL中以固定其执行计划。...oradebug有很多需要说的,首先这是sqlplus特有的命令,在PLSQL Developer中执行会提示无效的SQL语句,例如: ?...,下面简单看看trace文件都包含了什么,为什么说10046这种事件是用于调试的,我现在不能精通所有内容,大概谈谈理解。...BY INDEX ROWID TEST1,我想原因应该是: (a) 对TEST2表的扫描使用的是INDEX FULL SCAN SYS_C0016790,即使用索引全扫描,扫描t1id的主键索引数据块。

    63040

    连接远程数据库ORACLE11g,错误百出!

    客户机中PLSQL DEV访问虚拟机中的ORACLE11g,错误百出! 创建时间: 2017/10/14 18:44 作者: CNSIMO 标签: ORACLE 忙了一下午,只有两个字形容:麻烦!...安装ORACLE1g 首先,我已经提前在虚拟机上配置了windows2008+oracle11g,为什么用server2008呢?...首先使用DCA(在oRACLE的开始菜单文件夹里面,缩写哦),打开后会显示几个选项,选择【创建数据库】,然后下一步,之后的几个步骤一直到创建数据库完毕,并没有出任何错误,所以就不多说了,唯一出现的错误可能就是提示类似...在Net Manager或者NCA中更改监听或者服务名的信息后可能会映射到这两个文件,例如我在Net Manager中更改了LISTEN的地址,在listener.ora文件中是有体现的,可以打开看看,...,例如我通过sqlplus连接的时候将STD.CNSIMO.CN改为STD或者其它随便一个,都会报这个错误。

    1.6K00

    复盘eygle在甲骨文大会上演讲中的示例,看看什么是大师的由点及面

    我想这个案例可以带给我们一些启迪。...换句话说,如果两张表关联,其中一张表的关联列是主键,那么另一张表就是事实表,也就是说另一张表中的列就是可更新的;除非另一张表的关联列也是主键,否则这张表就是不可更新的,如果更新语句涉及到了这张表,就会出现...如果是两张表主键关联,那么无论更新那个表的字段都可以。 其实这个限制的真正原因是Oracle要确保连接后更新的内容可以写到一张表中,而这就要求连接方式必须是1对N或者1对1的连接。...,第一次优化的操作可能相对容易想到,但第二次优化的操作,就需要知道可以有这种语法,而且出现了ORA-01799的错误,还需要知道这种错误的根本原因是什么,才能有可行的解决方法。...但用如下SQL会提示权限错误: UPDATE (SELECT b.name b_name, b.class b_class, a.name, a.class

    52420

    连接远程数据库ORACLE11g,错误百出!

    客户机中PLSQL DEV访问虚拟机中的ORACLE11g,错误百出! 创建时间: 2017/10/14 18:44 作者: CNSIMO 标签: ORACLE 忙了一下午,只有两个字形容:麻烦!...安装ORACLE1g 首先,我已经提前在虚拟机上配置了windows2008+oracle11g,为什么用server2008呢?...首先使用DCA(在oRACLE的开始菜单文件夹里面,缩写哦),打开后会显示几个选项,选择【创建数据库】,然后下一步,之后的几个步骤一直到创建数据库完毕,并没有出任何错误,所以就不多说了,唯一出现的错误可能就是提示类似...在Net Manager或者NCA中更改监听或者服务名的信息后可能会映射到这两个文件,例如我在Net Manager中更改了LISTEN的地址,在listener.ora文件中是有体现的,可以打开看看,...,例如我通过sqlplus连接的时候将STD.CNSIMO.CN改为STD或者其它随便一个,都会报这个错误。

    80600

    一次有意思的错选执行计划问题定位(涉及SYS_OP_C2)

    问题现象: 1. 11g的库,话说有一个应用程序新上线,应用中使用了绑定变量的方式执行一条简单的SQL,例如select a from b where c = :x,c列是该表复合主键的前导列,表定义是...在sqlplus中手工执行SQL,变量使用字面值,例如select a from b where c = 'abc',执行的非常快,查看执行计划,是用的索引范围扫描。 初步怀疑: 1....究竟为什么应用程序运行时,这个SQL使用了全表扫描,但sqlplus执行SQL时却用的索引范围扫描呢? 越来越邪乎了。。。...同样提到了这点,不是Oracle做错了,而是你可能给Oracle的某些错误信息,让其出现了这种错误。...分析一个问题,要有正确的思路,要能抓到问题本质,像这个问题,就是不同方式执行同一条SQL,会有不同的执行计划,那么为什么Oracle选择了错误的执行计划?

    63320

    备库搭建中的一波三折(r7笔记第21天)

    当服务器到了我手里之后,首先就开始准备安装数据库软件,安装前的基本检查很快做完了,需要预先安装的依赖包我看使用yum源已经识别了,我也标示了yes,然后开始克隆安装。...修改后又继续开始克隆安装,这次的错误更奇怪了。...甚至怀疑是不是新机器出现了什么不兼容的地方,因为是比较新的920机器,最后查看了一下操作日志,发现原来原装yum源的时候就出了问题。...就在这种纠结中,最后还是硬着头皮拖了一下,幸亏当时系统负载不算太大,所以这部分归档的影响还比较小,等备库一同步完,就开始开启RFS接收归档,然后马上释放主库的空间。 整个过程也是有条不紊的在进行。...而文件复制较慢的服务器流量情况如下,可以看到两者是相互补充的。至于为什么先开始文件复制的那台服务器就快很多,为什么不是平均这部分资源。自己也没有想明白。 ?

    1.1K40

    实战篇:Oracle分区表之在线重定义

    使用在线重定义的一些限制条件: 必须有足够的表空间来容纳表的两倍数据量。 主键列不能被修改。 表必须有主键。 必须在同一个用户下进行在线重定义。 SYS和SYSTEM用户下的表无法进行在线重定义。...如果中间表有新增列,则不能有NOT NULL约束 DBMS_REDEFINITION包: ABSORT_REDEF_TABLE:清理重定义的错误和中止重定义; CAN_REDEF_TABLE:检查表是否可以进行重定义...2、查看是否能够重定义 需提前确认表是否有主键,表空间是否足够: sqlplus / as sysdba ##查看主键 select cu.* from user_cons_columns cu, user_constraints...14、手动修改重命名索引 此时,原表名的表已经转换为中间表,需要先将原表的索引,rename到其他名字,本次是BAK,需要注意索引名称长度不能过长 sqlplus / as sysdba ALTER index...PARTITION(LUCIFER_P202201); SELECT * FROM LUCIFER PARTITION(LUCIFER_MAX); 可以发现,数据已经根据日期均匀分布在不同的子分区中

    1.4K30

    听说你在等我的ARTS

    为啥呢,因为这个题,有多达6种解法,代码最少的解法,你们猜需要多少行代码?给你五秒钟。 5,4,3,2,1 时间到,知悉算法的你知道吗?哈哈,利用先排序,后查询的办法,只要2行代码。...都是插入数据 对于数据库中没有该字段,两者没有区别 对于数据库中有该字段,insert会报错,save会执行更新操作 若新增的数据中存在主键,insert()会提示错误,而save()则更改原来的内容为新内容...区别 若新增的数据中存在主键,insert()会提示错误,而save()则更改原来的内容为新内容 已存在数据:{_id:11,"username":"user1"},然后继续进行插入操作的话,此时 insert...({_id:11,"username":"user2"}) 会抛出主键重复的错误提示org.springframework.dao.DuplicateKeyException 并且不保存当前的数据 save...({_id:11,"username":"user2"}) user2的内容会覆盖user1 相同点 如果新增的数据中没有主键时,会增加一条记录 已存在数据:{_id:11,"username":"user1

    32610

    记一次线上SQL索引优化及索引选择错误原理分析

    这时我猜想是不是代码中有什么耗时的操作: 这个代码看起来也没有什么特别耗时的操作,getAgentOrderList就是执行那条SQL,getAgentStaffOrderList也试过查询很快,因为有分页...难不成又出现“灵异事件”了?这时我突然想到会不会是分页导致的,我们都知道limit在offset非常大的情况下会导致查询慢,但我们这里还没有翻页,也就是第一页,所以不是这个问题。...除此之外我又想到之前看到过limit和order by连用会出现索引选择错误的问题,于是我在带上limit 0,30在数据库执行刚刚的SQL,果不其然,慢SQL出现了。...本着“知其然还要知其所以然”的原则我查阅了很多资料,都没有完全能解决心中的疑惑,最终自己反复尝试,总算搞明白了。 首先为什么走普通索引更快,而主键索引更慢?...(1000w条)),Mysql就认为使用普通索引更快,因为普通索引预估扫描行数只有不到1.8W条;但是加了limit之后走主键索引的预估扫描行数可能会少于走普通索引的预估扫描行数,导致索引选择错误。

    64710

    深入内核:Oracle数据库里SELECT操作Hang解析

    10049的level值可能会有如下一些组合: 这里因为我要跟踪 sql 硬解析时相关表对象的 library cache lock 的持有情况,所以这里level 值取0x0210=0x0200|0x0010...addr 相同: 这也就意味着在添加主键的整个过程中,Oracle始终会以 exclusive 模式在表 scott.t2 上持有 library cache lock,直到最后主键添加完毕了才释放。...所以在 win32上的10.2.0.1中,在添加主键的过程中会一直阻塞查询(select)操作。 我们来测一下,同时开3个session。...这就验证了我们的结论:在 win32上的10.2.0.1中,在对表增加主键的过程中会一直阻塞对这个表的查询(select)操作。...)中我们可以看出对表t1的 library cache lock 的先后持有模式为: 即大部分时间对表 scott.t1 的 library cache lock 的持有模式都是S,最后才是X,所以这就可以解释为什么在对表

    1.3K100

    sqlplus登录报ORA-06502错误的问题排查和解决

    最近碰见了一个sqlplus登陆报错的问题,我一开始排查问题的方向就错了,不得已,还是请教了dbsnake大师,对于这么一个小问题,就像“小罗的不看人传球”般解决了问题,有因才有果,对于任何事情都成立...当然,我也不是第一次受挫了,归根结底,还是碰见的问题少,对于一些基础原则性知识掌握不够,不能从现象中直接看出本质,导致了方向性上的错误,急也没用,慢慢积累吧,所以还是要总结一下,避免下次再犯同样的错误。...问题描述: 一个11.2.0.4的开发库,用户名是sqlreviewer,密码是sqlreviewer,之前一直可以用,最近出现sqlplus sqlreviewer/sqlreviewer的时候,...问题到这里,可能有的朋友已经猜到大致的方向了,但我开始排查的方向就出了错误,我尝试用strace查看sqlplus的执行,然并卵,尝试创建使用同样位数的用户sqlreviewea,执行sqlplus登录是正常的...sqlplus登录即使出现logon trigger报错,仍可以连接,不会阻止登录,但是这错误会记录在alert.log和trace文件中。

    98330

    我的分页控件(未完,待续)——控件件介绍及思路

    C 主键 我的看法是每一个表都要有一个主键,而且是单一字段的主键(不是复合主键)。...复合主键会带来很多的麻烦,应该尽量避免,方法也很简单,在原来的设计上加一个自增的int字段就可以了,把这个自增的字段最为主键即可。 为什么提倡单一主键呢?...使用PostBack分页的话,在按“后退”的时候会出现“警告: 网页已经过期”的错误页面。...那么为什么不能在程序(分页控件)里面组合SQL语句不呢? 使用存储过程分页有两种方式:一是有一个要分页的页面就写一个存储过程(有100个几乎就要写100个了)。...统计报表的地方好像不需要了。处理好这个基本问题会让您的开打轻松不少吧。 3、 个人感觉 对于我个人来说,这个分页控件就是“核心”了。我在写网站的时候一大半的时间都是在围绕分页控件来做。

    98070

    goldengate同步无主键无唯一索引表的问题以及解决方案--更新关于附加日志

    NULL,这个是不规范造成,从而造成后续数据不一致,出现常见错误1403错误. c:如果增加、删除、修改的是大字段类型的列,例如clob,这个列无法增加附加日志中,那么则忽略附加删除删除与增加问题.但是抽取进程还是要重启来刷新数据字典缓存信息...,但每一条记录所有字段组合是唯一的情况,如果存在2条记录,更新最后一条,如果源与目标记录顺序一致,那么更新会造成错误错误,如果记录顺序刚好相反,那么更新则没有问题.那么这个时候使用keycols是不合适的...这个需要考虑到表结构更改以及增加字段时间,对于新表增加影响会小,但是已存在大表,需要停机窗口来增加字段. 2、使用keycols来指定标识唯一值列(可以是多列),如果选出列无法满足,会出现如下情况 如果存在...2条记录,更新最后一条,如果源与目标记录顺序一致,那么更新会造成错误错误,如果记录顺序刚好相反,那么更新则没有问题.那么这个时候使用keycols是不合适的,没有达到标识唯一的记录,虽然速度会快些,还不如去掉...keycols来保证数据完整性. 3、无主键无唯一表,表结构发生变化,必须删除附加日志,再次增加附加(针对add trandata方式增加,如果是add schematrandata不存在这个问题),否则会出现数据不一致情况

    2.1K30

    《深入浅出SQL》问答录

    如果我只有一张白表,我为什么还要创建数据库? A:SQL语言要求所有的表都放在数据库中,这当然有它的理由。...创建表时使用DEFAULT,可于日后输入缺乏部分数据的记录时自动的填入默认值。 我试着从网络上复制并粘贴查询,但在使用时却一直出现错误信息,我做错什么了吗?...创建表后你就无法真正的改变列的顺序了。最多只能在指定位置添加新列,然后删除旧列,但是这样会失去旧列中的所有数据。 如果我已经创建了主键,然后又意外的想改用另一列呢?...如果我们试着删除主键表中的行或者是改变主键值,而这个主键是其他表的外键约束时,你就会收到错误警告。 所以上面说的那种,我就不能删除了是吗? A:还是可以的,先移除外键行即可。...部分函数依赖:非主键的列依赖与组合键的某个部分(但不是完全依赖与组合主键)。 传递函数依赖:如果改变任何非键列可能造成其他列的改变,即为传递依赖。

    2.9K50
    领券