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

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

关于if-else的争议 我之前写了一篇文章《我用规则引擎消除if语句,提高了代码的可扩展性》,这篇文章我想阐述的观点是复杂的if语句可能会影响代码的阅读和代码的扩展性,会将非业务的条件逻辑与业务逻辑混合在一起...时间长了代码会越来越臃肿,因此这种情况下我推荐使用一些设计模式例如策略模式,责任链模式等去优化if语句带来的问题,文中我发现使用规则引擎也能实现类似效果,因此介绍了怎么使用规则引擎Easy Rules去取代...if-else增加了代码复杂度 文章发布后,有很大一部分读者认为只用设计模式会增加代码阅读性,还是会觉得if-else好,就算if写得再复杂,也要使用if-else。...这里我要阐明我的一个观点: “我的观点并不是说,我们在编码时不能使用if-else,而是说我们不应该简陋地用if-else去实现业务的分支流程,因为这样随意的代码堆砌很容易堆出一座座"屎山"。...屎山代码雏形 上面的代码(基于实际项目的伪代码),大家看了后有什么感想。如果我们需要修改上面的条件逻辑,我相信编码者本人都会被这样的代码绕晕,更不用说后面接手的开发了。

2.2K10

shared_ptr 和 unique_ptr 深入探秘

C++ 中 shared_ptr 和 unique_ptr 是 C++11 之后被广泛使用的两个智能指针,但是其实他们在使用上还是有一些“秘密”的,我根据平时遇到的两个问题,总结记录一些知识。...为什么 unique_ptr 需要明确知道类型的析构函数这个问题是我写 unique_ptr 调试接口的时候才注意到的,之前确实不知道。为什么会这样呢?...sizeof 对 incomplete type 求值会直接编译出错。incomplete type 是指当定义一个变量的时候,不知道应该分配多少内存。...shared_ptr 的封装按理说 shared_ptr.reset 的时候需要 delete ptr 就需要 ptr 的类型(错了请指正),而 shared_ptr 的 template type 可以是...默认构造的时候允许是不完整类型。为什么会这样呢?shared_ptr 怎么处理 Deleter 呢?

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

    C++ 为什么不加入垃圾回收机制

    请读者注意,这里介绍的方法更多的是基于当前标准和库设计的角度,而不是要求修改语言定义或者扩展编译器。 什么是垃圾回收? 作为支持指针的编程语言,C++将动态管理存储器资源的便利性交给了程序员。...关于为什么C++没有垃圾回收以及可能的在C++中为此做出的努力,上面提到的著作是我所看过的对这个问题叙述的最全面的,尽管只有短短的一个小节的内容,但是已经涵盖了很多内容,这正是Bjarne著作的一贯特点...下面一步一步地向大家介绍我自己土制佳酿的垃圾回收系统,可以按照需要自由选用,而不影响其他代码。 构造函数和析构函数 C++中提供的构造函数和析构函数很好的解决了自动释放资源的需求。...,即使在foo函数中发生了异常,str的生存期也会结束,C++保证自然退出时发生的一切在异常发生时一样会有效。...然而,多态性仍然没有解决,我将在另一篇文章专门介绍使用容器管理多态对象的问题。 语言支持 为什么不在C++语言中增加对垃圾回收的支持?

    1.1K30

    计算机考研复试C语言常见面试题「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 本文是我2021年考研时准备的复试面试题,现在拿出来给大家分享一下 觉得好的点个赞哦,毕竟当初我也是整理了好久,改了好几次版本呢 祝大家都上岸!!!!...我当初整理的时候是word,直接复制过来的话代码不会自动变成CSDN的代码块,所以代码我是一段一段重新标记为CSDN代码段的,这样大家看起来舒服点 C语言基础 目录 1、static关键字的作用 2 2...9、c++模板 模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。...此时上述代码会直接报错 shared_ptr shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。...为什么C++默认的析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

    2K30

    Effective C++:规定27:尽量少做动作的过渡

    大家好,又见面了,我是全栈君。...(三)新式转型比較受欢迎,原因: 1,非常easy在代码中被辨别出来。 2,各转型动作的目标愈窄化。编译器愈可能诊断出错误的运用。...为什么会发生这种事情呢? 由于对象的布局方式和它们的地址计算发式随着编译器的不同而不同,这就以为着写出”依据对象怎样布局”而写出的转型代码在某一平台上行得通,在其他平台上则不一定。...优良的c++代码非常少使用转型,我们应该尽可能隔离转型动作。一般是把它隐藏在某个函数内,函数的接口会保护调用者不受函数内部不论什么肮脏龌龊的动作的影响。...请记住: (1)假设能够,尽量避免转型,特别是在注重下来的代码中避免dynamic_cast.假设有个设计须要转型动作,试着发展无需转型的替代设计。

    35220

    十五、智能指针

    为什么要使用智能指针 使用智能指针在C++编程中有几个关键的原因,它们都与内存管理、代码安全性和可维护性有关。...此外,由于智能指针可以自动管理资源,因此可以减少在代码中显式管理资源的代码量,从而降低出错的可能性。...循环引用会导致资源无法被释放,因为两个或多个std::shared_ptr相互引用,导致它们的共享计数永远不为零。...如果此时对象仍被std::shared_ptr所拥有,则lock()会返回一个指向该对象的std::shared_ptr;否则,会返回一个空的std::shared_ptr。...智能指针是现代C++编程中不可或缺的一部分,它们极大地简化了动态内存管理,并帮助开发者编写更安全、更易于维护的代码。

    28310

    C++智能指针和内存管理:使用指南和技巧

    C++是一门强大的编程语言,但是在内存管理方面却存在着一些问题。手动管理内存不仅费时费力,而且容易出错。因此,C++中引入了智能指针这一概念,以更好地管理内存。 什么是智能指针?...在C++中,内存的分配和释放都是由开发者手动实现的。这种方式虽然很灵活,但也十分容易出错,比如忘记释放内存或释放了已经释放的内存等。为了避免这些问题,C++引入了智能指针这一概念。...每当一个shared_ptr被销毁时,它所管理的对象的引用计数会减1。当引用计数为0时,对象的内存也会被自动释放。...它可以帮助程序员自动管理内存,减少出错的可能性。C++中有三种智能指针:unique_ptr、shared_ptr和weak_ptr。每种智能指针都有其特点,程序员可以根据实际情况选择使用。...使用智能指针可以大大提高代码的可读性和可维护性,建议大家在编写C++程序时多加使用。

    63700

    C++智能指针详解

    C++ 11 引入了unquie_ptr 和 shared_ptr 和 weak_ptr .需要注意的是,unique_ptr对应的是boost中的scoped_ptr。...并且这些智能指针的实现是参照boost中的实现的。 1.3 为什么需要智能指针 1.3.1 内存泄漏 我们在讲为什么之前先来了解一下什么是内存泄漏。...就跟上面一样,会导致代码的繁琐嵌套,所以我们要用智能指针来解决。 二. 智能指针的原理与使用 2.1 智能指针的原理 智能指针的基本原理是利用RAII。...智能指针的众多版本 C++中存在4种智能指针:auto_ptr,unquie_ptr,shared_ptr,weak_ptr,他们各有优缺点,以及对应的实用场景。...0; } 总结: 好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。

    33110

    C++ 智能指针详解

    智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。...();        // 崩溃   } } 最终如上代码导致崩溃,如上代码时绝对符合 C++ 编程思想的,居然崩溃了,跟进std::auto_ptr 的源码后,我们看到,罪魁祸首是“my_memory2...(3)    std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。...个人感觉这个智能指针没太大用处,至少我没用过。有兴趣的朋友自己研究一下源代码哦J。...三、总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

    2.2K10

    同步&异步日志系统:设计模式

    为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打 仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后 来孙子就总结出了《孙子兵法》。...使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。...这种设计方式有助于减少代码的耦合度,提高代码的可维护性和可扩展性。...到每⼀条设计原则,则对应⼀条注意事项: 单⼀职责原则告诉我们实现类要职责单⼀; ⾥⽒替换原则告诉我们不要破坏继承体系; 依赖倒置原则告诉我们要⾯向接⼝编程; 接⼝隔离原则告诉我们在设计接⼝的时候要精简单...2.2.2 C++11之后 特殊思路:这⾥介绍的是《Effective C++》⼀书作者ScottMeyers提出的⼀种更加优雅简便的单例模式Meyers' Singleton in C++。

    22810

    面试官:为什么大厂拒绝使用shared_ptr(shared_ptr vs intrusive_ptr)?

    库的编译链接 如何给一个高速行驶的汽车换轮胎(实现一个可扩展c++服务) 3 STL Traits 技术 4 新特性 if constexpr 5 新特性 面试题:C++中shared_ptr是线程安全的吗...10 值语义 智能指针究竟在考什么 11 指针 使用 C++ 智能指针遇到的坑 二、Ceph 为什么放弃大量使用 shared_ptr 阶段 特点 问题 优化 早期 大量使用 shared_ptr...频繁创建和释放数百万个这样的混合块,会严重加剧内存碎片化。 • 缓存不友好(Cache Unfriendly): 这是更隐蔽的性能杀手。...无需修改类即可使用,是非侵入式的。 易用性 复杂。需要手动实现引用计数逻辑,容易出错。 简单。开箱即用,自动化程度高。 适用场景 1. 极致性能优化(如Ceph)。 2....• 日积月累,整个项目里就有很多长相类似的代码了。 • 如何提炼这样的代码,消除重复,把它们合众为一呢?

    10910

    【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

    2,作为函数参数传递时,请传递引用。因为作为值传递时,将产生大量无意义的引用计数。 3,共享所有权性质的对象往往比限定作用域的对象生存时间更久、资源开销更大,尤其是多线程下。...所以 weak_ptr 的作用就来了: 【伪代码】 class node{ weak_ptr start; weak_ptr end; } shared_ptr... nn = make; shared_ptr mm = make; nn->end = mm; mm->start = nn; 为什么呢?...使用make_shared的语句更简单,因为只涉及到一个函数调用。 这样会更有效,因为库可能会对对象和智能指针进行一个分配。...make_unique 如果不需要对对象的共享访问权限,请考虑使用。 allocate_shared 如果需要为对象指定自定义分配器,请使用。

    1.4K20

    C++ 智能指针

    转载自:C++ 智能指针详解 简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。...智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。...(); // 崩溃 } } 最终如上代码导致崩溃,如上代码时绝对符合 C++ 编程思想的,居然崩溃了,跟进 std::auto_ptr 的源码后,我们看到,罪魁祸首是“my_memory2...(3) std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。...总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

    1.1K40

    【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

    文章首发【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针前言大家好,今天是【重学C++】系列的第二讲,我们来聊聊C++的智能指针。...为什么需要智能指针在上一讲《01 C++如何进行内存资源管理》中,提到了对于堆上的内存资源,需要我们手动分配和释放。管理这些资源是个技术活,一不小心,就会导致内存泄漏。...创建shared_ptr对象同样的,C++也提供了std::shared_ptr构造函数和std::make_shared函数来创建std::shared_ptr对象。...当某个shared_ptr被销毁时,计数值会减1,当计数值变为0时,说明没有任何shared_ptr引用这个对象,会将对象进行回收。...指向同一个资源,会导致重复释放std::shared_ptr ptr2(p);总结避免手动管理内存带来的繁琐和容易出错的问题。

    63500

    【愚公系列】《AIGC辅助软件开发》044-AI辅助提升程序员求职、招聘与面试效率:让ChatGPT扮演面试官帮你查漏补缺

    这里提问的技巧是事先给它设定好面试官的角色和行为框架。我们用C++面试来进行实践。 现在你是腾讯的C++面试官,我准备应聘腾讯C++开发岗的程序员。...接下来,我希望你能通过一个简单的代码示例来展示RAII的实际应用。...请解释一下`std::unique_ptr`和`std::shared_ptr`的区别,并举例说明它们的使用场景。...你对`std::shared_ptr`和`std::unique_ptr`的区别简要概述得很好,接下来我希望你能详细解释它们的具体特点和适用场景,并且提供相应的代码示例。...**第三道问题:** C++中的虚函数是什么?为什么需要虚函数?请解释虚函数的实现机制,并提供一个示例说明其用途。

    17710

    深入理解 C++ 智能指针:原理、实现与最佳实践

    一、引言内存管理是 C++ 编程中一项复杂且易出错的任务。传统的裸指针(raw pointer)容易导致内存泄漏、悬空指针等问题。...本文将详细讲解智能指针的设计原理、内部实现机制及常见使用场景与最佳实践,助你写出更健壮的 C++ 代码。...4.4 循环引用问题若两个对象互相持有 shared_ptr,会导致内存泄漏。五、std::weak_ptr5.1 弱引用weak_ptr 不拥有对象所有权,不影响引用计数。...八、性能考量 shared_ptr 的引用计数增加和减少有一定开销。 unique_ptr 开销最小。 不恰当的过度共享会导致性能下降。...九、总结智能指针是现代 C++ 内存管理的基石,理解其内部机制和使用规范对于写出安全、高效代码至关重要。通过合理选择智能指针类型并遵守最佳实践,能够显著减少内存相关错误,提升代码质量。

    65410

    C++23 std::out_ptr 和 std::inout_ptr:提升 C 互操作性

    背景:C++ 与 C 的互操作性挑战在 C++ 与 C 语言混合编程中,C++ 的智能指针(如 std::unique_ptr 和 std::shared_ptr)与 C 风格的指针操作(如通过指针的指针...以往,开发者需要手动管理指针的释放和重新分配,这不仅繁琐,还容易出错。...特点std::out_ptr 会自动将智能指针的控制权交给 C API,并在适配器析构时根据 C API 的结果更新智能指针。...C API 的语义:在使用这些适配器之前,必须明确 C API 对传入指针的操作方式,例如是否会释放原有资源。...通过这些工具,开发者可以更轻松地在现代 C++ 代码中集成 C 语言的库和功能,进一步推动 C++ 在跨语言编程中的应用。

    12600

    C++|智能指针模板类

    所以为了避免这种情况的出现,C++提供了智能指针模板类,专门用来自动管理内存。 ---- 智能指针初探 常见的智能指针有auto_ptr、unique_ptr、shared_ptr和weak_ptr。...unique_ptr是独占所有权的智能指针,只能有一个指向同一块内存;shared_ptr则可以多个指针共享同一块内存,会维护一个引用计数器;weak_ptr则是一种弱引用的智能指针,不会增加引用计数,...相对的,如果我们修改上面的代码,使用shared_ptr来代替auto_ptr,那么程序将会正常运行。..., shared_ptr(new string("C++")), shared_ptr(new string("python...同样的代码,如果使用unique_ptr来代替auto_ptr那么相对会安全些,至少不会导致程序直接崩溃,而是在编码期间就能看到编译器给出的非法提示,这可以让程序员警惕到两只耳朵竖起来,重新审视自己的屎山代码

    92710

    详解 C++ 11 中的智能指针

    然而,我之所以还向你介绍一下 std::auto_ptr 的用法以及它的设计不足之处是想让你了解 C++ 语言中智能指针的发展过程,一项技术如果我们了解它过去的样子和发展的轨迹,我们就能更好地掌握它,不是吗...22 行 sp1 构造时,同时触发对象 A 的构造,因此 A 的构造函数会执行; 此时只有一个 sp1 对象引用 22 行 new 出来的 A 对象(为了叙述方便,下文统一称之为资源对象 A),因此代码...我们来分析一下为什么 new 出来的 A 对象得不到释放。...注意代码中我提醒注意的地方,该段程序会在代码 12 行处崩溃,崩溃原因是调用了 conn->peerAddress() 方法。为什么这个方法的调用可能会引起崩溃?现在可以一目了然地看出了吗?...); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准中的智能指针我想介绍的就这么多了,Modern C/C++ 已经变为 C

    3.1K31
    领券