一、实验报告封面

  • 课程:Java程序设计 班级:1752班 姓名:吴一凡 学号:20175217
  • 指导教师:娄嘉鹏 实验日期:2019年4月15日
  • 实验时间:--- 实验序号:实验二
  • 实验名称:Java开发环境的熟悉
  • 实验题目:
  • 实验要求:
    • 完成实验二《Java面向对象程序设计》中的内容
    • 其中Eclipse相关的内容参考Intellj IDEA 简易教程换成IDEA实现
    • 参考实验二《Java面向对象程序设计》的一点说明,完成云班课中的检查点,也可以先完成实验报告,直接提交。注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明。实验报告中一个检
    • 查点要有多张截图。
    • 发表实验报告博客,标题“学期(如2018-2019-2) 学号(如20175300)实验二《Java面向对象程序设计》实验报告”

二、实验步骤

1.单元测试——对类实现测试

  • 点击New->Directory新建一个test目录,再右键点击设置环境变量,选择Mark Directory->Test Sources Root

  • 分别对“正常情况”、“边界情况”、“异常情况”进行检验

    • 正常情况:

    • 边界情况:

    • 异常情况:

  • 根据上述检验结果对代码进行修改,直至三种检验情况都通过

2.以TDD的方式研究学习StringBuffer

1.TDD的一般步骤

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

2.Junit的配置及使用

1.点击File->Project Structure进入配置界面

2.点击这里的加号

3.在路径中选择你安装IDEA的路径,找到里面的lib文件夹,点击其中的Junit即可

4.点击你要测试的类名,再点击右侧的小灯泡,然后点击Create Test

5.这里选择Junit3,下面选择你要测试的方法

6.依次添加正常测试、边界测试、异常测试,使用assertEquals语句测试实际结果与预期结果是否一致,注意测试用例前一定要有注解@Test。

7.根据报错的assert语句改正产品代码,直至最终测试成功

