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


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

    实验步骤与内容

    一、实验内容

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

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

    3. 初步掌握UML建模

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

    5. 了解设计模式

    二、实验步骤

    1.单元测试

    (1) 三种代码

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

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

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

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

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

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

    (2)TDD的编码节奏是:

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

    2.面向对象三要素

    • 面向对象(Object-Oriented)的三要素包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。 OOD中建模会用图形化的建模语言UML(Unified Modeling Language),UML是一种通用的建模语言。

    • 过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT。数据抽象才是OOP的核心和起源。

    • OO三要素的第一个要素是封装,封装就是将数据与相关行为包装在一起以实现信息就隐藏。Java中用类进行封装,比如一个Dog类:

    3.设计模式初步

    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,依赖倒置原则)

    4.练习

    • 使用TDD的方式设计关实现复数类Complex
    • 伪代码

    类有虚部实部
    复数的加法运算
    复数的减法运算
    复数的乘法运算
    复数的除法运算
    打印一个复数
    打印四则运算的语句

    • 代码如下:
    public class ComplexNumber {
    
        public static void main(String[] args) {
            Complex x = new Complex(1.0 , -2.0);
            Complex y = new Complex(3.0 , 4.0);
            Complex.printSentence(x, y);
        }
    
    }
    class Complex
    {
        private double a,b;
        Complex(double a,double b)
        {
            this.a = a;
            this.b = b;
        }
        static Complex Add(Complex x,Complex y)
        {
            return new Complex(x.a+y.a, x.b+y.b);
        }
        static Complex Minus(Complex x,Complex y)
        {
            return new Complex(x.a-y.a, x.b-y.b);
        }
        static Complex Multiple(Complex x,Complex y)
        {
            return new Complex(x.a * y.a - x.b * y.b, x.a * y.b + x.b * y.a);
        }
        static Complex Divide(Complex x,Complex y)
        {
            Complex conjugate = new Complex(y.a, -y.b);
            double mo = (y.a)*(y.a) + (y.b)*(y.b);
    
            Complex t = Multiple(x,conjugate);
            return new Complex(t.a/mo , t.b/mo);
        }
        static String print(Complex x)
        {
            if (x.b > 0)
                return x.a + "+" + x.b + "i";
            else
                return x.a + "-" + (-x.b) + "i";
        }
        static void printSentence(Complex x, Complex y)
        {
            System.out.println("("+ print(x) + ")+("+ print(y) + ") =" +print(Add(x, y)));
            System.out.println("("+ print(x) + ")-("+ print(y) + ") =" +print(Minus(x, y)));
            System.out.println("("+ print(x) + ")*("+ print(y) + ") =" +print(Multiple(x, y)));
            System.out.println("("+ print(x) + ")/("+ print(y) + ") =" +print(Divide(x, y)));
        }
    
    }
    
    • 结果截图:

    我的PSP时间

    步骤 耗时 百分比
    需求分析 30min 17%
    设计 30min 17%
    代码实现 50min 27%
    测试 40min 22%
    分析总结 30min 17%

    心得体会

    这次实验是java的第二次实验,这次实验主要内容是代码面向对象三要素的应用,以及代码的设计思想以及测试方法,通过这周和上周的PSP时间比例可以看出,设计和测试的比重增加,而代码实现的时间比重下降,这更接近于日常生活中的软件开发的基本程序,而不是书本上给定题目进行的练习。通过之前基本的练习已经初步掌握了Java程序设计的基本语句,今后将更加注重程序 设计思维的练习。

    参考资料

  • 相关阅读:
    SpringBoot:实现定时任务
    Spring Boot: 配置文件详解
    Git 实用技巧:git stash
    nodejs oj在线笔试应对方案(讲几种输入处理方法)
    scrollWidth,offsetWidth,clientWidth,width;scrollHeight,offsetHeight,clientHeight,height;offsetTop,scrollTop,top;offsetLeft,scrollLeft,left还有谁
    CSS3选择器~一看吓一跳,这么多不会
    CSS3伪类和伪元素的特性和区别
    AngularJS1.X学习笔记6-控制器和作用域
    AngularJS1.X学习笔记5-加强版的表单
    AngularJS1.X学习笔记4-内置事件指令及其他
  • 原文地址:https://www.cnblogs.com/m3182218/p/5388811.html
Copyright © 2020-2023  润新知