2018-2019-20175203 实验二 《Java面向对象程序设计》实验报告
实验要求
- 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
- 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
-
严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
实验步骤
(一)单元测试
(1)三种代码
- 伪代码:从意图层面来解决问题
- 产品代码:实现预期功能
-
测试代码:测试预期功能
(2)单元测试:对类实现的测试
单击
file
>new
>project
之后一路next即可,由于本次实验需要junit,我就先在实验前对其进行安装,唯一需要注意的是要导出在下载文件的时候的那俩文件(junit开头的那俩)才能使用,那么教训就来了,千万别把它的下载文件夹放的太深!!!这样你每建一个新项目就要找十多个文件夹才能找到。。。。(当然你也可以亡羊补牢,在第一次找到之后就把那个IDEA—U文件夹导出来)
接下来就是本次实验了,这个不得不说老师给的太详细了(如果你是用蓝墨云的链接进入的而不是直接在博客里打开的话,,,(博客里直接打开好多图片都损毁了))只要顺着老师的过程往下走就顺理成章的出来了,要提的一句就是点击public
类名称再点击小灯泡create test
选择Junit3即可新建test类
*错误情况
*边界情况
*通过测试截图
注意测试前一定要有注解@test
(3)以 TDD的方式研究学习StringBuffer
这里需要安装·Junit
,由于在前文提到就不再过多赘述了,然后说一下TDD,在我看来就是一种逆向思维,原始的是先通过作出程序产品再进行检测,其实这个往往是会出现遗漏的,但是将其逆向就变得干净有效了,这个有点像食品安全检测,现制定一个检测标准(即test类)所有的食品(产品代码)放到里边进行测试,不通过就不让生产(测试不通过,重新写),这样往往对漏洞能有较全面的筛查。
根据实验要求编写代码
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer buffer = new StringBuffer("StringBuffer");
@Test
public void testcharAt(){
assertEquals('S',buffer.charAt(0));
}
@Test
public void testcapacity(){
assertEquals(28,buffer.capacity());
}
@Test
public void testindexof(){
assertEquals(1,buffer.indexOf("tring"));
}
@Test
public void testtoString(){
assertEquals("StringBuffer",buffer.toString());
}
}
测试截图
用自己的学号%6进行取余运算,根据结果进行代码扩充:
0: 让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
1: 让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
2: 让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
3: 让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
4: 让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
5: 让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
我的学号为5203即选则支持Short类
*实验代码
// Server Classes
abstract class Data {
abstract public void DisplayValue();
}
class Integer extends Data {
int value;
Integer() {
value=100;
}
public void DisplayValue(){
System.out.println (value);
}
}
class Short extends Data {
short value;
Short() {
value = 5203;
}
public void DisplayValue(){
System.out.println (value);
}
}
// Pattern Classes
abstract class Factory {
abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
public Data CreateDataObject(){
return new Integer();
}
}
class ShortFactory extends Factory {
public Data CreateDataObject(){
return new Short();
}
}
//Client classes
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
//Test class
public class MyDoc {
static Document d;
public static void main(String[] args) {
d = new Document(new ShortFactory());
d.DisplayData();
}
}
*运行截图如下
(4)以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)
以TDD的方式进行开发,即先进行测试代码的编写,如下:
import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest extends TestCase {
Complex a = new Complex(5.0, 6.0);
Complex b = new Complex(-3.0, 4.0);
@Test
public void testgetRealPart() {
assertEquals(5.0,a.getRealPart());
assertEquals(-3.0,b.getRealPart());
}
@Test
public void testgetImagePart() {
assertEquals(6.0,a.getImagePart());
assertEquals(4.0,b.getImagePart());
}
@Test
public void testtoString() {
assertEquals("Complex{RealPart=5.0, ImagePart=6.0}",a.toString());
assertEquals("Complex{RealPart=-3.0, ImagePart=4.0}",b.toString());
}
@Test
public void testequals() {
assertEquals(false,a.equals(b));
Complex c = new Complex(a.getRealPart(),a.getImagePart());
assertEquals(true,a.equals(c));
}
@Test
public void testComplexAdd() {
assertEquals(2.0,a.ComplexAdd(b).getRealPart());
assertEquals(10.0,a.ComplexAdd(b).getImagePart());
}
@Test
public void testComplexSub() {
assertEquals(8.0,a.ComplexSub(b).getRealPart());
assertEquals(2.0,a.ComplexSub(b).getImagePart());
}
@Test
public void testComplexMulti() {
assertEquals(-39.0,a.ComplexMulti(b).getRealPart());
assertEquals(2.0,a.ComplexMulti(b).getImagePart());
}
@Test
public void testComplexDiv() {
assertEquals(0.36,a.ComplexDiv(b).getRealPart());
assertEquals(-1.52,a.ComplexDiv(b).getImagePart());
}
}
接下来是产品代码开发
public class Complex {
public double getRealPart() {
return RealPart;
}
public double getImagePart() {
return ImagePart;
}
double RealPart;
double ImagePart;
public void setRealPart(double realPart) {
RealPart = realPart;
}
public void setImagePart(double imagePart) {
ImagePart = imagePart;
}
public Complex(){}
public Complex(double R,double I){
this.ImagePart = I;
this.RealPart = R;
}
@Override
public String toString() {
return "Complex{" +
"RealPart=" + RealPart +
", ImagePart=" + ImagePart +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Complex complex = (Complex) o;
return Double.compare(complex.getRealPart(), getRealPart()) == 0 &&
Double.compare(complex.getImagePart(), getImagePart()) == 0;
}
Complex ComplexAdd(Complex a) {
return new Complex(this.RealPart + a.RealPart,this.ImagePart + a.ImagePart);
}
Complex ComplexSub(Complex a){
return new Complex(this.RealPart - a.RealPart,this.ImagePart - a.ImagePart);
}
Complex ComplexMulti(Complex a){
return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
}
Complex ComplexDiv(Complex a){
double scale = a.getRealPart()*a.getRealPart() + a.getImagePart()*a.getImagePart();
Complex b = new Complex(a.getRealPart() / scale, - a.getImagePart() / scale);
return this.ComplexMulti(b);
}
}
*测试截图
(5)使用StarUML对实验二中的代码进行建模
这里要先道个歉,,,由于之前着急提交蓝墨云而且自己的电脑还没下这个软件,就草草的用别人的电脑做了一个,,,但是后来发现线上的processon
也挺好用的,截图如下