博客和项目地址
博客地址
康瑞的博客地址:https://www.cnblogs.com/CrazyIdeas/p/11711387.html.
张春蕾的博客地址:https://www.cnblogs.com/lzcl/p/11712513.html.
项目的Github地址
生成四则表达式的github地址:https://github.com/HarLearn/GeneratingArithmetic
代码互审
√为激活,黑体加粗为重要。
康瑞的代码审查表(由张春蕾完成)
- 概要部分:
- 设计规范部分
- 代码规范部分
- 具体代码部分
- 效能
- 可读性
- 可测试性
√代码符合需求和规格说明吗?
√代码设计是否考虑周全?
√代码可读性如何?
√代码容易维护吗?
√代码的每一行都执行并检查了吗?
√设计是否遵从一致的设计模式或项目中常用的模式?
√有没有硬编码或字符串/数字等存在?
x有没有依赖一个平台,是否会影响将来的移植?
x开发者是否使用已经存在的开发模板。
x开发者新写的代码能否用已有的SDK 中的功能实现?
√本代码是否存在类似的功能可以调用而不用全部重新实现?
x有没有无用的代码可以清除?
√修改的部分符合代码标准和风格吗?
√注释是否较清晰且必要?
x函数是否已经有文档注释?
√每行是否只声明了一个变量?(特别是那些可能出错的类型)
x代码行长度是否在要求之内?
√有没有对错误进行处理?
√对于调用的外部函数,是否检查了返回值或处理了异常?
x入口数据的合法范围是否都被进行了判断?(尤其是数组)
√参数传递有无错误?
√字符串的长度是字节的长度还是字符(可能是单/双字节)的长度?
√是以 0
开始计数还是以 1
开始计数?
√边界条件是如何处理的?
xswitch 语句的 default 分支是如何处理的?
√for循环是否都使用了包含下限不包含上限的形式?
x循环有没有可能出现死循环?
x有没有使用断言,来保证我们认为不变的条件是真的得到满足?
x对资源的利用,是在哪里申请,在哪里释放的?
x有无可能存在资源泄露(内存,文件、各种GUI 资源、数据库访问的连接,等等)?
√有没有优化的空间?
x数据结构中有没有用不到的元素?
x代码的效能如何?
√最坏的情况是怎样?
√代码中,特别是循环中是否有明显可优化的部分?
x对于系统和网络的调用是否会超时?如何处理?
√代码可读性如何,有没有足够的注释?
x缩进层数是否不超过规定?
√长行拆分是否得体?
x代码行内的空格是否得体?
√代码是否需要更新或创建新的单元测试?
张春蕾的代码审查表(由康瑞完成)
- 概要部分:
- 设计规范部分
- 代码规范部分
- 具体代码部分
- 效能
- 可读性
- 可测试性
√代码符合需求和规格说明吗?
√代码设计是否考虑周全?
x代码可读性如何?
√代码容易维护吗?
√代码的每一行都执行并检查了吗?
√设计是否遵从一致的设计模式或项目中常用的模式?
√有没有硬编码或字符串/数字等存在?
√有没有依赖一个平台,是否会影响将来的移植?
√开发者是否使用已经存在的开发模板。
√开发者新写的代码能否用已有的SDK 中的功能实现?
x本代码是否存在类似的功能可以调用而不用全部重新实现?
x有没有无用的代码可以清除?
x修改的部分符合代码标准和风格吗?
√注释是否较清晰且必要?
√函数是否已经有文档注释?
√每行是否只声明了一个变量?(特别是那些可能出错的类型)
x代码行长度是否在要求之内?
√有没有对错误进行处理?
√对于调用的外部函数,是否检查了返回值或处理了异常?
x入口数据的合法范围是否都被进行了判断?(尤其是数组)
√参数传递有无错误?
√字符串的长度是字节的长度还是字符(可能是单/双字节)的长度?
x是以 0
开始计数还是以 1
开始计数?
√边界条件是如何处理的?
xswitch 语句的 default 分支是如何处理的?
xfor循环是否都使用了包含下限不包含上限的形式?
√循环有没有可能出现死循环?
√有没有使用断言,来保证我们认为不变的条件是真的得到满足?
x对资源的利用,是在哪里申请,在哪里释放的?
x有无可能存在资源泄露(内存,文件、各种GUI 资源、数据库访问的连接,等等)?
√有没有优化的空间?
x数据结构中有没有用不到的元素?
x代码的效能如何?
√最坏的情况是怎样?
√代码中,特别是循环中是否有明显可优化的部分?
x对于系统和网络的调用是否会超时?如何处理?
√代码可读性如何,有没有足够的注释?
x缩进层数是否不超过规定?
√长行拆分是否得体?
x代码行内的空格是否得体?
√代码是否需要更新或创建新的单元测试?
代码规范
代码风格规范
- 缩进:为 4个空格。
- 括号:在复杂条件表达式中,用括号清楚表示出优先级。
// 通过 括号说明 优先级
if(a && (b || c) && d){
// 执行语句
}
{}
的使用:{
跟在语句的结束处。
if(conditon){
// 执行语句
}
//而不是 下面
if(condition)
{
// 执行语句
}
- 断行与空白的
{}
行:不同语句需要换行,在条件语句和循环语句中 单行语句也需要写在{}
内。如:
if(condition){
// 单条 语句 也使用 {}
DoSomething();
}else{
DoSomething();
}
- 分行:每条语句占一行,不要把多条语句放在一行上。
int variableA,variableB; // 不采用多个变量声明写在一行
// 把多个变量声明 分开写
int variableA;
int variableB;
- 命名:采用驼峰命名法。都是用英文,见名知意。
- 变量:采用小驼峰命名,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母。
int variableA = 0;
boolean isVariable = false;
- 包名:采用全部小写。
package com.xxxx.xxx
- 类,接口:采用大驼峰命名,每个单词名的首字母都大写。
public class TestClass{
// 一些 属性 和 方法
}
interface TestInterface{
// 一些方法
}
- 常量:常量所有字母大写,下划线分割。
const MAX_COUNT = 10;
- 方法名:采用小驼峰命名,使用动词开头。
public int getResult(){
// 详细内容省略
return 1;
}
public void setResult(int variable){
// 详细内容省略
}
- 注释:注释都是用 ASCII 字符,复杂注释写在函数头。遇到复杂逻辑 需要通过注释,写明意思。
// Single-Line Comments
/*
multiline comment
*/
/**
Documentation Comments
*/
代码设计规范
- 一个函数只需要完成一个功能。见名知意。
- 函数应该按照 功能进行分类。
- 预期异常,预期异常通过捕获异常来获得异常信息;
- 数据能在程序中取的就从程序中取。不用客户输入(减少客户输入)。比如客户号 信息 等。
- 如果有参数输入尽可能减少参数输入的个数(4个->0个);
- 验证入参(尽可能的实现输入参数的正确性);
- url全部小写。
- 不要在构造函数中做过多复杂的操作,简单初始化数据成员即可。
- 公共部分,应该提取出来,不应进行重复操作。
结对编程感受、场景
结对编程感受
本次我们通过结对编程,在一起完成了生成四则运算式的小项目。虽然在编写代码时有些辛苦,但是还是发现了一些有趣的问题:
我们在谈论、评价一段代码时,她总会说它在某些情景下,这条语句会出现问题。我提到的点都是在逻辑方面的问题。感觉女生在编程方面比男生思考的更加多,男生在逻辑性方面更加有优势。
我们都是对编程有兴趣的人,在编程方面的优势得到了互补,使编程经验得到了提高。在结对编程过程中,解决了更多的BUG。使代码的应用情景更加全面,逻辑更加通顺,结构更加清晰,质量更高。
相比以前的个人编码,两人结对编程效率更加高。让我们对这种组队开发代码的形式,有了新的认识和感受。