构建之法读书笔记 第4章 两人合作
代码规范
一个人独立完成的软件已经很少见了(向独立游戏开发者致敬),软件都是在相互合作中完成的,最小单位: 俩人。
代码规范: 不同的人对代码好坏评判不同,需要基准
代码风格规范
文字上的规定,很重要
原则: 简明易读,无二义性
命名上应该一眼看出变量的类型和语义
匈牙利命名法: 给变量以有意义的前缀。对于强类型的语言不必要
Pascal: 所有单词首字母大写
Camel: 第一个单词小写,其余单词遵循Pascal
函数: 动词或者动宾来组合
注释
复杂的注释应该放在函数头
注释应该只用ASCII码
误导的注释比没有注释更糟糕
避免冗余的注释
代码设计规范
通用原则上的规范,牵涉模块关系等
函数
只做一件事,并且做好
goto
函数最好有单一的出口,为达此目的,可以使用goto
??以前都是听说要避免使用goto
错误处理
验证参数正确性
使用Assert
如何处理C++中的类
类的使用
使用类来封装面向对象的概念和多态
指针传递,避免传递实体的值
对于有显式构造和析构函数的类,避免建立全局的实体,因为不知道何时创建和消除
仅在必要时使用类
仅数据的封装,用struct即可
仅在必要时使用类型继承
关于数据成员和方法
按照public, protected, private 的顺序来说明类中的成员
使用虚函数来实现多态;仅在很有必要时使用虚函数;若一个类型要实现多态,在基类中的析构函数应该是虚函数(对于原因理解不是很清楚,是为了防止忘了在子类中写析构函数吗,对于c++不是很熟)
数据成员 m_name; 不要使用公共的数据成员; 用inline访问函数,兼顾封装和效率
new和delete
检查new的返回值,new不一定成功
释放指针时不用检查NULL
运算符
不做标准语义之外的事情
确实有必要时再定义
需要高效
代码复审
- 代码是否在“代码规范”的框架里正确的解决了问题
- 自我复审、同伴复审、团队复审
- 目的
- 找代码错误: 编码错误,不符合规范之处,逻辑和算法的错误,潜在的错误和回归星错误
- 熟悉项目代码的途径
- 复审后
- 更正明显的错误
- 记录无法快速更正的错误
- 记录自己常犯的错误,促进自我复审
- 代码复审的核查表(记下需要这个东西)
结对编程
Driver & Navigator
感觉有利于避免低级错误
这部分心理学,沟通技巧等
团队合作的重要性
笔记整理
inline
C++ 中,可以在定义函数时,在返回值类型前面加上 inline 关键字, 增加了 inline 关键字的函数称为“内联函数”。
- 内联函数和普通函数的区别:当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,就像整个函数体在调用处被重写了一遍一样。
- 不需要付出执行函数调用的额外开销
- 内联函数中的代码应该只是很简单、执行很快的几条语句。否则失去意义了
- 调用内联函数的语句前必须已经出现内联函数的定义(即整个数体),而不能只出现内联函数的声明。
inline int Max (int a, int b)
{
if(a >b)
return a;
return b;
}
- 异常
- 异常不能跨过DLL或进程的边界来传递信息,如何理解??
- 异常处理机制及异常的花销
- 不要用异常来作为逻辑控制来处理程序中的主要流程
- 使用异常时注意在什么地方清理数据
原文地址:https://www.cnblogs.com/QiLF/p/11440478.html
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
- Gym 100952G&&2015 HIAST Collegiate Programming Contest G. The jar of divisors【简单博弈】
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+
- Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】
- Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
- 51 Nod 1008 N的阶乘 mod P【Java大数乱搞】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战06】给Agent添加记忆功能
- Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】
- [开源,学习,分享]UWP第三方简书客户端分享
- HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
- 51 Nod 1057 N的阶乘【Java大数乱搞】
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
- 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】
- 51 Nod 1005 大数加法【Java大数乱搞,python大数乱搞】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt音视频开发25-ffmpeg音量设置
- 从HelloWorld开始了解Android
- 探究活动Activity
- 探究活动Activity(2)界面跳转及生命周期
- Android-MediaPlayer
- 如何友好的把Python和Bash结合在一起
- Android-MediaPlayer(2)加进度条和时间显示
- Android-MediaPlayer(3)加打碟旋转效果
- 解决This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio
- 你不就是加了 2 行代码,为什么要用 2 天?
- Android 使用ZXing生成带logo的二维码
- Resolved versions for app (26.1.0) and test app (27.1.1) differ.
- APP 引导页、欢迎页运用
- 管道与重定向、文件查找-Linux每日一练(7)
- 软件包管理、计划任务-Linux每日一练(8)