20165324 实验二《Java面向对象程序设计》实验报告

一、实验报告封面

课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324

指导教师:娄嘉鹏 实验日期:2018年4月16日

实验时间:13:45 - 15:25 实验序号:24

实验名称:面向对象程序设计

实验内容

提交点一

  • “测试驱动开发”(TDD)。TDD的一般步骤如下:
  1. 明确当前要完成的功能,记录成一个测试列表
  2. 快速完成编写针对此功能的测试用例
  3. 测试代码编译不通过(没产品代码呢)
  4. 编写产品代码
  5. 测试通过
  6. 对代码进行重构,并保证测试通过(重构下次实验练习)
  7. 循环完成所有功能的开发

提交点二

  • public int capacity()返回当前容量。容量指可用于最新插入字符的存储量,超过这一容量便需要再次分配。
  • 示例代码如下,使用TDD学习测试四个方法。
public class StringBufferDemo {
public static void main(String [] args) {
StringBuffer buffer = new StringBuffer();
buffer.append('S');//调用方法append,输入char型
buffer.append("tringBuffer");//调用方法append,输入String型
System.out.println(buffer.charAt(1));//t
System.out.println(buffer.capacity());//返回buffer对象的容量:16
System.out.println(buffer.length());//返回buffer对象的长度:12
System.out.println(buffer.indexOf("tring"));//返回输入的子字符串的第一个字母在母字符串的位置。
System.out.println("buffer = " + buffer.toString());
}
}
  • 测试代码为:
import junit.framework.TestCase;
import org.testng.annotations.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a= new StringBuffer("String");
StringBuffer b = new StringBuffer("StringBuffer");
@Test
public void testcharAt() throws Exception{
assertEquals('S',a.charAt(0));
assertEquals('g',a.charAt(5));
}
@Test
public void testcapacity() throws Exception{
assertEquals(22,a.capacity());
assertEquals(28,b.capacity());
}
@Test
public void testlength() throws Exception{
assertEquals(6,a.length());
assertEquals(12,b.length());
}
@Test
public void testindexOf() throws Exception{
assertEquals(0,a.indexOf("Str"));
assertEquals(6,b.indexOf("Bu"));
}
}

提交点三

设计模式初步

  • S.O.L.I.D原则
  1. SRP(Single ResponsibilityPrinciple,单一职责原则)
  2. OCP(Open-Closed Principle,开放-封闭原则)
  3. LSP(Liskov Substitusion Principle,Liskov替换原则)
  4. ISP(Interface Segregation Principle,接口分离原则)
  5. DIP(Dependency Inversion Principle,依赖倒置原则
  • 设计原则:
  1. OCP原则:开放-封闭yuanze。其具体内容为:软件实体扩充开放,修改关闭。可以通过抽象和继承;面对接口编程。
  2. DIP原则:依赖倒置原则。其具体内容为:高层模版不应该依赖与底层模版,二者都应该依赖于抽象;抽象不应该依赖于细节,细节一个依赖与抽象。
  • 设计模式有四个基本要素:
  1. Pattern name:描述模式,便于交流,存档
  2. Problem:描述何处应用该模式
  3. Solution:描述一个设计的组成元素,不针对特例
  4. Consequence:应用该模式的结果和权衡(trade-offs)

对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式

  • 还是不太理解设计模式的使用,自己完全是参考下图,及相关代码仿照编写的byte数据的扩充。

// 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 byteteger extends Data {
byte value;
byteteger() {
value=24;
}
public void DisplayValue() {
System.out.println(value);
}
}
// Pattern Classes
abstract class Factory {//抽象一个类
abstract public Data CreateDataObject();//抽象方法,返回一个Date类创建的对象
}
class IntFactory extends Factory {//继承抽象类,重写方法
public Data CreateDataObject(){//返回一个Integer类创建的对象
return new Integer();
}
}
class byteFactoey extends Factory {
public Data CreateDataObject() {
return new byteteger();
}
}
//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;
static Document b;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
b=new Document(new byteFactoey());
b.DisplayData();
}
}

提交点四

  • 提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印
  • 任务:以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开发思路回顾:
  1. 明确当前要完成的功能,记录成一个测试列表
  2. 快速完成编写针对此功能的测试用例
  3. 测试代码编译不通过(没产品代码呢)
  4. 编写产品代码
  5. 测试通过
  6. 对代码进行重构,并保证测试通过(重构下次实验练习)
  7. 循环完成所有功能的开发
  • 复数的四则运算公式
  1. (a+bi)+(c+di)=(a+c)+(b+d)i
  2. (a+bi)-(c+di)=(a-c)+(b-d)i
  3. (a+bi)*(c+di)=(ac-bd)+(ad+bc)i
  4. (a+bi)/(c+di)=(a+bi)(c-di)/(c2+d2)

