• 20165202 实验二 Java面向对象程序设计


    实验二 Java面向对象程序设计

    一、实验报告封面

    • 课程:Java程序设计 班级:1652班 姓名:贾海粟 学号:20165202

    • 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:15:35 - 17:15

    • 实验序号:实验二 实验名称:Java面向对象程序设计

    实验内容:

    1初步掌握单元测试和TDD

    2 理解并掌握面向对象三要素:封装、继承、多态

    3 初步掌握UML建模

    4 熟悉S.O.L.I.D原则

    5 了解设计模式

    实验要求:

    1 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程;

    2 完成实验、撰写实验报告,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等);

    3 实验报告中统计自己的PSP(Personal Software Process)时间;

    4 严禁抄袭。

    二、实验内容及步骤

    (一)使用JUnit 单元测试

    参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习
    提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号
    本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试。
    

    产品代码

    public class MyUtil{
        public static String percentage2fivegrade(int grade){
            //如果成绩小于0,转成“错误”
            if ((grade < 0))
                return "错误";
                //如果成绩小于60,转成“不及格”
            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 "优秀";
                //如果成绩大于100,转成“错误”
            else
                return "错误";
        }
    }
    

    码云链接

    测试代码

    import org.junit.Test;
    import junit.framework.TestCase;
    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));
        }
    }
    

    码云链接

    测试截图

    (二)以TDD的方式研究学习StringBuffer

    TDD的一般步骤如下:

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

    产品代码

    public class StringBufferDemo{
        StringBuffer buffer = new StringBuffer();
        public StringBufferDemo(StringBuffer buffer){
            this.buffer = buffer;
        }
        public Character charAt(int i){
            return buffer.charAt(i);
        }
        public int capacity(){
            return buffer.capacity();
        }
        public int length(){
            return buffer.length();
        }
        public int indexOf(String buf) {
            return buffer.indexOf(buf);
        }
    }
    

    码云链接

    测试代码

    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class StringBufferDemoTest extends TestCase {
        StringBuffer a = new StringBuffer("StringBuffer");
        //测试12个字符
        StringBuffer b = new StringBuffer("StringBufferStringBuffer");
        //测试24个字符
        StringBuffer c = new StringBuffer("StringBufferStringBufferStringBuffer");
        //测试36个字符
        StringBuffer d = new StringBuffer("StringBufferStringBufferStringBufferStr");
        //测试39个字符
        @Test
        public void testcharAt() {
            assertEquals('S',a.charAt(0));
            assertEquals('e',b.charAt(10));
            assertEquals('f',c.charAt(20));
            assertEquals('B',d.charAt(30));
        }
        @Test
        public void testcapacity() {
            assertEquals(28,a.capacity());
            assertEquals(40,b.capacity());
            assertEquals(52,c.capacity());
            assertEquals(55,d.capacity());
        }
        @Test
        public void testindexOf() {
            assertEquals(0,a.indexOf("Str"));
            assertEquals(3,b.indexOf("ing"));
            assertEquals(6,c.indexOf("Buffer"));
            assertEquals(8,d.indexOf("ff"));
        }
        @Test
        public void testlength() {
            assertEquals(12,a.length());
            assertEquals(24,b.length());
            assertEquals(36,c.length());
            assertEquals(39,d.length());
        }
    }
    

    码云链接

    测试截图

    (三)设计模式示例进行扩充,让系统支持Boolean类

    参考实验二 Java面向对象程序设计
    对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式
    
    用自己的学号%6进行取余运算,根据结果进行代码扩充:
    0:让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    1:让系统支持Short类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    2:让系统支持Boolean类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    3:让系统支持Long类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    4:让系统支持Float类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    5:让系统支持Double类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印
    

    产品代码

    abstract class Data{
        public abstract void DisplayValue();
    }
    class Integer extends Data {
        int value;
        Integer(){
            value=100;
        }
        public void DisplayValue(){
            System.out.println(value);
        }
    }
    class Boolean extends Data{
        boolean value;
        Boolean(){
            value=true;
        }
        public void DisplayValue(){
            System.out.println(value);
        }
    }
    class Document {
        Data pd;
        Document() {
            pd=new Boolean();
        }
        public void DisplayData(){
            pd.DisplayValue();
        }
    }
    public class MyDoc {
        static Document d;
        public static void main(String[] args) {
            d = new Document();
            d.DisplayData();
        }
    }
    

    码云链接

    测试截图

    (四)以TDD的方式开发一个复数类Complex

    参考http://www.cnblogs.com/rocedu/p/6736847.html
    
    任务:以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)
    

    产品代码

    
    import java.lang.*;
    public class Complex {
        // 定义属性并生成getter,setter
        public void setRealpart(double R){
            RealPart=R;
        }
        public double getRealpart(){
            return RealPart;
        }
        public void setImagePart(double I){
            ImagePart=I;
        }
        public double getImagePart(){
            return ImagePart;
        }
    
        double RealPart;
        double ImagePart;
        // 定义构造函数
        public Complex(double R,double I){
            RealPart=R;
            ImagePart=I;
        }
    
        //Override Object
        public boolean equals(Complex obj){
            if(this.getRealpart()==obj.getRealpart() && this.getImagePart()==obj.getImagePart())
                return true;
            else
                return false;
        }
        public String toString(){
            return RealPart+"+"+ImagePart+"i";
        }
    
        // 定义公有方法:加减乘除
        public Complex ComplexAdd(Complex a){
            return new Complex(this.RealPart+a.RealPart,this.ImagePart+a.ImagePart);
        }
        public Complex ComplexSub(Complex a){
            return new Complex(this.RealPart-a.RealPart,this.ImagePart-a.ImagePart);
        }
        public Complex ComplexMulti(Complex a){
            return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                    this.RealPart*a.ImagePart+this.ImagePart*a.RealPart);
        }
        public Complex ComplexDiv(Complex a){
            double x=this.RealPart;
            double y=this.ImagePart;
            double m=a.RealPart;
            double n=a.ImagePart;
            return new Complex((x*m+y*n)/(m*m+n*n),(y*m-x*n)/(m*m+n*n));
        }
    }
    
    

    码云链接

    测试代码

    import junit.framework.TestCase;
    import org.junit.Test;
    public class ComplexTest extends TestCase {
        Complex p1=new Complex(1,1);
        Complex p2=new Complex(1,-1);
        @Test
        public void testAdd(){
            assertEquals("2.0+0.0i",p1.ComplexAdd(p2).toString());
            System.out.println(p1.ComplexAdd(p2));
        }
        @Test
        public void testSub(){
            assertEquals("0.0+2.0i",p1.ComplexSub(p2).toString());
            System.out.println(p1.ComplexSub(p2));
        }
         @Test
        public void testMulti(){
            assertEquals("2.0+0.0i",p1.ComplexMulti(p2).toString());
            System.out.println(p1.ComplexSub(p2));
        }
          @Test
        public void testDiv(){
            assertEquals("0.0+1.0i",p1.ComplexDiv(p2).toString());
            System.out.println(p1.ComplexDiv(p2));
        }
    }
    

    码云链接

    测试截图

    (五)UML截图

    使用[WhiteStarUML](http://whitestaruml.sourceforge.net/)对实验二中的代码进行建模,发类图的截图,加上学号水印。
    参考http://www.cnblogs.com/rocedu/p/6736847.html
    
    类图中只少两个类。
    

    三、实验过程中遇到的问题

    (一):按教程介绍无法下载JUnitGenerator V2.0

    解决方案:参考《idea 无法下载JUnitGenerator V2.0插件解决办法》,我在连接提供的网址下载了jar文件。使用file->settting->plugins->install plugin from disk操作后成功安装

    (二)step1中junittest显示红色,和教程中提到的testcase为红色不太一致

    解决方案:按照查找方式选取的两个jar均不可用,我在网络上下载了一个进行安装,问题得到解决。

    四、实验体会与总结

    本次实验主要包括junit的使用,通过实际练习我发现junit测试的可以很大提高效率,迅速找到问题所在。本实验中一些题目略难,好在老师提供了一些模板供参考,在日常学习还是要加强巩固基础。

    步骤 耗时 百分比
    需求分析 20min 7%
    设计 60min 21%
    代码实现 120min 42%
    测试 40min 15%
    分析总结 30min 11%
  • 相关阅读:
    Functors in OpenCV
    绘图及注释
    矩阵操作
    图像与大数组类型
    OpenCV的数据类型
    OpenCV入门
    去掉微信公众号里面的菜单栏
    解决python语言在cmd下中文乱码的问题
    解决python无法安装mysql数据库问题
    微信分享功能出现签名错误功能导致的原因
  • 原文地址:https://www.cnblogs.com/jhs888/p/8853068.html
Copyright © 2020-2023  润新知