• 2018-2019-2 20175234 实验二《Java面向对象程序设计》实验报告


    实验内容

    1. 初步掌握单元测试和TDD
    2. 理解并掌握面向对象三要素:封装、继承、多态
    3. 初步掌握UML建模
    4. 熟悉S.O.L.I.D原则
    5. 解设计模式

    实验要求

    1. 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程。
    2. 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导。
    3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
    4. 请大家先在实验楼中的~/Code目录中用自己的学号建立一个目录,代码和UML图要放到这个目录中,截图中没有学号的会要求重做,然后跟着下面的步骤练习。

    实验步骤

    一、单元测试

    定义

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。

    伪代码
    百分制转五分制:
    如果成绩小于60,转成“不及格”
    如果成绩在60与70之间,转成“及格”
    如果成绩在70与80之间,转成“中等”
    如果成绩在80与90之间,转成“良好”
    如果成绩在90与100之间,转成“优秀”
    其他,转成“错误”
    
    产品代码
    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) != "不c及格")
                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 Driven Devlopment测试驱动开发)

    定义

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

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

    junit 使用org.junit不存在,点到代码中红色的部分显示Cannot resolve symbol 'junit'

    解决措施:File -> Project Struct... -> Libraies -> 点击绿色的加号 -> Java -> 找到 IDEA 安装路径下的 Lib 中的junit-4.12 ->点击OK

    书上题习题范例代码截图

    StringBuffer
    产品代码
    public class StringBufferDemo {
        public static void main(String [] args){
            StringBuffer buffer = new StringBuffer();
            buffer.append('S');
            buffer.append("tringBuffer");
            System.out.println(buffer.charAt(1));
            System.out.println(buffer.capacity());
            System.out.println(buffer.indexOf("tring"));
            System.out.println("buffer = " + buffer.toString());
         }
    }
    
    测试代码
    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字节
        @Test
        public void testcharAt() throws Exception{
            assertEquals('S',a.charAt(0));
            assertEquals('i',a.charAt(3));
            assertEquals('g',a.charAt(5));
            assertEquals('r',a.charAt(11));
        }
        @Test
        public void testcapacity()throws Exception{
            assertEquals(28,a.capacity());
            assertEquals(40,b.capacity());
            assertEquals(52,c.capacity());
        }
    
        @Test
        public void testindexOf()throws Exception{
            assertEquals(0,a.indexOf("Str"));
            assertEquals(3,a.indexOf("ing"));
            assertEquals(5,a.indexOf("gBu"));
            assertEquals(8,a.indexOf("ffer"));
    
        }
    
    }
    
    测试结果截图

    三、面向对象三要素

    • 抽象:抽出事物的本质特征而暂不考虑细节,对于复杂的问题分层求解
      过程抽象:结果是函数
      数据抽象:结果是抽象数据类型
    • 封装,继承与多态(面向对象的三要素)
      封装:将数据与相关行为包装在一起以实现信息隐藏,java中使用类进行封装,接口是封装准确描述手段
    • 继承:关键在于确认子类为父类的一个特殊类型,以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态。
      多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式

    四、设计模式初步

    • 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,依赖倒置原则)
    • 设计模式
      Pattern name:描述模式,便于交流,存档
      Problem:描述何处应用该模式
      Solution:描述一个设计的组成元素,不针对特例
      Consequence:应用该模式的结果和权衡(trade-offs)
    设计模式示例

    体会OCP原则和DIP原则的应用初步理解设计模式设计,对示例进行代码扩充
    学号20175234,题目4

    产品代码
    abstract class Data {
        abstract public void DisplayValue();
    }
    class Integer extends  Data {
        int value;
        Integer() {
            value=100;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Float extends Data {
        float value;
        Float(){
            value=4.4f;
        }
        public void DisplayValue(){
            System.out.println(value);
        }
    }
    abstract class Factory {
        abstract public Data CreateDataObject();
    }
    class IntFactory extends Factory {
        public Data CreateDataObject(){
            return new Integer();
        }
    }
    class FloatFactory extends Factory {
        public Data CreateDataObject(){
            return new Float();
        }
    }
    class Document {
        Data pd;
        Document(Factory pf){
            pd = pf.CreateDataObject();
        }
        public void DisplayData(){
            pd.DisplayValue();
        }
    }
    public class MyDoc {
        static Document d;
        static Document e;
        public static void main(String[] args) {
            e=new Document(new FloatFactory());
            e.DisplayData();
        }
    }
    
    运行截图

    五、练习

    1.使用TDD的方式设计关实现复数类Complex。码云链接

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

    步骤 耗时(分钟) 百分比
    需求分析 5 5
    设计 15 15
    代码实现 25 25
    测试 25 25
    分析总结 30 30

    实验收获

    • 编写程序时要善于思考,在运行前构想运行结果,在与预想不相符的情况下,要了解粗错原因。要善于使用API,要会查询类及其方法。
    • 要学会使用JUnit。在写易出错、复杂的程序时,先写测试代码,然后再写产品代码。

    参考资料

  • 相关阅读:
    Java Web 开发必须掌握的三个技术:Token、Cookie、Session
    $.proxy和$.extend
    手机端和网页端使用同一后台时进行会话控制
    js中使用EL表达式总结
    Durandal入门
    RequireJs入门
    阿里云Prismplayer-Web播放器的使用
    Mac系统实现git命令自动补全
    Mac系统的终端显示git当前分支
    Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  • 原文地址:https://www.cnblogs.com/ysz-123/p/10741190.html
Copyright © 2020-2023  润新知