Code Specification
使用条件语句
if 语句
原则一:要使得正常情况执行代码过程清晰,优先考虑代码正常执行情况。
原则二:不要用 “>” 代替 “>=” 或用 “<” 代替 “<=”。
原则三:正常情况的处理放在 if 后面而不是 else 后面(保证能快速找到代码正常的执行过程)。
原则四:if 子句后面跟随一个有意义的语句,避免空语句。
if-else if-else 语句
原则一:把常见的情况放在最前面(既提高了阅读效率,也变相的提高了系统执行效率)。
原则二:确保所有情况都考虑到,else 子句用作出错消息或者不考虑的情况。
switch case 语句
原则一:为 case 选择最有效的排列顺序,当 case 超过3个,排序就更为重要。以下是一些排序原则。
- 按字母顺序或按数字顺序排列
- 把正常的情况放在前面
- 按执行频率排列,最近常执行的 case 子句放在最前面
原则二:尽量简化 case 子句中的操作,避免逻辑嵌套,可以将要执行的子句抽取成一个方法,使得逻辑更清晰。
原则三:不要为了使用 switch 语句而刻意制造一个变量。
原则四:利用 default 子句来检测错误的情况,而不是代替一种 case 的情况。
原则五:避免代码执行执行越过 case,每条 case 都应该及时加 break;
测试
一个值得养成的测试习惯
:::success
每当你遇见一个bug,先写一个测试来清楚地复现它。仅当测试通过时,才视为bug修完。只要测试存在一天,我就知道这个错误永远不会再复现。这个bug和对应的测试也会提醒我思考:测试集里是否还有这样不被阳光照耀到的犄角旮旯
:::
推荐的测试方法
方法一:对每一项相关的需求进行测试,以确保需求都已经被实现。
方法二:对每一个相关的设计关注点进行测试,以确保设计已经被实现。
方法三:用 基础测试来扩充针对需求和设计的详细测试用例。
方法四:使用一个检查表,记录项目迄今为止所犯的错误类型。
测试技巧
技巧一:选择最有可能找到错误的测试用例。
技巧二:结构化的基础测试,需要去测试程序中每一条语句至少一次。所需基础测试用例的最少数量可以使用该方法计算:程序本身记作1,每遇到关键字时加1,如:if,while,for,and,or,case 。
技巧三:数据流测试,对于数据的状态进行测试。状态可以是:已定义,已使用,已销毁。还有一些术语用来描述对数据进行某种操作之前或之后的状态:已进入,已退出。对于所有已定义-已使用的组合进行测试是比较好的实践。
技巧四:边界值分析,对于边界值一般会遇到三种情况:大于边界值,等于边界值,小于边界值。为这些情况编写测试用例。
技巧五:使用几类坏数据测试,坏数据包括(数据太少,太多数据,错误的数据情况,长度错误的数据,未初始化的数据)。使用几类好数据测试,好数据包括(所期望的值,最小的正常情况,最大的正常情况,与旧数据的兼容性)
技巧六:采用容易的手工检查的测试用例。如计算薪水,可以输入一些自身能判断的数据123,根据薪水规则计算出的结果,判断是否符合自己的预期。
表驱动编程
方法命名规范
返回真伪值的方法
| 位置 | 单词 | 意义 | 例 |
|---|---|---|---|
| Prefix | is | 对象是否符合期待的状态 | isValid |
| Prefix | can | 对象能否执行所期待的动作 | canRemove |
| Prefix | should | 调用方执行某个命令或方法是好还是不好,应不应该,或者说推荐还是不推荐 | shouldMigrate |
| Prefix | has | 对象是否持有所期待的数据和属性 | hasObservers |
| Prefix | needs | 调用方是否需要执行某个命令或方法 | needsMigrate |
用来检查的方法
| 单词 | 意义 | 例 |
|---|---|---|
| ensure | 检查是否为期待的状态,不是则抛出异常或返回 error code | ensureCapacity |
| validate | 检查是否为正确的状态,不是则抛出异常或返回 error code | validateInputs |
按需求才执行的方法
| 位置 | 单词 | 意义 | 例 |
|---|---|---|---|
| Suffix | IfNeeded | 需要的时候执行,不需要的时候什么都不做 | drawIfNeeded |
| Prefix | might | 同上 | mightCreate |
| Prefix | try | 尝试执行,失败时抛出异常或是返回 errorcode | tryCreate |
| Suffix | OrDefault | 尝试执行,失败时返回默认值 | getOrDefault |
| Suffix | OrElse | 尝试执行、失败时返回实际参数中指定的值 | getOrElse |
| Prefix | force | 强制尝试执行。error 抛出异常或是返回值 | forceCreate, forceStop |
异步相关方法
| 位置 | 单词 | 意义 | 例 |
|---|---|---|---|
| Prefix | blocking | 线程阻塞方法 | blockingGetUser |
| Suffix | InBackground | 执行在后台的线程 | doInBackground |
| Suffix | Async | 异步方法 | sendAsync |
| Suffix | Sync | 对应已有异步方法的同步方法 | sendSync |
| Prefix or Alone | schedule | Job 和 Task 放入队列 | schedule, scheduleJob |
| Prefix or Alone | post | 同上 | postJob |
| Prefix or Alone | execute | 执行异步方法(注:我一般拿这个做同步方法名) | execute, executeTask |
| Prefix or Alone | start | 同上 | start, startJob |
| Prefix or Alone | cancel | 停止异步方法 | cancel, cancelJob |
| Prefix or Alone | stop | 同上 | stop, stopJob |
回调方法
| 位置 | 单词 | 意义 | 例 |
|---|---|---|---|
| Prefix | on | 事件发生时执行 | onCompleted |
| Prefix | before | 事件发生前执行 | beforeUpdate |
| Prefix | pre | 同上 | preUpdate |
| Prefix | will | 同上 | willUpdate |
| Prefix | after | 事件发生后执行 | afterUpdate |
| Prefix | post | 同上 | postUpdate |
| Prefix | did | 同上 | didUpdate |
| Prefix | should | 确认事件是否可以发生时执行 | shouldUpdate |
操作对象生命周期的方法
| 单词 | 意义 | 例 |
|---|---|---|
| initialize | 初始化。也可作为延迟初始化使用 | initialize |
| pause | 暂停 | onPause ,pause |
| stop | 停止 | onStop,stop |
| abandon | 销毁的替代 | abandon |
| destroy | 同上 | destroy |
| dispose | 同上 | dispose |
与集合操作相关的方法
| 单词 | 意义 | 例 |
|---|---|---|
| contains | 是否持有与指定对象相同的对象 | contains |
| add | 添加 | addJob |
| append | 添加 | appendJob |
| insert | 插入到下标 n | insertJob |
| put | 添加与 key 对应的元素 | putJob |
| remove | 移除元素 | removeJob |
| enqueue | 添加到队列的最末位 | enqueueJob |
| dequeue | 从队列中头部取出并移除 | dequeueJob |
| push | 添加到栈头 | pushJob |
| pop | 从栈头取出并移除 | popJob |
| peek | 从栈头取出但不移除 | peekJob |
| find | 寻找符合条件的某物 | findById |
与数据相关的方法
| 单词 | 意义 | 例 |
|---|---|---|
| create | 新创建 | createAccount |
| new | 新创建 | newAccount |
| from | 从既有的某物新建,或是从其他的数据新建 | fromConfig |
| to | 转换 | toString |
| update | 更新既有某物 | updateAccount |
| load | 读取 | loadAccount |
| fetch | 远程读取 | fetchAccount |
| delete | 删除 | deleteAccount |
| remove | 删除 | removeAccount |
| save | 保存 | saveAccount |
| store | 保存 | storeAccount |
| commit | 保存 | commitChange |
| apply | 保存或应用 | applyChange |
| clear | 清除数据或是恢复到初始状态 | clearAll |
| reset | 清除数据或是恢复到初始状态 | resetAll |
成对出现的动词
| 单词 | 意义 |
|---|---|
| get 获取 | set 设置 |
| add 增加 | remove 删除 |
| create 创建 | destory 移除 |
| start 启动 | stop 停止 |
| open 打开 | close 关闭 |
| read 读取 | write 写入 |
| load 载入 | save 保存 |
| create 创建 | destroy 销毁 |
| begin 开始 | end 结束 |
| backup 备份 | restore 恢复 |
| import 导入 | export 导出 |
| split 分割 | merge 合并 |
| inject 注入 | extract 提取 |
| attach 附着 | detach 脱离 |
| bind 绑定 | separate 分离 |
| view 查看 | browse 浏览 |
| edit 编辑 | modify 修改 |
| select 选取 | mark 标记 |
| copy 复制 | paste 粘贴 |
| undo 撤销 | redo 重做 |
| insert 插入 | delete 移除 |
| add 加入 | append 添加 |
| clean 清理 | clear 清除 |
| index 索引 | sort 排序 |
| find 查找 | search 搜索 |
| increase 增加 | decrease 减少 |
| play 播放 | pause 暂停 |
| launch 启动 | run 运行 |
| compile 编译 | execute 执行 |
| debug 调试 | trace 跟踪 |
| observe 观察 | listen 监听 |
| build 构建 | publish 发布 |
| input 输入 | output 输出 |
| encode 编码 | decode 解码 |
| encrypt 加密 | decrypt 解密 |
| compress 压缩 | decompress 解压缩 |
| pack 打包 | unpack 解包 |
| parse 解析 | emit 生成 |
| connect 连接 | disconnect 断开 |
| send 发送 | receive 接收 |
| download 下载 | upload 上传 |
| refresh 刷新 | synchronize 同步 |
| update 更新 | revert 复原 |
| lock 锁定 | unlock 解锁 |
| check out 签出 | check in 签入 |
| submit 提交 | commit 交付 |
| push 推 | pull 拉 |
| expand 展开 | collapse 折叠 |
| begin 起始 | end 结束 |
| start 开始 | finish 完成 |
| enter 进入 | exit 退出 |
| abort 放弃 | quit 离开 |
| obsolete 废弃 | depreciate 废旧 |
| collect 收集 | aggregate 聚集 |