zoukankan      html  css  js  c++  java
  • 20145331 《Java程序设计》第2次实验报告

    20145331 《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)三种代码:伪代码、产品代码、测试代码。

    a.伪代码

    百分制转五分制:

    如果成绩小于60,转成“不及格”

    如果成绩在60与70之间,转成“及格”

    如果成绩在70与80之间,转成“中等”

    如果成绩在80与90之间,转成“良好”

    如果成绩在90与100之间,转成“优秀”

    其他,转成“错误”

    b.产品代码

    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 "错误";
    }
    }
    

    c.测试代码 输入是“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!");
    }
    }
    

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

    •明确当前要完成的功能,记录成一个测试列表

    •快速完成编写针对此功能的测试用例

    •测试代码编译不通过

    •编写产品代码

    •测试通过

    •对代码进行重构,并保证测试通过

    •循环完成所有功能的开发

    (二)面向对象三要素

    (1)抽象

    即“求同存异、去粗取精”的过程。将若干事物中相同的部分进行剥离整理,并形成具有某特定功能的产品,这一过程即为抽象。过程抽象的结果是函数,数据抽象的结果是抽象数据类型其显而易见的好处是(在程序设计中)减少了代码大重复性,提高了效率。

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

    •封装:将与某一将数据与相关行为包装在一起以实现信息就隐藏,核心内容是模块化和信息隐藏,与此相伴的是接口的使用。

    (三)设计模式初步

    •SRP(Single Responsibility Principle,单一职责原则)

    •OCP(Open-Closed Principle,开放-封闭原则)

    •LSP(Liskov Substitusion Principle,Liskov替换原则)

    •ISP(Interface Segregation Principle,接口分离原则)

    •DIP(Dependency Inversion Principle,依赖倒置原则)

    (四)练习

    使用TDD的方式设计关实现复数类Complex。

    伪代码:

    1、复数的实部为0,虚部为0

    2、复数的实部为0,虚部为对应数

    3、复数的实部为对应数,实部为0

    4、两参数分别为实部与虚部

    5、实现两复数的加法、减法、乘法。

    a.伪代码:

    两个变量,实部RealPart和虚部ImaginaryPart。sh xu

    复数相加=(实部+实部)+(虚部+虚部)i

    复数相减=(实部-实部)+(虚部-虚部)i

    打印一个复数

    b.产品代码:

    public class Complex {
    private int sh,xu;
    Complex(){
        this.sh=0;
        this.xu=0;
    }
    Complex(int sh){
        this.sh=sh;
        this.xu=0;
    }
    Complex(int sh,int xu){
        this.sh=sh;
        this.xu=xu;
    }
    public void addFu(Complex p1,Complex p2){
        System.out.println("这两个复数的和为:");
        this.sh=p1.sh+p2.sh;
        this.xu=p1.xu+p2.xu;
        print();
    }
    public void minusFu(Complex p1,Complex p2){
        System.out.println("这两个复数的差为:");
        this.sh=p1.sh-p2.sh;
        this.xu=p1.xu-p2.xu;
        print();
    }
    public void outputFu(){
        System.out.println("复数的值为:");
        print();
    }
    public void print(){
        if(this.xu>0){
            System.out.println(this.sh+"+"+this.xu+"i");
        }else if(this.xu<0){
            System.out.println(this.sh+""+this.xu+"i");
        }else{
            System.out.println(this.sh);
        }
    }
    }
    

    C.测试代码:

    package exp1;
    import java.util.Scanner;
    public class MyComplex {
    static int r;
    static int i;
    private double m;
    private double n;
    public static int getRealPart(int RealPart){
        r = RealPart;
        return r;
    }
    public static int getImaginePart(int ImaginePart){
        i = ImaginePart;
        return i;
    }
    public MyComplex(double m, double n) {
        this.m = m;
        this.n = n;
    }
    public MyComplex add(MyComplex c) {
        return new MyComplex(m + c.m, n + c.n);
    }
    public MyComplex minus(MyComplex c) {
        return new MyComplex(m - c.m, n - c.n);
    }
    public MyComplex multiply(MyComplex c) {
        return new MyComplex(m * c.m - n * c.n, m * c.n + n * c.m);
    }
    public String toString() {
        String rtr_str = "";
        if (n > 0)
            rtr_str = "(" + m + "+" + n + "i" + ")";
        if (n == 0)
            rtr_str = "(" + m + ")";
        if (n < 0)
            rtr_str = "(" + m + n + "i" + ")";
        return rtr_str;
    }
    }
    

    (五)UML

    UML图可以转化成Java代码

    PSP

    步骤耗时百分比
    需求分析 30min  16.7% 
    设计  60min  33.3%
    代码实现 45min  25% 
    测试 15min  8.3% 
    分析总结 30min  16.7%
  • 相关阅读:
    安装和强行卸载fuse
    Elasticsearch snapshot 备份的使用方法 【备忘】
    MYSQL数据仓库infobright【备忘】
    Tomcat8 启动慢 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [53,161] milliseconds
    python爬虫实例
    JDK1.8 JVM参数配置
    QQ登录用到的URL
    CAS5.3.X 配置备忘
    Nexus3忘记admin密码时的解决办法
    CentOS7利用systemctl添加自定义系统服务
  • 原文地址:https://www.cnblogs.com/bosswsc/p/5402877.html
Copyright © 2011-2022 走看看