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

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

    实验要求

    1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号。本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试。

    2.使用JUnit学习Java,以 TDD的方式研究学习StringBuffer。提交你的单元测试用例和测试通过的截图,截图要加上学号水印。测试自己会不会写JUnit测试用例。

    3.对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。用自己的学号%6进行取余运算,根据结果进行代码扩充。

    4.提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印。任务:以TDD的方式开发一个复数类Complex。

    实验内容

    面向对象程序设计-1

    • 安装Junit: 选择File->Settings,选择Plugins,搜索JUnit,单击Install JetBrains plugin,安装后如下图:

    • 把测试代码放在test中,设置环境变量Mark Directory as->Test Sources Root

    • 下载 junit.jar包,选择File->Project StructureDependancies->JARs or Directories,添加junit.jar,右击测试代码选择Run 'MyTuilTest' ,红色代码部分恢复正常。

    • 产品代码:

    • 正常情况,错误情况,边界情况:

    • 测试通过:

    面向对象程序设计-2

    • 产品代码:

    • 测试通过:

    面向对象程序设计-3

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

    OCP是OOD中最重要的一个原则,OCP的内容是:

    软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

    基于OCP,利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化,OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程。

    • 2.DIP的内容是:

    高层模块不应该依赖于低层模块。二者都应该依赖于抽象。

    抽象不应该依赖于细节。细节应该依赖于抽象。

    通过接口或者抽象类,DIP在应用中通过依赖注入的方式实现解耦,重用低级模块,重用实现,解除依赖。

    • 让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确:
    // Server Classes
    abstract class Data {
        abstract public void DisplayValue();
    }
    class Integer extends  Data {
        int value;
        Integer() {
            value=100;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    class Byte extends  Data {
        byte value;
        Byte() {
            value=3;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    // Pattern Classes
    abstract class Factory {
        abstract public Data CreateDataObject();
    }
    class IntFactory extends Factory {
        public Data CreateDataObject(){
            return new Integer();
        }
    }
    class ByteFactory extends Factory {
        public Data CreateDataObject(){
            return new Byte();
        }
    }
    //Client classes
    class Document {
        Data pd;
        Document(Factory pf){
            pd = pf.CreateDataObject();
        }
        public void DisplayData(){
            pd.DisplayValue();
        }
    }
    //Test class
    public class MyDoc {
        static Document d,e;
        public static void main(String[] args) {
            d = new Document(new IntFactory());
            e = new Document(new ByteFactory());
            d.DisplayData();
            e.DisplayData();
        }
    }
    
    
    • 部分代码截图:

    • 测试结果:

    面向对象程序设计-4

    • 任务:以TDD的方式开发一个复数类Complex,要求如下:
    
    // 定义属性并生成getter,setter
    double RealPart;
    double ImagePart;
    // 定义构造函数
    public Complex()
    public Complex(double R,double I)
    
    //Override Object
    public boolean equals(Object obj)
    public String toString()
    
    // 定义公有方法:加减乘除
    Complex ComplexAdd(Complex a)
    Complex ComplexSub(Complex a)
    Complex ComplexMulti(Complex a)
    Complex ComplexDiv(Complex a)
    
    
    • 产品代码:
    import java.lang.Integer;
    import java.util.Objects;
    public class Complex {
        double RealPart;
        double ImagePart;
        public double getRealPart(){
            return RealPart;
        }
        public double getImagePart(){
            return ImagePart;
        }
        public Complex(){
            RealPart = 0;
            ImagePart = 1;
        }
        public Complex(double R,double I){
            RealPart = R;
            ImagePart = I;
        }
        public boolean equals(Object obj){
            if(this == obj){
                return true;
            }
            if(!(obj instanceof Complex)) {
                return false;
            }
            Complex complex = (Complex) obj;
            if(complex.RealPart != ((Complex) obj).RealPart) {
                return false;
            }
            if(complex.ImagePart != ((Complex) obj).ImagePart) {
                return false;
            }
            return true;
        }
        public String toString(){
            String s = new String();
            if (ImagePart > 0){
                s = getRealPart() + "+" + getImagePart() + "i";
            }
            if (ImagePart == 0){
                s = getRealPart() + "";
            }
            if(ImagePart < 0){
                s = getRealPart() + "" + getImagePart() + "i";
            }
            if(RealPart == 0){
                s = getImagePart() + "i";
            }
            return s;
        }
        Complex ComplexAdd(Complex a){
            return new Complex(RealPart + a.RealPart,ImagePart + a.ImagePart);
        }
        Complex ComplexSub(Complex a){
            return new Complex(RealPart - a.RealPart,ImagePart - a.ImagePart);
        }
        Complex ComplexMulti(Complex a){
            return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,RealPart*a.ImagePart + ImagePart*a.RealPart);
        }
        Complex ComplexDiv(Complex a) {
            return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart));
        }
    }
    
    
    • 测试通过:

    面向对象程序设计-5

    • 知识点:

    面向对象(Object-Oriented)的三要素包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。
    OOD中建模会用图形化的建模语言UML(Unified Modeling Language),UML是一种通用的建模语言,我们实验中使用umbrello进行建模,Windows中推荐大家使用 StarUML。
    过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT。数据抽象才是OOP的核心和起源。

    • 要求:

    使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。类图中至少两个类。

    • 由于我对UML用法掌握得还不到位,没有对实验二的代码进行建模,最后选择了书中编程题进行建模。

    实验体会

    本次实验对我来说难度较大,不仅是代码,还有下载安装软件等操作,虽然老师的教程非常完整,但我还是会遇到许多问题。在此感谢我的队友给予的帮助,一起加油!

  • 相关阅读:
    模型分离(选做)
    密码保护
    实现搜索功能
    完成个人中心—导航标签
    个人中心标签页导航
    评论列表显示及排序,个人中心显示
    完成评论功能
    从首页问答标题到问答详情页
    运行Junit单测时遇到的问题
    spring定时任务执行两次的原因与解决方法
  • 原文地址:https://www.cnblogs.com/5306xyh/p/8854115.html
Copyright © 2011-2022 走看看