养成良好的编程习惯很重要(C++)
Posted 穿越临界点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了养成良好的编程习惯很重要(C++)相关的知识,希望对你有一定的参考价值。
在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。
文章目录
0 前言
有经验的编程者和初学者之间最大的区别之一就是有没有养成良好的编程习惯。养成良好的编程习惯是团队逐渐壮大的基础。
冗长的编程规范对于团队建设来说意义并不是很大,对于普及的知识来说,短小精悍,抓住重点才是王道。
1. 设计原则
序号 | 全称 | 说明 | 通俗解释&如何落地 |
---|---|---|---|
1 | 单一职责原则(Single Responsibility Principle, SRP) | 一个类只负责一个功能领域中的相应职责 | 类大了,或函数大了说明承载的职责多了,需要拆分 |
2 | 开闭原则(Open Closed Principle,OCP) | 对扩展开放,对修改关闭 | (应用常用的设计模式)将经常变化的代码和稳定的代码隔离开 |
3 | 里氏代换原则(Liskov Substitution Principle,LSP) | 所有引用基类的地方必须能透明地使用其子类的对象 | 基类可以做接口也可以不做接口,这种情况下指的是基类做接口的情况(多态)。设计基类内部的接口时要完备。 |
4 | 接口隔离原则(Interface Segregation Principle,ISP) | 类之间的依赖关系应该建立在最小的接口上 | 尽量少的暴露类内部的方法给调用者。public下的方法越少越好。 |
5 | 依赖倒转原则(Dependency Inversion Principle,DIP) | 依赖于抽象,不能依赖于具体实现 | 基于协议、基于契约、基于接口编程。对于C++来说就是基于基类接口。当然也可以使用任何形式的协议。 |
6 | 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) | 尽量使用合成/聚合,而不是通过继承达到复用的目的 | 平衡Is-a和Has-a的使用,两个概念属于不同维度,搭配好不至于使代码在单一维度的复杂度过高。除了这两个维度,还可以使用分层思想,扩展出新的维度,从而更好地降低软件在单一维度的复杂度爆炸。 |
2. 编码习惯
序号 | 代码坏味道 | 改进措施 | 类别 |
---|---|---|---|
1 | 命名不规范 | 请参考第3节的命名规范 | 命名 |
2 | 代码逻辑不在它应该在的模块 | 如果模块划分已经清晰,只是自己不清楚,和相关同事沟通;如果模块功能划分不清晰,应该赶在量产前划分清晰。(举例:Adas-Core的Server中不要放置任何逻辑和算法代码,只负责接口通信。) | 模块 |
3 | 单个类过大(仅类的声明超过50行) | 类的设计不要过大,如果过大需要考虑将功能拆分到其他类,推荐使用组合关系。 | 类 |
4 | 同一功能的类型定义或函数多处出现 | 定义通用函数或者类型时,先到公共头文件看一下是不是已经有了,或者找人先问一下,不要重复造轮子。 | 函数 |
5 | 函数过大(超过50行) | 函数功能要保持单一,如果代码行超过50行尽量拆分成多个函数。 | 函数 |
6 | 函数参数过多(超过3个) | 函数参数过多时最好封装成一个结构体或者类,并尽量支持右值引用。 | 函数 |
7 | 接口函数保留太多内部逻辑 | 接口函数最好不要包含分支结构,只包含顺序结构。 | 函数 |
8 | 函数重载过多(超过3个) | 函数重载最好不要用来区分逻辑实现,只用来适配接口。 | 函数 |
9 | 圈复杂度过大(超过3层) | 分支嵌套不要超过3层,超过后抽象新的函数,或者考虑改进算法。 | 分支 |
10 | 缺少异常处理 | 所有异常分支一定要处理,至少添加详尽的报错日志。 | 异常 |
11 | 硬编码 | 杜绝硬编码(包括绝对路径和魔法数字等),使用宏定义、,const变量或者配置文件。 | 数据 |
12 | 过多全局变量(超过10个) | 根据具体情况选择:1)定义结构体或者类;2)使用容器统一管理;3)使用函数内部static变量代替;4)使用消息机制;等等。 | 数据 |
13 | 全局指针满天飞 | 全局指针必须在构造函数或者Factory(工厂函数)中完成初始化。一来防止造成空指针访问;二来可以缩小代码变化的范围(将兔子关到笼子里)。 | 数据 |
14 | 过多耦合的宏定义编译开关 | 特殊功能(比如仿真)添加易于理解的宏定义开关,并且周知所有人。并且宏定义开关单独放到一个文件中,添加好注释。能使用函数粒度不要使用代码行粒度。 | 预编译 |
3. 命名规范(参考Google命名规则)
- 通用规则:命名有描述性,尽量少用缩写,例如: DoSpecificThing()
- 文件命名:my_useful_class.h 下滑线连接的具体描述性名字
- 类型命名:采用CamelCase,例: MyUsefulClass
- 变量命名:
4.1 普通变量:table_name
4.2 类数据成员: table_name_,结构体成员和普通变量一致
4.3 函数:采用CamelCase: ValidateFuncName()
4.4 枚举命名:
enum UrlTableErrors
OK = 0,
ERROR_OUTOF_MEMORY,
; - 宏命名:MY_MACRO_THAT_SCARES_SMALL_CHILDREN
- 命名空间:命名独特不冲突即可
恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~
以上是关于养成良好的编程习惯很重要(C++)的主要内容,如果未能解决你的问题,请参考以下文章