第一提交点
在之前,我都比较少用到IDEA,但是,由于这次实验规定要以IDEA为平台,于是,我参考了Intellj IDEA 简易教程后,复习了一下IDEA的使用方法。然后,看了实验二《Java面向对象程序设计》的一点说明之后,我开始着手按照两篇博客上面的指示做实验。
按照教程上面设置junit,期间,运行的时候对@test提示错误:不支持注释,我的解决方法是把原来装载jdk的目录又jdk换成jdk64。接着,跟着教程的步骤输入代码和调试代码,运行调试代码时提示错误时,就回到代码里做出相应的修改。
运行截图如下:
第二提交点
有了实验二-1的经验,实验二-2的完成变得容易了一些。参考了积极主动敲代码,使用JUnit学习Java的StringBufferDemo程序和实验二《Java面向对象程序设计》的一点说明的提交样例后,我把StringBufferDemo的代码加以修改后,输入到IDEA里面,然后参考提交样例的测试代码写了自己的测试代码。这一次,在编译上没有遇到什么刁钻古怪的问题,比较顺利地就得出了测试的结果。
测试截图:
第三提交点
看了实验二 Java面向对象程序设计的“(二)面向对象三要素”部分的内容,再结合Java课本上面的所讲的概念,我多多少少明白了一些老师课堂上所讲的关于
(1)抽象;(2)封装、继承与多态;的一些内容。
(1)过程抽象的结果是函数;数据抽象的结果是抽象数据类型,而类可以作具有继承和多态机制的抽象数据类型。数据抽象才是面向对象编程实现的核心和起源。
(2)1、封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化和信息隐藏的好处;接口是封装的准确描述手段。
2、继承指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。继承的关键在于确认子类为父类的一个特殊类型。继承是实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径。
3、但是,继承更重要的作用是实现多态。多态是指不同的类对象调用同一个签名的成员方法时将执行不同代码的现象。多态是面向对象程序设计的灵活性和可扩展性的基础。
实验的要求是对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。我的学号模6后得5,任务是让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确。
截图:
第四提交点
任务:以TDD的方式开发一个复数类Complex,要求如下:
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)
//Override Object
public boolean equals(Object obj)
public String toString()
// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
复数的四则运算公式为:
加法:(a+bi)+(c+di)=(a+c)+(b+d)i
减法:(a+bi)-(c+di)=(a-c)+(b-d)i
乘法:(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
除法:(a+bi)/(c+di)=(a+bi)(c-di)/(c2+d2)
测试代码
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a=new Complex(2.5,1.6);
Complex b=new Complex(-5.4,3.0);
Complex c=new Complex(4.8,-2.0);
Complex d=new Complex(-5,-8.0);
@Test
public void testGetReal() {
assertEquals(2.5,a.GetReal());
assertEquals(-5.4,b.GetReal());
assertEquals(4.8,c.GetReal());
assertEquals(-5,d.GetReal());
}
@Test
public void testGetImage() {
assertEquals(1.6,a.GetImage());
assertEquals(3.0,b.GetImage());
assertEquals(-2.0,c.GetImage());
assertEquals(-8,d.GetImage());
}
@Test
public void testComplexAdd() {
assertEquals("-2.9+4.6i",a.ComplexAdd(b).toString());
assertEquals("7.3-0.4i",c.ComplexAdd(a).toString());
}
@Test
public void testComplexSub() {
assertEquals("-2.3+3.6i",a.ComplexSub(c).toString());
assertEquals("0.4-11.0i",d.ComplexSub(b).toString());
}
public void testComplexMulti() {
assertEquals("0.3-28.0i",a.ComplexMulti(d).toString());
}
public void testComplexDiv() {
assertEquals("-0.28426966+0.13483146i",a.ComplexDiv(d).toString());
}
}
产品代码
class Complex {
private double r;
private double i;
public void SetReal(double real) {
r=real;
}
public void SetImage(double image) {
i=image;
}
public double GetReal() {
return r;
}
public double GetImage() {
return i;
}
public Complex() {
}
public Complex(double real,double image) {
SetReal(real);
SetImage(image);
}
Complex ComplexAdd(Complex a) {
Complex c=new Complex();
c.r=this.r+a.r;
c.i=this.i+a.i;
return c;
}
Complex ComplexSub(Complex a) {
Complex c=new Complex();
c.r=this.r-a.r;
c.i=this.i-a.i;
return c;
}
Complex ComplexMulti(Complex a) {
Complex c=new Complex();
c.r=this.r*a.r-this.i*a.i;
c.i=this.r*a.i+this.i*a.r;
return c;
}
Complex ComplexDiv(Complex a) {
Complex c=new Complex();
double d=a.r*a.r+a.i*a.i;
c.r=(this.r*a.r+this.i*a.i)/d;
c.i=(this.i*a.r-this.r*a.i)/d;
return c;
}
public String toString() {
String s="0";
if(i==0) {
s=String.valueOf(r);
return s;
}
else if(r==0) {
s=String.valueOf(i)+"i";
return s;
}
else {
if(i>0) {
s=String.valueOf(r)+"+"+String.valueOf(i)+"i";
return s;
}
else if(i<0) {
s=String.valueOf(r)+String.valueOf(i)+"i";
return s;
}
}
return s;
}
}
测试截图
虽然显示希望值与实际值有出入,但是是因为数值精度不够细致,而测试出来的结果是正确的。
第五提交点
实验要求
- 使用StarUML对实验二中的代码进行建模,发类图的截图,加上学号水印
- 类图中只少两个类
- 类,继承,接口实现,组合在UML中表达
要求找一个比较复杂的程序截图,于是我选择了本次实验中难度比较大的复数计算实现的代码来进行UML建模
实验截图
实验总结
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 12min | 10% |
设计 | 10min | 8% |
代码实现 | 48min | 40% |
测试 | 40min | 34% |
分析总结 | 10min | 8% |