按照步骤:

  • 测试代码为:
/*(1)属性:复数包含实部和虚部两个部分,
double RealPart;复数的实部
double ImagePart;复数的虚部
getRealPart():返回复数的实部
getImagePart();返回复数的虚部
setRealPart():设置复数的实部
setImagePart();设置复数的虚部
输出形式:a+bi
(2)方法:
①定义构造函数
public Complex()
public Complex(double R,double I)
②定义公有方法:加减乘除
Complex ComplexAdd(Complex a):实现复数加法
Complex ComplexSub(Complex a):实现复数减法
Complex ComplexMulti(Complex a):实现复数乘法
Complex ComplexDiv(Complex a):实现复数除法
③Override Object
public String toString():将计算结果转化为字符串形式并输出*/ import junit.framework.TestCase;
import org.testng.annotations.Test;
public class ComplexTest extends TestCase {
Complex c1=new Complex(1,1);
Complex c2=new Complex(1,0);
Complex c3=new Complex(0,1);
Complex c4=new Complex(-1,-1);
@Test
public void testComplexAdd() {
assertEquals("2.0+1.0i",c1.ComplexAdd(c2).toString());
assertEquals("1.0+1.0i",c2.ComplexAdd(c3).toString());
assertEquals("1.0+1.0i",c3.ComplexAdd(c2).toString());
assertEquals("0.0",c1.ComplexAdd(c4).toString());
}
@Test
public void testComplexSub() {
assertEquals("1.0i",c1.ComplexSub(c2).toString());
assertEquals("1.0",c1.ComplexSub(c3).toString());
assertEquals("2.0+2.0i",c1.ComplexSub(c4).toString());
assertEquals("1.0-1.0i",c2.ComplexSub(c3).toString());
}
@Test
public void testComplexMulti() {
assertEquals("1.0+1.0i",c1.ComplexMulti(c2).toString());
assertEquals("-1.0+1.0i",c1.ComplexMulti(c3).toString());
assertEquals("1.0i",c2.ComplexMulti(c3).toString());
assertEquals("-2.0i",c1.ComplexMulti(c4).toString());
}
@Test
public void testComplexDiv() {
assertEquals("1.0+1.0i", c1.ComplexDiv(c2).toString());
assertEquals("1.0+1.0i", c1.ComplexDiv(c3).toString());
assertEquals("-1.0-1.0i", c1.ComplexDiv(c4).toString());
assertEquals("-0.5-0.5i", c2.ComplexDiv(c4).toString());
}
}
  • 产品代码为:
/*(1)属性:复数包含实部和虚部两个部分,
double RealPart;复数的实部
double ImagePart;复数的虚部
getRealPart():返回复数的实部
getImagePart();返回复数的虚部
setRealPart():设置复数的实部
setImagePart();设置复数的虚部
输出形式:a+bi
(2)方法:
①定义构造函数
public Complex()
public Complex(double R,double I)
②定义公有方法:加减乘除
Complex ComplexAdd(Complex a):实现复数加法
Complex ComplexSub(Complex a):实现复数减法
Complex ComplexMulti(Complex a):实现复数乘法
Complex ComplexDiv(Complex a):实现复数除法
③Override Object
public String toString():将计算结果转化为字符串形式并输出
*/
public class Complex {
private double RealPart;//复数的实部
private double ImagePart;//复数的虚部
public Complex() {}
public Complex(double a, double b) {
setRealPart(a);
setImagePart(b);
}
public void setRealPart(double a) {
RealPart = a;
}
public void setImagePart(double b) {
ImagePart = b;
}
public double getRealPart() {//返回复数的实部
return RealPart;
}
public double getImagePart() {
return ImagePart;
}
Complex ComplexAdd(Complex a) {//(a+bi)+(c+di)=(a+c)+(b+d)i
Complex complex = new Complex();
complex.RealPart = this.RealPart + a.RealPart;
complex.ImagePart = this.ImagePart + a.ImagePart;
return complex;
}
Complex ComplexSub(Complex a) {//(a+bi)-(c+di)=(a-c)+(b-d)i
Complex complex=new Complex();
complex.RealPart=this.RealPart-a.RealPart;
complex.ImagePart=this.ImagePart-a.ImagePart;
return complex;
}
Complex ComplexMulti(Complex a) {//(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
Complex complex =new Complex();
complex.RealPart=this.RealPart*a.RealPart-this.ImagePart*a.ImagePart;
complex.ImagePart=this.RealPart*a.ImagePart+this.ImagePart*a.RealPart;
return complex;
}
Complex ComplexDiv(Complex a) {//(a+bi)/(c+di)=(a+bi)(c-di)/(c^2+d^2)
Complex complex=new Complex();
complex.RealPart=(this.RealPart*a.ImagePart+this.ImagePart*a.RealPart)/(a.ImagePart*a.ImagePart+a.RealPart*a.RealPart);
complex.ImagePart=(this.ImagePart*a.ImagePart+this.RealPart*a.RealPart)/(a.ImagePart*a.ImagePart+a.RealPart*a.RealPart);
return complex;
}
public String toString() {
if (ImagePart==0) {
String str = String.valueOf(RealPart);
return str;
}
else if (RealPart==0) {
String str = String.valueOf(ImagePart)+"i";
return str;
}
else {
if (ImagePart>0) {
String str = String.valueOf(RealPart) + "+" + String.valueOf(ImagePart) + "i";
return str;
}
else {
String str = String.valueOf(RealPart) + String.valueOf(ImagePart) + "i";
return str;
}
}
}
}
  • 测试结果:

