2018-2019-2 20175233实验二《Java面向对象程序设计》实验报告
实验二 Java面向对象程序设计
一.实验内容:
1.初步掌握单元测试和TDD
2.理解并掌握面向对象三要素:封装、继承、多态
3.初步掌握UML建模
4.熟悉S.O.L.I.D原则
5.了解设计模式
二.实验步骤:
1.单元测试
1.在src目录中创建产品代码,在菜单中选择New--->Directory,新建一个目录test,把测试代码放在test目录中,右键单击项目.

2.再右键点击设置环境变量,选择Mark Directory--->Test Sources Root。

3.根据实验内容代码进行测试.

测试都符合预期,这时提供产品代码。
2.TDD(Test Driven Devlopment, 测试驱动开发)
步骤:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
![10.png]()


测试结果

3.面向对象三要素
抽象:抽出事物的本质特征而暂不考虑细节,对于复杂的问题分层求解
- 过程抽象:结果是函数
- 数据抽象:结果是抽象数据类型
封装,继承与多态(面向对象的三要素)
- 封装:将数据与相关行为包装在一起以实现信息隐藏,java中使用类进行封装,接口是封装准确描述手段
- 继承:关键在于确认子类为父类的一个特殊类型,以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态
- 多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式
具体代码
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Long extends Data{
long value;
Long(){
value=1234567890;
}
public void DisplayValue(){
System.out.println(value);
}
}
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class LongFactory extends Factory{
public Data CreateDataObject(){
return new Long();
}
}
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d;
static Document e;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
e=new Document(new LongFactory()); //20175215
e.DisplayData();
}
}
运行截图

4.设计模式初步
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,依赖倒置原则)
设计模式
- Pattern name:描述模式,便于交流,存档
- Problem:描述何处应用该模式
- Solution:描述一个设计的组成元素,不针对特例
- Consequence:应用该模式的结果和权衡(trade-offs)
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a1 =new Complex(3.0,4.0);
Complex a2 =new Complex( 2.0,-4.0);
Complex a3 =new Complex(0.0,0.0);
Complex a4 =new Complex(-3.0,0.0);
Complex a5 =new Complex(-6.0,-0.8);
@Test
public void testgetRealPart()throws Exception{
assertEquals(3.0,a1.getReal());
assertEquals(2.0,a2.getReal());
assertEquals(0.0,a3.getReal());
assertEquals(-3.0,a4.getReal());
assertEquals(-6.0,a5.getReal());
}
@Test
public void testgetImagePart()throws Exception{
assertEquals(4.0,a1.getImaginary());
assertEquals(-4.0,a2.getImaginary());
assertEquals(0.0,a3.getImaginary());
assertEquals(0.0,a4.getImaginary());
assertEquals(-0.8,a5.getImaginary());
}
@Test
public void testtoString()throws Exception{
assertEquals("3.0+4.0i",a1.toString());
assertEquals("2.0-4.0i",a2.toString());
assertEquals("0",a3.toString());
assertEquals("-3.0",a4.toString());
assertEquals("-6.0-0.8i",a5.toString());
}
@Test
public void testComplexAdd()throws Exception{
assertEquals("5.0",a1.ComplexAdd(a2).toString());
assertEquals("2.0-4.0i",a2.ComplexAdd(a3).toString());
assertEquals("-3.0",a3.ComplexAdd(a4).toString());
}
@Test
public void testComplexSub()throws Exception{
assertEquals("1.0+8.0i",a1.ComplexSub(a2).toString());
assertEquals("-2.0+4.0i",a3.ComplexSub(a2).toString());
assertEquals("3.0",a3.ComplexSub(a4).toString());
}
@Test
public void testComplexMulti()throws Exception{
assertEquals("22.0-4.0i",a1.ComplexMulti(a2).toString());
assertEquals("0",a2.ComplexMulti(a3).toString());
assertEquals("18.0+2.4i",a4.ComplexMulti(a5).toString());
}
@Test
public void testComplexDiv()throws Exception{
assertEquals("-0.2-1.2i",a1.ComplexDiv(a2).toString());
assertEquals("0",a3.ComplexDiv(a2).toString());
}
@Test
public void testequals()throws Exception{
assertEquals(true,a1.equals(a1));
assertEquals(false,a1.equals(a2));
}
}
产品代码
import java.text.DecimalFormat;//引入DecimalFormat包取一位整数和一位小数
public class Complex {
double Real=0;
double Imaginary=0;
public Complex(){}
public Complex(double Real,double Imaginary){
this.Real=Real;
this.Imaginary=Imaginary;
}
public double getReal(){
return Real;
}
public double getImaginary(){
return Imaginary;
}
public String toString(){
String s = "";
double r=Real;
double i=Imaginary;
if(r==0&&i==0){
s="0";
}
else if(r==0&&i!=0){
s=i+"i";
}
else if(r!=0&&i<0){
s=r+""+i+"i";
}
else if(r!=0&&i==0){
s=r+"";
}
else
{
s=r+"+"+i+"i";
}
return s;
}
public boolean equals(Object obj){//重写equals方法,使其不用来对比字符序列
if(this==obj){
return true;
}
else
return false;
}
DecimalFormat df = new DecimalFormat( "0.0");
public Complex ComplexAdd(Complex a){
return new Complex(Real+a.getReal(),Imaginary+a.getImaginary());
}
public Complex ComplexSub(Complex a){
return new Complex(Real-a.getReal(),Imaginary-a.getImaginary());
}
public Complex ComplexMulti(Complex a){
double r=Real*a.getReal()-Imaginary*a.getImaginary();
double i =Imaginary*a.getReal()+Real*a.getImaginary();
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
}
public Complex ComplexDiv(Complex a){
double r=(Real * a.Imaginary + Imaginary * a.Real) / (a.Imaginary * a.Imaginary + a.Real * a.Real);
double i=(Imaginary * a.Imaginary + Real * a.Real) / (a.Real * a.Real + a.Real * a.Real);
return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
}
}
运行截图

5.建模
- 使用StarUML对实验二中的代码进行建模,发类图的截图,加上学号水印
- 类图中只少两个类
- 类,继承,接口实现,组合在UML中表达
![77.png]()
遇到的问题
在寻找junit.jar时不在默认任文件夹里,通过搜索来解决.





浙公网安备 33010602011771号