实验二《Java面向对象程序设计》实验报告
一、实验内容
- 初步掌握单元测试和TDD
- 理解并掌握面向对象三要素:封装、继承、多态
- 初步掌握UML建模
- 熟悉S.O.L.I.D原则
- 了解设计模式
二、实验步骤
(一)单元测试
1.三种代码:伪代码、测试代码、产品代码
需求:在一个MyUtil类中解决一个百分制成绩转成“优、良、中、及格、不及格”五级制成绩的功能。
伪代码:
百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”
之后用java语言编程MyUtil.java
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成绩小于60,转成“不及格”
if (grade<0)
return "错误";
else if (grade < 60)
return "不及格";
//如果成绩在60与70之间,转成“及格”
else if (grade < 70)
return "及格";
//如果成绩在70与80之间,转成“中等”
else if (grade < 80)
return "中等";
//如果成绩在80与90之间,转成“良好”
else if (grade < 90)
return "良好";
//如果成绩在90与100之间,转成“优秀”
else if (grade <=100)
return "优秀";
//其他,转成“错误”
else
return "错误";
}
}
再写一个测试代码MyUtilTest.java
来检验产品代码
测试三种情况
1.正常情况
2.错误情况(负数,超过100的数)
3.边界情况(0,60,70,80,90,100)
测试代码:
import junit.framework.TestCase;
import org.junit.Test;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("优秀", MyUtil.percentage2fivegrade(95));
}
@Test
public void testExceptions(){
assertEquals("错误", MyUtil.percentage2fivegrade(105));
assertEquals("错误", MyUtil.percentage2fivegrade(-55));
}
@Test
public void testBoundary(){
assertEquals("不及格", MyUtil.percentage2fivegrade(0));
assertEquals("及格", MyUtil.percentage2fivegrade(60));
assertEquals("中等", MyUtil.percentage2fivegrade(70));
assertEquals("良好", MyUtil.percentage2fivegrade(80));
assertEquals("优秀", MyUtil.percentage2fivegrade(90));
assertEquals("优秀", MyUtil.percentage2fivegrade(100));
}
}
测试通过截图
2.测试驱动开发TDD(测试代码->产品代码)
测试StringBufferDemo
类的方法有charAt()
、capacity()
、indexOf()
、length()
:
char charAt(int index)
返回此序列中指定索引处的 char 值。
int capacity()
返回当前容量。
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
int length()
返回长度(字符数)。
代码:
public class StringBufferDemo {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer(20);
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring12345"));
System.out.println("buffer = " + buffer.toString());
System.out.println(buffer.length());
}
}
测试代码:
import junit.framework.TestCase;
import org.junit.Test;
public class StringBufferDemoTest extends TestCase {
StringBuffer a = new StringBuffer("StringBuffer");
StringBuffer b = new StringBuffer("StringBufferStringBuffer");
StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");
@Test
public void testcharAt() throws Exception{
assertEquals('S',a.charAt(0));
assertEquals('n',a.charAt(4));
assertEquals('u',a.charAt(7));
}
public void testcapacity() throws Exception{
assertEquals(28,a.capacity());
assertEquals(40,b.capacity());
assertEquals(52,c.capacity());
}
public void testlength() throws Exception{
assertEquals(12,a.length());
assertEquals(24,b.length());
assertEquals(36,c.length());
}
public void testindexOf() throws Exception{
assertEquals(0,a.indexOf("Str"));
assertEquals(5,a.indexOf("gBu"));
assertEquals(6,b.indexOf("Buf"));
assertEquals(7,b.indexOf("uff"));
assertEquals(9,c.indexOf("fer"));
assertEquals(10,c.indexOf("erS"));
}
}
测试通过截图:
(二)对设计模式示例进行扩充,让其支持Long类
要求支持Long类,这样需Document类修改构造方法,这违背了OCP原则,。封装、继承、多态解决不了问题,需要添加:
class Long extends Data
class LongFactory extends Factory
代码:
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=2017530999;
}
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 LonFactory extends Factory {
public Data CreateDataObject(){
return new Long();
}
}
class Document {
Data pd;
Document(Factory pf){
pd = pf.CreateDataObject();
}
public void DisplayData(){
pd.DisplayValue();
}
}
public class MyDoc {
static Document e;
public static void main(String[] args) {
e=new Document(new LonFactory());
e.DisplayData();
}
}
运行通过截图
(三)以TDD的方式开发一个复数类Complex
方法:
getA(int a);返回实部
getB(int b);返回虚部
ComplexAdd(Complex c);实现复数相加
ComplexMinus(Complex c);实现复数相减
ComplexMulti(Complex c);实现复数相乘
ComplexDiv(Complex c);实现复数相除
代码:
public class Complex { //a + bi
private double a;
private double b;
public Complex(){ //构造方法,置0
this.a = 0;
this.b = 0;
}
public Complex(double a, double b) { //构造方法,初始化一个复数
this.a = a;
this.b = b;
}
public double getA(){ //获取实部
return this.a;
}
public double getB(){ //获取虚部
return this.b;
}
public double setA(double a){ //设置实部
this.a = a;
return a;
}
public double setB(double b){ //设置虚部
this.b = b;
return b;
}
Complex ComplexAdd(Complex c){//复数相加
double a = c.getA();
double b = c.getB();
double newA = a + this.a;
double newB = b + this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMinus(Complex c){//复数相减
double a = c.getA();
double b = c.getB();
double newA = a - this.a;
double newB = b - this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexMulti(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a * this.a;
double newB = b * this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
Complex ComplexDiv(Complex c){//复数相乘
double a = c.getA();
double b = c.getB();
double newA = a / this.a;
double newB = b / this.b;
Complex Result = new Complex(newA,newB);
return Result;
}
public String toString() {
String s = " ";
if (b > 0)
s = a + "+" + b + "i";
if (b == 0)
s = a + "";
if (b < 0)
s = a + " " + b + "i";
return s;
}
}
测试代码:
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
public class ComplexTest extends TestCase {
Complex c1 = new Complex(0, 3);
Complex c2 = new Complex(-1, -1);
Complex c3 = new Complex(2,1);
@Test
public void testgetRealPart() throws Exception {
assertEquals(-1.0, new Complex().setA(-1.0));
assertEquals(5.0, new Complex().setA(5.0));
assertEquals(0.0, new Complex().setA(0.0));
}
@Test
public void testgetImagePart() throws Exception {
assertEquals(-1.0, new Complex().setB(-1.0));
assertEquals(5.0, new Complex().setB(5.0));
assertEquals(0.0, new Complex().setB(0.0));
}
@Test
public void testComplexAdd() throws Exception {
assertEquals("-1.0+2.0i", c1.ComplexAdd(c2).toString());
assertEquals("2.0+4.0i", c1.ComplexAdd(c3).toString());
assertEquals("1.0", c2.ComplexAdd(c3).toString());
}
@Test
public void testComplexSub() throws Exception {
assertEquals("-1.0 -4.0i", c1.ComplexMinus(c2).toString());
assertEquals("2.0 -2.0i", c1.ComplexMinus(c3).toString());
assertEquals("3.0+2.0i", c2.ComplexMinus(c3).toString());
}
@Test
public void testComplexMulti() throws Exception {
assertEquals("-0.0 -3.0i", c1.ComplexMulti(c2).toString());
assertEquals("0.0+3.0i", c1.ComplexMulti(c3).toString());
assertEquals("-2.0 -1.0i", c2.ComplexMulti(c3).toString());
}
@Test
public void testComplexComplexDiv() throws Exception {
assertEquals("-0.0 -3.0i", c2.ComplexDiv(c1).toString());
assertEquals("-0.0 -3.0i", c2.ComplexDiv(c1).toString());
assertEquals("-2.0 -1.0i", c2.ComplexDiv(c3).toString());
}
}
测试截图
(四)面向对象三要素
**使用UML对实验二中代码进行建模 **
代码:
public abstract class Animal {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public abstract String shout();
}
public class Dog extends Animal{
public String shout(){
return "汪汪";
}
public String toString(){
return "The Dog's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
public class Cat extends Animal{
public String shout(){
return "喵喵";
}
public String toString(){
return "The Cat's color is " + this.getColor() +", and it shouts "+ this.shout() + "!";
}
}
UML图
实验中遇到的问题
1.Junit的包安装上之后无法使用。
解决办法:最开始只装了一个junit.jar的包,没有装另外一个junit-4.12.jar的包导致无法使用
2.UML软件不会使用
解决办法:参考教程:https://blog.csdn.net/luansha0/article/details/82260678
PSP
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 30min | 10% |
设计 | 30min | 10% |
代码实现 | 110min | 36.7% |
测试 | 70min | 23.3% |
分析总结 | 60min | 20% |
感悟
不知道怎么回事,老师的博客图片不能显示,对我做实验造成了极大的困扰,后来参照着20175306王佳烁、20175313张黎仙同学的博客上面的步骤才得以完成,再此谢谢二位前辈!
参考博客
20175306王佳烁:https://www.cnblogs.com/wjs123456/p/10700936.html
20175313张黎仙:https://www.cnblogs.com/xiannvyeye/p/10720425.html
实验二《Java面向对象程序设计》实验报告的更多相关文章
- 20145213《Java程序设计》实验二Java面向对象程序设计实验报告
20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...
- 20145206《Java程序设计》实验二Java面向对象程序设计实验报告
20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告
20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...
- 实验二Java面向对象程序设计实验报告(2)
实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...
- 实验二 Java面向对象程序设计实验报告
实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...
- 20145326《Java程序设计》实验二Java面向对象程序设计实验报告
20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...
- 20155217 实验二 Java面向对象程序设计 实验报告
20155217 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...
- 20145219 《Java程序设计》实验二 Java面向对象程序设计实验报告
20145219 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...
- 20162305 实验二 Java面向对象程序设计 实验报告
20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...
- 20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告
20145239 <Java程序设计>实验二 Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S. ...
随机推荐
- 商务电话思维图(XMind für Geschäftliche Telefongespräche)
在和德国人打交道时,经常会遇到打电话的情景,应该怎么应对呢?不用担心,记住下面这个导图,轻松搞定德语电话的常用句型. 最后,按照惯例,来张美景.人越是上了年纪,就活的越是小心.但无论外界怎么样,请保持 ...
- Daily Codeforces 计划 训练时录
时间 场次 过题数目 补题数目 难易度 2019.4.7 codeforces-1141 ...
- 转载:C++中堆和栈的区别
C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区 文章来自一个论坛里的回帖,哪个论坛记不得了! 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...
- gunicorn+anaconda+nginx部署django项目(ubuntu)
首先进入conda 虚拟环境: source activate test 安装gunicorn: pip install gunicorn 运行gunicorn gunicorn -w 2 -b 12 ...
- vue组件通信的几种方式
最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child ...
- Authentication讲解(Spring security认证)
标准认证过程: 1.用户使用username和password登录 2.系统验证这个password对于该username是正确的 3.假设第二步验证成功,获取该用户的上下文信息(如他的角色列表) 4 ...
- CSS3 Flex布局
Flex 用于使页面上的内容自适应屏幕 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”width=device-widt ...
- 分布式系列十二: Redis高级主题
持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同步内存的数据到磁盘.文件 ...
- Ansible-----循环
with_dict迭代字典项 使用"with_dict"可以迭代字典项.迭代时,使用"item.key"表示字典的key,"item.value&qu ...
- hihocoder 1176
hihocoder 1176 题意:N,M.分别表示岛屿数量和木桥数量,一笔画 分析:欧拉路问题(给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路) 欧拉路的条件 一个无向 ...