提交点5

  • 检查点要求:使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。参考http://www.cnblogs.com/rocedu/p/6736847.html

    类图中只少两个类。

  • 问题1:对于Complex ComplexAdd(Complex a)理解有误。自己只顾着编写测试代码,完全忽略了该方法的意思。
  • 问题1解决方法:该方法表示返回值为一个Complex对象的方法,其参数为一个Complex对象,进行运算。
  • 问题2:对于变量的使用,最开始没注意使用this关键字,运算出错。
  • 问题2解决方法:P84在实例方法中使用this:当this关键字出现在实例方法中时,this就代表正在调用该方法的当前对象

20165324 实验二《Java面向对象程序设计》实验报告的更多相关文章

  1. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  4. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  5. 实验二 Java面向对象程序设计实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  6. 20145326《Java程序设计》实验二Java面向对象程序设计实验报告

    20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  7. 20155217 实验二 Java面向对象程序设计 实验报告

    20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...

  8. 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告

    20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...

  9. 20162305 实验二 Java面向对象程序设计 实验报告

    20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...

  10. 20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告

    20145239 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...

随机推荐

  1. 关于Cocos2d-x中两个场景之间参数的传递

    两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法 你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢 ...

  2. 第二百七十节,Tornado框架-生成验证码图片,以及验证码结合Session验证

    Tornado框架-生成验证码图片,以及验证码结合Session验证 第一.生成验证码图片  生成验证码图片需要两个必须模块 1.python自带的random(随机模块) 2.Pillow()图像处 ...

  3. 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入

    Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...

  4. 监听过多,会抛tooManyListener例外

    在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing(). 为了配合后面的实现,我们必须将Win ...

  5. 静态内部类定义在类中,任何方法外,用static定义

    静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量) 静态内部类定义在类中,任何方法外,用static定义. 静态内部类只能访问外部类的静态成员. 生成(new)一个静态内部类不需要外部 ...

  6. add命令

    将文件加入到索引,要使用add命令.在<file>指定加入索引的文件.用空格分割可以指定多个文件. git add demo.html test.html //添加两个文件 添加当前目录下 ...

  7. SSH开发环境整合搭建

    1.建立动态web工程,加入必要的jar包. antlr-2.7.7.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar c3p0-0.9.1.2 ...

  8. 移动ChemDraw结构有什么方法

    ChemDraw软件是一款比较常见的化学绘图软件,化学专业的领域的人常常会用到它.本教程主要是针对新手用户,让其了解一些ChemDraw的一些基本操作,以便其能尽快上手早日用到工作中.下面我们就来给大 ...

  9. PHP正则表达式 /i, /s, /x,/u, /U, /A, /D, /S等模式修饰符

    i (PCRE_CASELESS) 如果设置了这个修饰符, 模式中的字母会进行大小写不敏感匹配. m (PCRE_MULTILINE) 默认情况下, PCRE认为目标字符串是由单行字符组成的(然而实际 ...

  10. Using XSLT and Open XML to Create a Word 2007 Document

    Summary: Learn how to transform XML data into a Word 2007 document by starting with an existing docu ...