首页 > 代码库 > 软件工程——团队作业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