20145228 《Java程序设计》实验报告二:Java面向对象程序设计
实验内容
•初步掌握单元测试和TDD
•理解并掌握面向对象三要素:封装、继承、多态
•初步掌握UML建模
•熟悉S.O.L.I.D原则
•了解设计模式
实验步骤
(一)单元测试
三种代码
•伪代码
两个复数相加
两个复数相减
两个复数相乘
正确格式输出
•产品代码
import java.util.Scanner;
public class Complex { // 复数类
double real; // 实部
double image; // 虚部
Complex(){ // 不带参数的构造方法
Scanner input = new Scanner(System.in);
double real = input.nextDouble();
double image = input.nextDouble();
Complex(real,image);
}
private void Complex(double real, double image) { // 供不带参数的构造方法调用
// TODO Auto-generated method stub
this.real = real;
this.image = image;
}
Complex(double real,double image){ // 带参数的构造方法
this.real = real;
this.image = image;
}
public double getReal() {
return real;
}
public void setReal(double real) {
this.real = real;
}
public double getImage() {
return image;
}
public void setImage(double image) {
this.image = image;
}
Complex add(Complex a){ // 复数相加
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real + real2;
double newImage = image + image2;
Complex result = new Complex(newReal,newImage);
return result;
}
Complex sub(Complex a){ // 复数相减
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real - real2;
double newImage = image - image2;
Complex result = new Complex(newReal,newImage);
return result;
}
Complex mul(Complex a){ // 复数相乘
double real2 = a.getReal();
double image2 = a.getImage();
double newReal = real*real2 - image*image2;
double newImage = image*real2 + real*image2;
Complex result = new Complex(newReal,newImage);
return result;
}
public void print(){ // 输出
if(image > 0){
System.out.println(real + " + " + image + "i");
}else if(image < 0){
System.out.println(real + "" + image + "i");
}else{
System.out.println(real);
}
}
}
public class MainClass { // 用于测试复数类
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请用户输入第一个复数的实部和虚部:");
Complex data1 = new Complex();
System.out.println("请用户输入第二个复数的实部和虚部:");
Complex data2 = new Complex();
// 以下分别为加减乘除
Complex result_add = data1.add(data2);
Complex result_sub = data1.sub(data2);
Complex result_mul = data1.mul(data2);
result_add.print();
result_sub.print();
result_mul.print();
}
}
运行结果:
•测试代码
package Test;
import org.junit.Test;
import static org.junit.Assert.*;
public class ComplexTest {
MyComplex a=new MyComplex(1,2);
MyComplex b=new MyComplex(1,-4);
MyComplex c=new MyComplex(19,0);
MyComplex d=new MyComplex(0,-3);
MyComplex e=new MyComplex(0,0);
}
@Test
public void add() throws Exception {
assertEquals("(2.0-2.0i)", a.add(b).toString());
assertEquals("(20.0+2.0i)", a.add(c).toString());
assertEquals("(1.0-1.0i)", a.add(d).toString());
assertEquals("(1.0+2.0i)", a.add(e).toString());
}
@Test
public void minus() throws Exception {
assertEquals("(0.0+6.0i)", a.minus(b).toString());
assertEquals("(-18.0+2.0i)", a.minus(c).toString());
assertEquals("(1.0+5.0i)", a.minus(d).toString());
assertEquals("(1.0+2.0i)", a.minus(e).toString());
}
@Test
public void multiply() throws Exception {
assertEquals("(9.0-2.0i)", a.multiply(b).toString());
assertEquals("(19.0+38.0i)", a.multiply(c).toString());
assertEquals("(6.0-3.0i)", a.multiply(d).toString());
assertEquals("(0.0)", a.multiply(e).toString());
}
}
建立的模型
(二)面向对象三要素
(1)抽象
•抽象一词的本意是指人在认识思维活动中对事物表象因素的舍弃和对本质因素的抽取。抽象是人类认识复杂事物和现象时经常使用的思维工具,抽象思维能力在程序设计中非常重要,"去粗取精、化繁为简、由表及里、异中求同"的抽象能力很大程度上决定了程序员的程序设计能力。
•抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。
•程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
(2)封装、继承与多态
•面向对象(Object-Oriented)的三要素包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。
(三)设计模式初步
(1)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,依赖倒置原则)
(2)模式与设计模式
•模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用,每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。计算机科学中有很多模式:
•GRASP模式
•分析模式
•软件体系结构模式
•设计模式:创建型,结构型,行为型
•管理模式: The Manager Pool 实现模式
•界面设计交互模式
(3)设计模式实示例
•设计模式可以帮我们以最好的方式来设计系统。设计模式背后是抽象和SOLID原则。
•设计模式有四个基本要素:
•Pattern name:描述模式,便于交流,存档
•Problem:描述何处应用该模式
•Solution:描述一个设计的组成元素,不针对特例
•Consequence:应用该模式的结果和权衡(trade-offs)
总结
这次实验让我们感受到了单元测试的好处,单元测试能使我们的代码避免很多错误,一旦代码量更多的时候,这时我们能节约大量时间和空间。
PSP(Personal Software Process)时间
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 10min | 10% |
设计 | 20min | 20% |
代码实现 | 40min | 40% |
测试 | 15min | 15% |
分析总结 | 15min | 15% |