20155211实验二 Java面向对象程序设计
20155211实验二 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){
//如果成绩小于0,转成“错误”
if ((grade < 0))
return "错误";
//如果成绩小于60,转成“不及格”
else 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 "优秀";
//如果成绩大于100,转成“错误”
else
return "错误";
}
}
- 测试代码
1.正常情况下
public class MyUtilTest {
public static void main(String[] args) {
//测试正常情况
if(MyUtil.percentage2fivegrade(55) != "不及格")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(65) != "及格")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(75) != "中等")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(85) != "良好")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(95) != "优秀")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
- 出错情况
public class MyUtilTest {
public static void main(String[] args) {
//测试出错情况
if(MyUtil.percentage2fivegrade(-10) != "错误")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(115) != "错误")
System.out.println("test failed 2!");
else
System.out.println("test passed!");
}
}
- 边界测试
public class MyUtilTest {
public static void main(String[] args) {
//测试边界情况
if(MyUtil.percentage2fivegrade(0) != "不及格")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(60) != "及格")
System.out.println("test failed 2!");
else if(MyUtil.percentage2fivegrade(70) != "中等")
System.out.println("test failed 3!");
else if(MyUtil.percentage2fivegrade(80) != "良好")
System.out.println("test failed 4!");
else if(MyUtil.percentage2fivegrade(90) != "优秀")
System.out.println("test failed 5!");
else if(MyUtil.percentage2fivegrade(100) != "优秀")
System.out.println("test failed 6!");
else
System.out.println("test passed!");
}
}
三种测试后截图如下:
2.TDD测试
- 一般步骤
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过
- 循环完成所有功能的开发
UML建模
- 利用StarUML软件进行UML建模,可以将以上思路进行具象化表示
- 显示如下,很清楚地展现了每个类的成员变量、方法函数:
设计模式
S.O.L.I.D 原则
-
SRP(Single Responsibility Principle,单一职责原则)
- 对象提供单一职责的高度封装,对象的改变仅仅依赖于单一职责的改变,它基于软件设计中的高内聚性定义
-
OCP(Open-Closed Principle,开放-封闭原则)
- OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程。
-
LSP(Liskov Substitusion Principle,Liskov替换原则)
- 子类必须可以被其基类所代
- 使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它
- 核心思想是父类型对象可以被子类型对象所取代
-
ISP(Interface Segregation Principle,接口分离原则)
- 客户不应该依赖他们并未使用的接口
-
DIP(Dependency Inversion Principle,依赖倒置原则)
- 高层模块不应该依赖于低层模块。二者都应该依赖于抽象
- 抽象不应该依赖于细节。细节应该依赖于抽象
-
模式与设计模式
-
设计模式:创建型,结构型,行为型
-
设计模式实示例
使用TDD的方式设计关实现复数类Complex
- 产品代码
public class Complex { //a + bi
private double a;
private double b;
public Complex(){ //构造方法,置0
this.a = 0;
this.b = 0;
}
public Complex(double a, double b) { //构造方法,初始化一个复数
this.a = a;
this.b = b;
}
public double getA(){ //获取实部
return this.a;
}
public double getB(){ //获取虚部
return this.b;
}
public double setA(double a){ //设置实部
this.a = a;
return a;
}
public double setB(double b){ //设置虚部
this.b = b;
return b;
}
Complex ComplexAdd(Complex c){//复数相加
double a = c.getA();
double b = c.getB();
double newA = a + this.a;
double newB = b + this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMinus(Complex c){//复数相减
double a = c.getA();
double b = c.getB();
double newA = a - this.a;
double newB = b - this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMulti(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a * this.a;
double newB = b * this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexDiv(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a / this.a;
double newB = b / this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
public String toString() {
String s = " ";
if (b > 0)
s = a + "+" + b + "i";
if (b == 0)
s = a + "";
if (b < 0)
s = a + " " + b + "i";
return s;
}
}
PSP时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 15min | 3/20 |
设计 | 25min | 1/4 |
代码实现 | 20min | 1/5 |
测试 | 15min | 3/20 |
分析总结 | 25min | 1/4 |
总结
这次实验较上次相比,感觉难度有明显的增加。因此也花费了更多时间,在实验的中间步骤中也出现了一些看不懂的地方。将会更加认真的学习java,多多向学得好的同学请教。