zoukankan      html  css  js  c++  java
  • 20175213《Java程序设计》实验二Java面向对象程序设计实验报告

    实验内容

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

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

    3.初步掌握UML建模

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

    5.了解设计模式

    知识总结

    1.伪代码

    2.产品代码:
    ①Java编程时,程序员对类实现的测试叫单元测试。
    ②测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。

    3.先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)

    实验步骤

    一、 单元测试

    1.三种代码

    ①伪代码
    ②产品代码
    ③测试代码

    伪代码是产品代码最自然、最好的注释。那么什么是伪代码呢?如下图所示:
    

    百分制转五分制:
    如果成绩小于60,转成“不及格”
    如果成绩在60与70之间,转成“及格”
    如果成绩在70与80之间,转成“中等”
    如果成绩在80与90之间,转成“良好”
    如果成绩在90与100之间,转成“优秀”
    其他,转成“错误”

    产品代码就是最终的成品了,编译的过程就是把上述易懂得伪代码翻译成机器语言,让计算机识别并执行。根据上图伪代码可以编译如下产品代码:
    
    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 "错误";
       }
    }
    
    测试代码就是对成品产品代码的验算与检验,证明成品代码没有问题。正对MyUtil我们写一个MyUtilTest.java的测试模块,代码如下:
    
    public class MyUtilTest {
        public static void main(String[] args) {
            //测试边界情况
            if(MyUtil.percentage2fivegrade(0) != "不及格")
                System.out.println("test failed 1!");
            else if(MyUtil.percentage2fivegrade(60) != "及格")
                System.out.println("test failed 2!");
            else if(MyUtil.percentage2fivegrade(70) != "中等")
                System.out.println("test failed 3!");
            else if(MyUtil.percentage2fivegrade(80) != "良好")
                System.out.println("test failed 4!");
            else if(MyUtil.percentage2fivegrade(90) != "优秀")
                System.out.println("test failed 5!");
            else if(MyUtil.percentage2fivegrade(100) != "优秀")
                System.out.println("test failed 6!");
            else 
                System.out.println("test passed!"); 
        }
    }
    

    二、 TDD(Test Dirven Development,测试驱动开发)

    ·TDD的一般步骤如下:
    1.明确当前要完成的功能,记录成一个测试列表
    2.快速完成编写针对此功能的测试用例
    3.测试代码编译不通过(没产品代码呢)
    4.编写产品代码
    5.测试通过
    6.对代码进行重构,并保证测试通过(重构下次实验联系)
    7.循环完成所有功能的开发

    基于TDD,我们不会出现过度设计的情况,需求通过测试用例表达出来,我们的产品代码只要让测试通过就可以了。
    

    就像这样

    三、 面向对象三要素

    1.抽象
    "去粗取精、化繁为简、由表及里、异中求同"。抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。

    2.封装、继承与多态
    面向对象(Object-Oriented)的三要素包括:封装、继承、多态。过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT。数据抽象才是OOP的核心和起源。

    ·构造函数实现对象初始化流程的封装。方法封装了操作对象的流程。Java中还可以用private封装对象私有数据成员。封装的目的主要就是隐藏对象细节,将对象当做黑箱进行操作。实例代码如下:
    
    public class Dog {
        private String color;
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public String bark(){
            return "汪汪";
        }
        public String toString(){
            return "The Dog's color is " + this.getColor() +", and it shouts "+ this.bark() + "!";
        }
    }
    
    ·继承基本上就是为了避免多个类间重复定义行为共同行为。子类利用关键词extends继承父类,避免重复的行为定义。实例代码如下:
    
    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() + "!";
        }
    }
    
    ·多态就是使用单一接口操作多种类型的对象。实例代码如下:
    
    package cc.openhome;
    public class RPG {
        public static void main(String[] args) {
            SwordsMan swordsMan = new SwordsMan();
            swordsMan.setName("Justin");
            swordsMan.setLevel(1);
            swordsMan.setBlood(200);
            Magician magician = new Magician();
            magician.setName("Monica");
            magician.setLevel(1);
            magician.setBlood(100);
            drawFight(swordsMan);
            drawFight(magician);
        }
        static void drawFight(Role role) {
            System.out.print(role.getName());
            role.fight();
        }
    }
    

    四、 UML的使用

    给一个代码,很难第一时间了解这个代码的整体结构组成,这时候如果利用StarUML软件进行UML建模,代码的结构组成,各个类的成员变量就可以一目了然了,像这样
    

    前缀减号的代表是Private,前缀加号的代表public。
    

    五、使用StarUML对实验二中的代码进行建模

    六、出现的问题及解决过程
    问题:导入Junit包时找不到idea的lib文件夹。

    解决过程:平时编写代码时,我都用虚拟机里的vim,只有在调试代码时,会使用安装在windows里的IDEA。我一般的打开方式是:先点开jetbrains-toolbox,再选择其中的IDEA Ultimate,所以当需要打开IDEA Ultimate安装包中的lib文件时,我发现自己对其安装路径并不熟悉。
  • 相关阅读:
    python数据分析常用包之Matplotlib
    python数据分析常用包之Scipy
    python数据分析常用包之Pandas
    python数据分析常用包之numpy
    常见算法之‘插入类排序’
    CRM管理系统流程.king_admin
    常见算法之‘选择排序’
    常见的算法排序之交换类排序
    常用正则表达式
    scss在ide的命令参数
  • 原文地址:https://www.cnblogs.com/LZHNB/p/10712435.html
Copyright © 2011-2022 走看看