学习Boost二:从附录3来看编码习惯

简介: 状态设计模式则是更加上一层,从具体的代码逻辑层次调升到了面对对象实现方式,它有更好的可扩展性(增加继承子类),更好的私密性(单独类内管理,彼此分割),更贴合低耦合、高内聚的方式。

附录C 关键字浅谈


在C++11标准中(C++11.2.12)总共定义了73个关键字(keyword)、2个“准”关键字(identifiers with special meaning)和11个操作符替代字(alternative representation)[1]。


虽然 C++标准中的关键字很多,但并不都是有用的,有些已经被废弃,有些因使用不当则会导致“代码坏味”,作者将谈谈自己在多年开发过程中对它们的一些认识,仅作一家之言。


1.废弃的关键字

register。它已经在C++11里被正式废弃,现在的C++代码中不应该再出现这个单词。


2.停用的关键字

export。C++98引入这个关键字,它在C++11中被停用但保留。


3.建议不使用的关键字

C++从C中继承了很多关键字,所以它也继承了C语言面向过程的一些缺点,有些关键字应当慎用或不用,这样可以很好地避免“反模式”,绕过一些容易令人困惑的陷阱。


goto。首当其冲的当然是 goto,它带来的流程混乱问题已经众所 周知,应当使用 break、continue、return 等关键字来控制程序流程, 让代码逻辑更清晰。


switch-case。多分支开关语句同样会导致代码难以理解,不利 于维护,在面向对象的语言里可以用状态模式来消除 switch-case 的使 用,也可以用if+return、map+function来替代switch-case语句。


else。滥用if-else和if-else的多重嵌套是与switch-case同样 令人厌恶的存在,它引入了多个逻辑条件,使程序的流程很混乱,而 且会导致遗漏逻辑判断的隐患。消灭else关键字需要有清晰的头脑, 仔细分析业务逻辑,设计代码结构,多数情况下可以在if语句里及时 用return来结束函数。


while/do。while{}和 do{}while 循环是旧时代的遗产,完全可 以用for 取代它们,而且在C++11 中,for 还支持基于范围的循环,更加安全。比较常用的无限循环while(1)也可以用更简洁的for (;;)代替。


new/delete。它们曾经的任务是取代malloc和free,但它们并没 有解决内存泄漏的根本问题,现在应该使用标准库里的智能指针和vector等容器。


4.建议积极使用的关键字

auto。C++11里的auto关键字能够自动推导表达式类型,为程序 员提供了以前只有编译器才拥有的能力,极大地简化了我们声明对象 时的工作,非常方便,因此应该尽量多用它。不过需要注意它的语 义,auto总是推导出“值”语义,有的时候需要使用“auto&”或“auto&&”的形式避免拷贝代价(如在 for 循环里)。


default。这个 default 不用于 switch 语句,而用于声明构造函数 或析构函数的默认实现,明确地写出它不仅可以告诉编译器也可以告 诉代码阅读者,这个类是一个“no trival”的类。


nullptr。它取代了容易引起歧义的NULL和0,是语法层面上真正的空指针,相当于其他语言里的None/Nil,使用它可以使代码获得更 强的安全性。


5.“准”关键字

所谓“准”关键字,其实并不是关键字,它们只是普通的单词,


但能够在特定的C++语境里产生语法效果,此外没有其他的特殊含义。目前 C++标准仅定义了两个“准”关键字:final 和 override,用于类继承体系的控制,可以很好地增强表达能力,建议使用。


final。用于标识类或成员函数,禁止子类继承或重载。


override。用于标识虚函数,明确地表示成员函数重载了父类的 同名函数,避免误覆盖(overload)。


希望读者能够在今后的实践中采纳本文的建议,书写出更优雅易 读、给人看而不是给机器人看的代码。


使用 if-else 来完成全流程覆盖,不如使用 if-return 来完成筛查。


override在继承虚函数的子类声明的引号最后处表明。


map + function 是通过重载的方式,实现了 if-else的逻辑选择替代方案。


if-return则是另一种思路,通过反向筛选的方式,把不合格的数据剔除。从而保证了数据的安全。


状态设计模式则是更加上一层,从具体的代码逻辑层次调升到了面对对象实现方式,它有更好的可扩展性(增加继承子类),更好的私密性(单独类内管理,彼此分割),更贴合低耦合、高内聚的方式。


  • [[二十三种设计模式:状态模式]]
  • [[状态设计模式:代码介绍]]
  • [[map + function 实现替代if - else]]
  • [[C++11 新特性:default]]
目录
相关文章
|
算法 编译器 Linux
[Linux]环境变量 进程地址空间(虚拟内存与物理内存的关系)
建议收藏!本篇文章详细讲解了探究地址空间排布的前言知识环境变量,通过程序验证了地址空间排布,并探究程序所说的地址究竟是物理地址还是虚拟地址,铺垫完后进入重点进程地址空间,详细介绍了进程地址空间是什么?结构,与物理内存的联系,并讲解写时拷贝的现象,拓展补充编译器同样遵守虚拟地址;最后讲解为什么需要地址空间,分为3个部分:安全性,独立性和OS的延迟分配策略实现内存的分批换出and分批换入,逻辑思维清晰,叙述有条不紊,引入生活案例,希望能让大家有所收获!
|
安全 Linux 网络安全
快速学会sftp的 get和put命令,将linux上的linux.txt推送到windows上
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。
904 0
|
Java API 调度
一篇搞懂Java多线程(全网最细)(二)
一篇搞懂Java多线程(全网最细)(二)
103 0
|
消息中间件 运维 容灾
理想汽车大规模 Apache RocketMQ 集群部署最佳实践
作者:孙航达,理想汽车智能云部中间件开发工程师,目前主要负责 Apache RocketMQ、ShardingSphere Proxy、全量数据迁移中间件的开发和运维工作。
498 0
理想汽车大规模 Apache  RocketMQ 集群部署最佳实践
|
Java 程序员 C#
switch-case和if-else的效率比较·必看(上)
switch-case和if-else的效率比较·必看(上)
560 0
switch-case和if-else的效率比较·必看(上)
|
C++
C++ 基础
C++ 基础
143 0
|
网络协议
三次握手之抓包工具sniffer
前言我相信伙伴们都听说过tcp/ip三次握手四次断开,今天我就用这个软件来演示一下!                            本机IP地址:192.168.2.93 FTP服务器:192.
1125 0
|
23小时前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1050 0