zoukankan      html  css  js  c++  java
  • 20155320 实验二 Java面向对象程序设计

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

    实验内容

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

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

    3. 初步掌握UML建模

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

    5. 了解设计模式

    实验步骤

    (一)单元测试

    三种代码

    • 伪代码

    与具体编程语言无关,不要写与具体编程语言语法相关的语句(如用malloc分配内存,这样只能用C语言编程了),伪代码从意图层面来解决问题,最终,伪代码是产品代码最自然的、最好的注释

    百分制转五分制:
       如果成绩小于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 "错误";
       }
    }
    
    • 测试代码为
    • 为50时的测试
    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!");
        }
    }
    
    • 异常情况测试
    public class MyUtilTest {
        public static void main(String[] args) {
            //测试出错情况
            if(MyUtil.percentage2fivegrade(-10) != "错误")
                System.out.println("test failed 1!");
            else if(MyUtil.percentage2fivegrade(115) != "错误")
                System.out.println("test failed 2!");
            else 
                System.out.println("test passed!");
        }
    }
    
    

    由测试结果将代码修改为:

    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 "错误";
       }
    }
    
    • 边界测试
    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!"); 
        }
    }
    

    出现了如下情况:

    原因是产品代码没有将100这个数值进行正确处理,因此要把代码调整成

    else if (grade <= 100)
           return "优秀";
    

    最终我使用Junit将三个测试用例整合在一起做了测试如下:

    TDD的使用

    TDD的一般步骤:

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

    我按步骤完成了StringBuffer几个测试用例的检测:

    TDD的编码节奏是:

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

    Java面向对象程序设计

    • 对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式:
    class Integer { 
       int value;    
       public Integer(){
          value=100;  
       }    
       public void DisplayValue(){
            System.out.println(value);  
       } 
    } 
    class Document { 
       Integer pi; 
       public Document(){
           pi = new Integer(); 
       } 
       public void DisplayData(){
          pi.DisplayValue();  
       } 
    } 
    public class MyDoc{ 
       static Document d;
       public static void main(String [] args) { 
            d = new Document(); 
            d.DisplayData(); 
      } 
    }
    

    为了让其支持Boolean型,我多增加了一段代码。

    class Boolean extends Data{
        boolean value;
        Boolean(){
               value=true;
        }
        public void DisplayValue(){
            System.out.println(value);
        }
    }
    

    最后

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

    public class MyComplex {
    
        private double realPart;
        private double imaginPart;
        public MyComplex(){
            double realPart;
            double imaginPart;
        }
        public MyComplex(double r,double i){
            double realPart;
            double imaginPart;
            this.realPart=r;
            this.imaginPart=i;
        }
        public double getRealPart(){
            return realPart;
        }
        public double getImaginPart(){
            return imaginPart;
        }
        public void setRealPart(double d){
            this.realPart=d;
        }
    
        public void setImaginPart(double d) {
            this.imaginPart =d;
        }
        public void ComplexAdd(MyComplex c){
            this.realPart+=c.realPart;
            this.imaginPart+=c.imaginPart;
        }
        public void ComplexAdd(double c){
            this.realPart+=c;
        }
        public void ComplexMinus(MyComplex c){
            this.realPart-=c.realPart;
            this.imaginPart-=c.imaginPart;
        }
        public void ComplexMinus(double c){
            this.realPart-=c;
        }
        public void ComplexMulti(MyComplex c){
            this.realPart*=c.realPart;
            this.imaginPart*=c.imaginPart;
        }
        public void ComplexMulti(double c){
            this.realPart*=c;
        }
    }
    

    又写了测试代码,用三个测试用例一起检测了,测试结果如下:

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

    我首先下载了StarUML软件,并在百度上搜索了一篇使用教程进行了相关学习。

    我建模的对象时老师博客中给的程序:

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

    建模后结果为:

    PSP(Personal Software Process)时间

    步骤 耗时 百分比
    需求分析 10min 5%
    设计 10min 10%
    代码实现 50min 60%
    测试 15min 15%
    分析总结 15min 10%
  • 相关阅读:
    基于ZooKeeper和Thrift构建动态RPC调用
    菜鸡的Java笔记 api 文档
    菜鸡的Java笔记 第二十四
    菜鸡的Java笔记 第二十三
    菜鸡的Java笔记 第二十二
    菜鸡的Java笔记 实践
    Python 函数 参数传递
    python 函数的定义及调用语法,map 方法,函数嵌套递归
    java关键字
    菜鸡的Java笔记 第二十一 final 关键字
  • 原文地址:https://www.cnblogs.com/ljq1997/p/6744509.html
Copyright © 2011-2022 走看看