首页 > 代码库 > 软件工程——团队作业3
软件工程——团队作业3
1.制定团队的编码规范,队员阅读《构建之法》第四章内容,并讨论总结,将代码规范及编码原则发布在博客
(1) 代码风格规范
代码风格的原则是:简明,易读,无二义性。代码的分风格关键是本着“保持简明,让代码更容易读”的原则,看看争执中的代码规范能否让程序员们更好的理解和维护程序。
? 缩进
是用Tab键好,还是2、4、8个空格?
结论:4个空格,在Visual Studio和其他的一些编辑工具中都可以定义Tab键扩展成为几个空格键。不用Tab键的理由是,Tab键在不同的情况下会显示不同的长度,严重干扰阅读体验。4个空格的距离从可读性来说,正好。
? 行宽
行宽必须限制,但是以前有些文档规定的8字符行宽太小了(以前的计算机/打字机显示行宽为80字符),现在时代不同了,可以限定为100字符。
? 括号
在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
? 断行与空白的{ }行
最精简的格式A:
If (condition) DoSomething();
Else DoSomethingElse();
有人喜欢这样,因为可以节省几行,但是不同的语句(Statement)放在一行中,程序调试(Debug)起来非常不方便,如果要一步一步观察cindition中各个变量(cindition可能是包含函数调用的复杂表达式)的变化情况,单步执行就很难了。
因此,我们还要有断行,于是得到如下结构----格式B:
If (condition)
DoSomething();
Else
DoSomethingElse();
由于没有明确的“{”和“}”来判断程序的结构,在有多层控制嵌套时,这样的格式就不容易看清结构和对应关系,下面的改进(格式C)虽好,但还是不够清晰:
If (cindition) {
DoSomething();
} else {
DoSomethingElse();
}
于是,我们最后选择了下面的格式,每个“{”和“}”都独占一行,即格式D:
If (cindition)
{
DoSomething();
}
Else
{
DoSomethingElse();
}
? 分行
a = 1;b = 2; //bogus
if(fFoo) Bar(); //bogus
更严格地说,不要把多个变量定义在一行上。
Foo fool1,foo2;//bogus
? 命名
命名的目的是让程序员一眼就能看出变量的类型,避免用错。早期的计算机语言(如BCPL)不作类型检查。在C语言中,int、byte、char、bool大概都是一回事。下面这条语句:if(i)
从语义来说,i可以是表示真/假的一个值,也可以表示长度是否为零,还可以表示是否到了字符串的结束位置,或者可以表示两个字符串比较的结果是否相等(strcmp()返回-1,0,1)。
同样是字符串类型,char*、BSTR的有些行为是很不一样的。
HRESULT的值也可以用来表示真假,但是HR_TRUE == 0、HR_FALSE == 1这与通常的true/false刚好相反。
大部分的程序,错就错在这些地方!在变量前面加上有意义的前缀,程序员就能一眼看出变量的类型及相应的语句。这就是“匈牙利命名法”的用处。还有一些地方不适用“匈牙利命名法”,比如,在一些强类型的语言(如c#)中,对类型有严格要求,不同类型的值是不能运算的,例如c#中,if()语句只能接受bool值得表达式,这样很大程度上就杜绝了上面的问题。在这类语言中,前缀就不是很必要,匈牙利命名法并不是很适用。微软的.NET框架就不主张用这样的命名法则。
? 下划线
下划线用来分隔变量名字中的作用域标注和变量的语义,如:一个类型的成员变量通常用m_来表示,或者简单地用一个下划线“_”来做前缀。移山公司规定下划线一般不用在其他方面。
? 大小写
由多个单词组成的变量名,如果全部都是小写,很不易读,一个简单解决方案就是用大小写区分它们。
? 注释
//this loop starts the I from 0 to len, in each step, it
//does Something
For (i=0;i<len;i++)
{
DoSomething();
}
以上的注释是多余的。
//go thru the array, note the last element is at [len-1]
For (i=0;i<len;i++)
{
DoSomeThing();
}
复杂的注释应该放在函数头,很多函数头的注释都用来解释参数的类型等,如果程序正文已经能够说明参数的类型in/out,就不要重复!
注释也要随着程序的修改而不断更新,一个误导的注释旺旺比没有注释更糟糕。
另外,注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊字符,否则会极大地影响程序的可移植性。
在现在编程环境中,程序编辑器可以设置各种美观得体的字体,我们可以使用不同的显示风格来表示程序的不同部分。
(2)编码原则
? 排版
1.关键词和操作符之间加适当的空格。
2.相对独立的程序块与块之间加空行
3.较长的语句、表达式等要分成多行书写。
4.划分出的新行要进行适应的缩进,使排版整齐,语句可读。
5.长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
6.循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。
7.若函数或过程中的参数较长,则要进行适当的划分。
8.不允许把多个短语句写在一行中,即一行只写一条语句。
9.函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。
10.C/C++语言是用大括号‘{ ’和‘ }’界定一段程序块的,编写程序块时‘{ ’和
‘ }’应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体
的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、
switch、case语句中的程序都要采用如上的缩进方式。
? 函数、过程
1.函数的规模尽量限制在200行以内。
2.一个函数最好仅完成一件功能。
3.为简单功能编写函数。
4.函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。
5.尽量不要编写依赖于其他函数内部实现的函数。
6.避免设计多参数函数,不使用的参数从接口中去掉。
7.用注释详细说明每个参数的作用、取值范围及参数间的关系。
8.检查函数所有参数输入的有效性。
9.检查函数所有非参数输入的有效性,如数据文件、公共变量等。
10.函数名应准确描述函数的功能。
11.避免使用无意义或含义不清的动词为函数命名
12.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
13/明确函数功能,精确(而不是近似)地实现函数设计。
14.减少函数本身或函数间的递归调用。
15.编写时,若使用全局变量,则应通过关中断、信号量(即P、V操作)
等手段对其加以保护。
? 程序效率
1.编程时要经常注意代码的效率。
2.在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。
3.不能一味地追求代码效率,而对软件的正确性、稳定性、可读性及可测性造成影
响。
4.编程时,要随时留心代码效率;优化代码时,要考虑周全。
5.要仔细地构造或直接用汇编编写调用频繁或性能要求极高的函数。
6.通过对系统数据结构划分与组织的改进,以及对程序算法的优化来提高空间效率。
7.在多重循环中,应将最忙的循环放在最内层。
8.尽量减少循环嵌套层次。
9.避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
10.尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。
? 代码测试、维护
1.单元测试要求至少达到语句覆盖。
2.单元测试开始要跟踪每一条语句,并观察数据流及变量的变化。
3.清理、整理或优化后的代码要经过审查及测试。
2.完成团队项目的数据库设计,将截图发布在博客
3.团队项目的ER图
ER 图:
4.团队项目主要功能流程描述
主要功能描述:
学生;
教师
:
管理员:
5.描述队员在此次作业中的分工
马海花:数据库设计,主要功能流程图
马继娴:数据库设计,主要功能流程图
王莉娟:数据库设计,主要功能流程图,ER图
安梨雅:数据库设计,主要功能流程图,ER图
马晓燕:数据库设计, 编码规范和编码原则
马菊瑞:数据库设计, 编码规范和编码原则
软件工程——团队作业3