20135331文艺 实验报告

一、实验内容

1. 初步掌握单元测试和TDD

2. 理解并掌握面向对象三要素:封装、继承、多态

3. 初步掌握UML建模

4. 熟悉S.O.L.I.D原则

5. 了解设计模式

 

(2) TDD(Test Driven Devlopment, 测试驱动开发)

先写测试代码,然后再写产品代码,从而写出来的代码就是正确的。

这种先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

 打开Eclipse,单击File->New->Java Project新建一个TDDDemo的Java项目,如下图:

 

 

 

(二)面向对象三要素

(1)抽象

"去粗取精、化繁为简、由表及里、异中求同"

程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。

 

(2)封装、继承与多态

 

封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。 Dog类通过使用类和访问控制(private,public)隐藏了属性color,开放了接口setColor(),getColor(),bark()toStringDog类是一个模块,我们可以通过下面的代码使用它,测试代码与运行结果如下:

 

1:用UML中的类图来描述类Dog,首先我们在实验楼的环境中打开shell,在命令行中输入umbrello,打开UML建模软件umbrello

2:把鼠标放到Dog类上,单击右键,选择Properties,在弹出的对话框中的Display中去掉Public Only选项

3:把鼠标放到Dog类上,单击右键,选择New->Attribute,在弹出的对话框中的填好Type,Name,并选好Visibility

4:把鼠标放到Dog类上,单击右键,选择New->Operation,在弹出的对话框中的填好Type,Name,并选好Visibility

实验截图如下所示:

 

(三)设计模式初步

(1)S.O.L.I.D原则

面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导:

  • SRP(Single Responsibility Principle,单一职责原则)
  • OCP(Open-Closed Principle,开放-封闭原则)
  • LSP(Liskov Substitusion Principle,Liskov替换原则)
  • ISP(Interface Segregation Principle,接口分离原则)
  • DIP(Dependency Inversion Principle,依赖倒置原则)

OCP是OOD中最重要的一个原则,OCP的内容是:

  • software entities (class, modules, function, etc.) should open for extension,but closed for modification.
  • 软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

LSP的内容是:

  • Subtypes must be substitutable for their base types
  • Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
  • 子类必须可以被其基类所代
  • 使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它

 

ISP的内容是:

  • Clients should not be forced to depend upon interfaces that they do not use
  • 客户不应该依赖他们并未使用的接口

DIP的内容是:

  • High level modules should not depend upon low level modules. Both should depend upon abstractions
  • Abstractions should not depend upon details. Details should depend upon abstractions
  • 高层模块不应该依赖于低层模块。二者都应该依赖于抽象
  • 抽象不应该依赖于细节。细节应该依赖于抽象

(2)模式与设计模式

模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用,每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。 计算机科学中有很多模式:

  • GRASP模式
  • 分析模式
  • 软件体系结构模式
  • 设计模式:创建型,结构型,行为型
  • 管理模式: The Manager Pool 实现模式
  • 界面设计交互模式

这里面最重要的是设计模式,在面向对象中设计模式的地位可以和面向过程编程中的数据结构的地位相当。

实验截图如下所示:

 

四  练习

1使用TDD的方式设计关实现复数类Complex。

//伪代码 //复数类 类有虚部实部 复数的加法运算 复数的减法运算 复数的乘法运算 复数的除法运算

 

//产品代码 public class ComplexDemo { // main方法 public static void main(String[] a) {   Complex b = new Complex(2, 5);   Complex c = new Complex(3, -4);   System.out.println(b + "+" + c + "=" + b.add(c));   System.out.println(b + "-" + c + "=" + b.minus(c));   System.out.println(b + "*" + c + "=" + b.multiply(c));   System.out.println(b + "/" + c + "=" + b.divide(c)); } }

// Complex类 class Complex { private double m;// 实部 private double n;// 虚部

public Complex(double m, double n) {   this.m = m;   this.n = n; }

// add public Complex add(Complex c) {   return new Complex(m + c.m, n + c.n); }

// minus public Complex minus(Complex c) {   return new Complex(m - c.m, n - c.n); }

// multiply public Complex multiply(Complex c) {   return new Complex(m * c.m - n * c.n, m * c.n + n * c.m); }

// divide public Complex divide(Complex c) {   double d = Math.sqrt(c.m * c.m) + Math.sqrt(c.n * c.n);   return new Complex((m * c.m + n * c.n) / d, Math.round((m * c.n - n * c.m) / d)); }

public String toString() {   String rtr_str = "";   if (n > 0)    rtr_str = "(" + m + "+" + n + "i" + ")";   if (n == 0)    rtr_str = "(" + m + ")";   if (n < 0)    rtr_str = "(" + m + n + "i" + ")";   return rtr_str; } } //测试代码

public static ComplexTest{ public static void main(String[] args){ class Complex {

private double m;// 实部 private double n;// 虚部

public Complex(double m, double n) { this.m = m; this.n = n; }

public String toString() { String rtr_str = ""; if (n > 0) rtr_str = "(" + m + "+" + n + "i" + ")"; if (n == 0) rtr_str = "(" + m + ")"; if (n < 0) rtr_str = "(" + m + n + "i" + ")"; return rtr_str;   }

}

}

}

2实验报告中统计自己的PSP(Personal Software Process)时间

步骤

耗时

百分比

需求分析

  1h

 10%

设计

 1h  20%

代码实现

 2h  30%

测试

 1h  30%

分析总结

 1h

 10%

 

 五 心得体会

 做完本次实验 最深的感受就是要按照步骤一步一步不怕麻烦细心地来 遇到不会的问题及时拜托同学帮助  通过对虚拟机的使用 逐渐熟悉起来 这对以后的学习也是很有帮助的

再者 编写程序时候要考虑周到 及时调试并且改正问题

期待下次实验能够再一次增强自己的能力 

posted @ 2015-05-07 20:18  20135331文艺  阅读(153)  评论(0编辑  收藏  举报