20145101 第二次实验报告
实验一 Java开发环境的熟悉
实验目的与要求
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原则
5. 了解设计模式
实验内容及其步骤
(一)单元测试
1、三种代码
当我们想用程序解决问题时,要会写三种码:伪代码,产品代码和测试代码。
- 伪代码
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
- 产品代码
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于60,转成“不及格”
if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade < 100)
return "优秀";
//其他,转成“错误”
else
return "错误";
}
}
2、 TDD(Test Driven Devlopment, 测试驱动开发)
(1)TDD指先写测试代码,再写产品代码的开发方法。
(2)TDD的一般步骤如下:
a.明确当前要完成的功能,记录成一个测试列表
b.快速完成编写针对此功能的测试用例
c.测试代码编译不通过
d.编写产品代码
e.测试通过
f.对代码进行重构,并保证测试通过
g.循环完成所有功能的开发
(二)面向对象三要素
1.抽象
抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。 程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
2.封装、继承与多态
面向对象(Object-Oriented)的三要素包括:封装、继承、多态。
过程抽象的结果是函数,数据抽象的结果是抽象数据类型。
封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。
(三)设计模式初步
(1)S.O.L.I.D原则
面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导。
(2)模式与设计模式
模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用,每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。 计算机科学中有很多模式:
GRASP模式
分析模式
软件体系结构模式
设计模式:创建型,结构型,行为型
管理模式: The Manager Pool 实现模式
界面设计交互模式
最重要的是设计模式,在面向对象中设计模式的地位可以和面向过程编程中的数据结构的地位相当。
(3)设计模式实示例
设计模式(design pattern)提供一个用于细化软件系统的子系统或组件,或它们之间的关系图,它描述通信组件的公共再现结构,通信组件可以解决特定语境中的一个设计问题。
(四)练习
编写计算复数类Complex,分为加减乘除四种情况。
- 实验代码:
public class Complex {
private double m;
private double n;
public Complex(double m,double n) {
this.m = m;
this.n = n;
}
public String add(Complex b) {
Complex x = new Complex(m + b.m, n + b.n);
System.out.println("a" + "+" + "b" + "=" + x);
return "true";
}
public String minus(Complex b) {
Complex x = new Complex(m - b.m, n - b.n);
System.out.println("a" + "-" + "b" + "=" + x);
return "true";
}
public String multiply(Complex b) {
Complex x = new Complex(m * b.m - n * b.n, mb.n + n * b.m);
System.out.println("a" + "" + "b" + "=" + x);
return "true";
}
public String divide(Complex b) {
double d = Math.sqrt(b.m * b.m) + Math.sqrt(b.n * b.n);
Complex x = new Complex((m * b.m + n * b.n) / d,Math.round((m * b.n - n * b.m)/d));
System.out.println("a" + "/" + "b" + "=" + x);
return "true";
}
public String toString() {
String str = "";
if(n>0)
str = "(" + m + "+" + n + "i" + ")";
if(n==0)
str = "(" + m + ")";
if(n<0)
str = "(" + m + n + "i" +")";
return str;
}
}