3.StringBuffer

  • capacity返回的是目前的最大容量而length返回的是字符串长度

    • 默认值为16
    • 根据capacity的构造方法```StringBuffer(int capacity),可以指定初始容量

  • charAt返回该位置上的字符:public char charAt(int index)

  • indexOf返回第一次出现的指定子字符串在该字符串中的索引public int indexOf(String str)

  • String类和StringBuffer类的区别

    • String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
    • StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
    • 一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
  • 用法总结

    • 如果要操作少量的数据用 = String
    • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
  • StringBuffer的测试

4.面向对象三要素

  • 抽象:抽出事物的本质特征而暂不考虑细节,对于复杂的问题分层求解
  • 过程抽象:结果是函数
  • 数据抽象:结果是抽象数据类型
  • 封装,继承与多态(面向对象的三要素)
    • 封装:将数据与相关行为包装在一起以实现信息隐藏,java中使用类进行封装,接口是封装准确描述手段
    • 继承:关键在于确认子类为父类的一个特殊类型,以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态。
    • 多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式

5.设计模式初步

  • 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)

3.OCP原则和DIP原则的应用

  • 让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印:

4.以TDD的方式进行开发

  • 伪代码
// 定义属性并生成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)
  • 产品代码
import java.lang.Integer;
import java.util.Objects; public class Complex {
//定义属性并生成getter,setter
double RealPart;
double ImagePart;
public double getRealPart(){
return RealPart;
}
public double getImagePart(){
return ImagePart;
} //定义构造函数
public Complex(){
RealPart = 0;
ImagePart = 1;
}
public Complex(double R,double I){
RealPart = R;
ImagePart = I;
} //Override Object
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(!(obj instanceof Complex)) {
return false;
}
Complex complex = (Complex) obj;
if(complex.RealPart != ((Complex) obj).RealPart) {
return false;
}
if(complex.ImagePart != ((Complex) obj).ImagePart) {
return false;
}
return true;
}
public String toString(){
String s = new String();
if (ImagePart > 0){
s = getRealPart() + "+" + getImagePart() + "i";
}
if (ImagePart == 0){
s = getRealPart() + "";
}
if(ImagePart < 0){
s = getRealPart() + "" + getImagePart() + "i";
}
if(RealPart == 0){
s = getImagePart() + "i";
}
return s;
}
//定义公有方法:加减乘除
Complex ComplexAdd(Complex a){
return new Complex(RealPart + a.RealPart,ImagePart + a.ImagePart);
}
Complex ComplexSub(Complex a){
return new Complex(RealPart - a.RealPart,ImagePart - a.ImagePart);
}
Complex ComplexMulti(Complex a){
return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,RealPart*a.ImagePart + ImagePart*a.RealPart);
}
Complex ComplexDiv(Complex a) {
return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart));
}
}
  • 测试代码
import junit.framework.TestCase;
import org.junit.Test; public class ComplexTest extends TestCase {
Complex a=new Complex(3.0,4.0);
Complex b=new Complex(0.0,5.0);
Complex c=new Complex(-2.0,-3.0); @Test
public void testgetRealpart() throws Exception{
assertEquals(3.0,a.getRealPart());
assertEquals(0.0,b.getRealPart());
assertEquals(-2.0,c.getRealPart());
} @Test
public void testgetImagePart() throws Exception{
assertEquals(4.0,a.getImagePart());
assertEquals(5.0,b.getImagePart());
assertEquals(-3.0,c.getImagePart());
} @Test
public void testComplexAdd() throws Exception{
assertEquals("3.0+9.0i",a.ComplexAdd(b).toString());
assertEquals("1.0+1.0i",a.ComplexAdd(c).toString());
assertEquals("-2.0+2.0i",b.ComplexAdd(c).toString());
} @Test
public void testComplexSub() throws Exception{
assertEquals("3.0-1.0i",a.ComplexSub(b).toString());
assertEquals("5.0+7.0i",a.ComplexSub(c).toString());
assertEquals("2.0+8.0i",b.ComplexSub(c).toString());
} @Test
public void testComplexMulti() throws Exception{
assertEquals("-20.0+15.0i",a.ComplexMulti(b).toString());
assertEquals("6.0-17.0i",a.ComplexMulti(c).toString());
assertEquals("15.0-10.0i",b.ComplexMulti(c).toString());
} @Test
public void testComplexDiv() throws Exception{
assertEquals("0.6+Infinityi",a.ComplexDiv(b).toString());
} @Test
public void testtoString() throws Exception{
assertEquals("3.0+4.0i",a.toString());
assertEquals("5.0i",b.toString());
assertEquals("-2.0-3.0i",c.toString());
}
}
  • 运行结果

三、实验类图

四、实验中遇到的问题和解决过程

  • 在刚开始测试MyUtil类时,异常测试出现了问题

  • 新建了一个测试主类,通过debug调试发现问题出在条件设置的错误,改正后最终解决了问题

五、实验感悟

  • 通过本次实验,我主要学会了如何编写测试代码,如何使用UML图,也了解了TDD方式、S.O.L.I.D原则以及设计模式等编程思想,相信这些思想也会对我以后的编程有很大的影响,我也会认真总结、反思本次实验中出现的问题,反复消化理解这些知识的~

2018-2019-2 20175217 实验二《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. 20162311 实验二 Java面向对象程序设计 实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. IIS虚拟目录挂载文件服务器目录

    要求说明: 通过网站上传文件保存到统一的文件服务器上. 服务器说明: 1.文件服务器以下称为FilesServer,IP地址为:192.168.1.213 2.Web服务器为以下称为WebServer ...

  2. Oracle AWRDD报告生成和性能分析

    我写的SQL调优专栏:https://blog.csdn.net/u014427391/article/category/8679315 对于局部的,比如某个页面列表sql,我们可以使用Oracle的 ...

  3. 【机器学习】--Python机器学习库之Numpy

    一.前述 NumPy(Numerical Python的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然地使用数组和矩阵. NumPy包含很多实用的数学函数,涵盖线性代数运算.傅 ...

  4. Sql Server 的参数化查询

    为什么要使用参数化查询呢?参数化查询写起来看起来都麻烦,还不如用拼接sql语句来的方便快捷.当然,拼接sql语句执行查询虽然看起来方便简洁,其实不然.远没有参数化查询来的安全和快捷. 今天刚好了解了一 ...

  5. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  6. 【Android Studio安装部署系列】三十三、windows系统中通过SourceTree使用git

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 前期准备 选择代码托管服务器:gitlab.github.开源中国等. 注册账号 创建项目 安装git 参考<[Android ...

  7. 【我们一起写框架】MVVM的WPF框架(一)—序篇

    前言 我想,有一部分程序员应该是在二三线城市的,虽然不知道占比,但想来应该不在少数. 我是这部分人群中的一份子. 我们这群人,面对的客户,大多是国内中小企业,或者政府的小部门.这类客户的特点是,资金有 ...

  8. django-restframework之缓存系统

    django-restframework之缓存系统 一 前言 一 为什么需要缓存 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增.删.查.改,渲染模块,执行业务逻辑,最后生成用户看到的 ...

  9. String方法

    String 大小写转换: String str = "ABC";String str1 = "abc"; System.out.println("A ...

  10. javascript排序算法-选择排序

    选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...