• 20145238-荆玉茗 《Java程序设计》第2次实验


    20145238 《Java程序设计》第2次实验报告

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

    一、实验内容

    1. 初步掌握单元测试和TDD

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

    3. 初步掌握UML建模

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

    5. 了解设计模式

    二、实验要求

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

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

    1. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

    2. 请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。

    三、实验步骤

    (一)单元测试

    (1) 三种代码

    伪代码、产品代码、测试代码

    ·伪代码可以是中文,自己程序的架构理解
    ·产品代码

    public class MyUtil{
       public static String percentage2fivegrade(int grade){
           //如果成绩小于60,转成“不及格”
           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的测试模块

    public class MyUtilTest {
    public static void main(String[] args) {
            // 百分制成绩是50时应该返回五级制的“不及格”
            if(MyUtil.percentage2fivegrade(50) != "不及格")
                System.out.println("test failed!");
            else 
                System.out.println("test passed!");
        }
    }
    

    编译结果如下:

    ·只有一组输入的测试是不充分的,我们把一般情况都测试一下,代码如下:

     public class MyUtilTest {
        public static void main(String[] args) {
            //测试正常情况
            if(MyUtil.percentage2fivegrade(55) != "不及格")
                System.out.println("test failed!");
            else if(MyUtil.percentage2fivegrade(65) != "及格")
                System.out.println("test failed!");
            else if(MyUtil.percentage2fivegrade(75) != "中等")
                System.out.println("test failed!");
            else if(MyUtil.percentage2fivegrade(85) != "良好")
                System.out.println("test failed!");
            else if(MyUtil.percentage2fivegrade(95) != "优秀")
                System.out.println("test failed!");
            else 
                System.out.println("test passed!");
        }
    }
    

    ·代码运行结果如下:

    (2) TDD(Test Driven Devlopment, 测试驱动开发)

    (1)a.先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。TDD的一般步骤如下:

    明确当前要完成的功能,记录成一个测试列表
    快速完成编写针对此功能的测试用例
    测试代码编译不通过(没产品代码呢)
    编写产品代码
    测试通过
    对代码进行重构,并保证测试通过(重构下次实验练习)
    循环完成所有功能的开发
    b.基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来了,我们的产品代码只要让测试通过就可以了。 Java中有单元测试工具JUnit来辅助进行TDD,

    红叉说明代码存在语法错误,原因很简单,MyUtil类还不存在,类中的percentage2fivegrade方法也不存在,我们在TDDDemo的src目录中新建一个MyUtil的类,并实现percentage2fivegrade方法

    c.测试结果出现了一个绿条(green bar),说明测试通过了。

    (2)TDD的编码节奏是:

    增加测试代码、JUnit出现红条、修改产品代码、JUnit出现绿条,任务完成

    (二)面向对象三要素

    (1)抽象

    (2)封装、继承与多态

    (三)设计模式初步

    (1)S.O.L.I.D原则

    面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,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,依赖倒置原则)

    ·范例代码如下

    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() + "!";
        }
    }
    

    (四)练习

    练习内容:

    写一个类测试编写的复数类的方法
    构造函数,将实部,虚部都置为0
    构造函数,创建复数对象的同时完成复数的实部,虚部的初始化
    设置实部,设置虚部:复数相加、复数相减、复数相乘
    产品代码:

    public class Complex {

    protected int a;
    
    protected int b;
    
    public Complex(int a, int b) {
        this.a = a;
        this.b = b;
    }
    
    public String toString() {
        return this.a + " + " + this.b + "i";
    }
    
    public static Complex addition(Complex complex1, Complex complex2) {
        int a = complex1.a + complex2.a;
        int b = complex1.b + complex2.b;
        return new Complex(a, b);
    }
    
    public static Complex subtract(Complex complex1, Complex complex2) {
        int a = complex1.a - complex2.a;
        int b = complex1.b - complex2.b;
        return new Complex(a, b);
    }
    
    public static Complex multiplication(Complex complex1, Complex complex2) {
        int a = complex1.a * complex2.a - complex1.b * complex2.b;
        int b = complex1.b * complex2.a + complex1.a * complex2.b;
        return new Complex(a, b);
    }
    

    }

    
    

    import java.util.Scanner;

    public class ComplexMain {
    public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    System.out.println("请输入两个复数的实部和虚部:(a+bi、c+di)");
    System.out.printf("a =");
    int a=scanner.nextInt();
    System.out.printf("b =");
    int b=scanner.nextInt();
    System.out.printf("c =");
    int c=scanner.nextInt();
    System.out.printf("d =");
    int d=scanner.nextInt();
    Complex fushu1=new Complex(a,b);
    Complex fushu2=new Complex(c,d);
    while(true) {
    System.out.println("请输入需要进行的运算:1、ADD 2、SUBTRACT 3、MULTIPLY ");
    int choice = scanner.nextInt();

    switch (choice) {
    case 1:
    System.out.println(Complex.addition(fushu1, fushu2));
    break;
    case 2:
    System.out.println(Complex.subtract(fushu1, fushu2));
    break;
    case 3:
    System.out.println(Complex.multiplication(fushu1, fushu2));
    break;

                default:System.out.println("ERROR!!!");
            }
        }
    }
    

    }

    ![](http://images2015.cnblogs.com/blog/885730/201604/885730-20160416201607473-488696289.png)
    ![](http://images2015.cnblogs.com/blog/885730/201604/885730-20160416201616691-1425811077.png)
    ![](http://images2015.cnblogs.com/blog/885730/201604/885730-20160416201754004-1134744587.png)
    
    
    
    
    
    
    2.实验报告中统计自己的PSP(Personal Software Process)时间
    
    
    ##心得体会
      本次实验与第一次实验相比较,内容量度、难度明显增加。同时我们的学习了对代码写单元测试的环节,这样不仅可以优化代码,对产品代码进行按功能分块测试,能积极有效的测试出代码的编译正误,对日后代码的维护与修改也有极大的便利。
    本周我们还学习了对UML的使用,感觉它和C语言的流程图生成器有着类似的功效,能让浏览者更直观的了解你代码的结构与框架,十分便捷。
    
    
    
    ##工具
    1.JUnit
    
    2.umbrello
    
    3.StarUML
    
    
    ## PSP(Personal Software Process)
    |    步骤    | 耗时 | 百分比 |
    | --------- | :-------:|:------:|
    | 需求分析   | 2 mins  |   10%    |
    |   设计    | 4 mins  |   20%    |
    | 代码实现   | 8 mins  |   40%   | 
    |   测试    | 6 mins  |   30%    |
    | 分析总结   | 10 mins |   50%    |
  • 相关阅读:
    No bean named 'xxxxx' is defined异常,已解决,这个坑很难发现,你get了吗
    JSTL 和 EL
    SpringMVC FistMVC详解
    关于常用的编码工具如何引入jar包
    python-django rest framework框架之序列化
    blog项目知识点梳理
    python-前20天的着重知识点
    python-django rest framework框架之解析器
    python-django rest framework框架之dispatch方法源码分析
    python-django rest framework框架
  • 原文地址:https://www.cnblogs.com/20145238jym/p/5399231.html
Copyright © 2020-2023  润新知