OOP第三次总结

Posted markbee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OOP第三次总结相关的知识,希望对你有一定的参考价值。

OO作业第7-9次总结

一、前言

​ 第三次作业总结,面向对象编程也接近了尾声,通过一个学期的不断学习,逐渐从只会语法到现在熟练运用设计模式、类图等,面向对象部分学到了很多,也体会到了“万事万物皆对象”的特点。7-9次作业则让我更加熟练的运用面向对象的四大支柱,也更贴近于实际开发,还运用了一些高级框架。这三次的项目是面向对象的学习的综合运用,也为我们以后的学习奠定了基础。

二、设计与分析

  1. 题目7-1与7-2的递进式分析

    ​ 题目7-1:

    ​ 首先,根据题目要求,先进行相应的类设计,题目涉及到的四个图形类继承于一个抽象图形类,抽象类里面包括四个图形共同的求面积和合法性检验的方法,方便以后多态的运用;卡片类通过创建数据域和图形类关联,同时卡片类实现Comparable接口,对compareTo方法重写,来达到所想要的排序方式;还需要一个处理数据的类,包含一个Card类的数组列表,用来对所有的卡片进行操作。 同时在main方法中传入一个卡片数量的参数,方便遍历。

    ​ 题目7-2:

    ​ 在题目7-1的基础上,对每个图形进行了分类后排序,本质上没有什么不同,只需在处理数据的类中添加四个数组列表来分别存放相应的图形,在创建实例的时候,只需加一条将图形实例添加到相应的图形列表中即可,再进行遍历输出。

    ​ 在设计上,7-2是7-1的改进版本,将卡片图形分组方便对数据进行批量处理和管理,更好的体现了程序的复用性和可拓展性。

    ​ 类图分析上,类之间关系很清晰

    a

  2. 题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

    ​ 题目集8:

    ​ 本次作业就比较贴合实际应用,类的创建与关系就相应比较复杂,其中银联、银行、账号、卡号、用户作为实体类,且根据实际进行关联,其中要注意的是,各个实体类需进行双向关联,便于查找到关联的实例。除了具体的实体类,还需要一个处理数据的类,用来将传入的输入数据进行处理后,储存到一个数组中再进行计算处理。吸取之前的经验,在处理数据方面,一行一行的数据可以使用Stringbuffer类来进行处理,这样很有效:

    Scanner input = new Scanner(System.in);
    StringBuilder sb = new StringBuilder();
    String data = "";
    while (!((data = input.nextLine()).equals("#"))) {
        sb.append(data + "\\n");
    }
    String outstr = sb.toString();
    String[] rows = outstr.split("\\\\n");
    

    ​ 题目集9:

    ​ 在题目8的基础上,程序实现了跨行取款的功能和增加透支卡的功能,实体类的关联关系直接使用题目8中的实体类的关联关系,不同的是需要修改账户类,来增加透支的功能;修改银行和银联类,来增加跨行取款和透支取款的利率;在计算时只需考虑到利息的情况即可,类之间的关联情况区别不大。

三、踩坑心得

  1. 题目集7

    ​ 在题目集7中的两道题中,题目1测了一些数据,比较容易;题目2需要注意的一点就是某一个图形数目为0的情况下,输出格式不正确的问题(具体数据忘记了),还需要注意的是compareTo的重写注意题目的要求。

  2. 题目集8

    ​ 要注意equals方法的重写,熟练掌握后建议使用IDE自动生成的equals方法,比较规范严谨。还有就是注意哪些类需要重写equals方法,因为equals方法本质上还是比较类的地址,需要重写来比较具体内容。

  3. 题目集9

    1. 注意数据合法性的判断,贷记卡不能超过5万,最不易考虑到的就是借记卡不能贷款,必须考虑到跨行取款时的手续费扣除的问题。
    2. 数据的计算关系要理清楚,否则很容易出现数据计算错误等问题。

四、改进建议

  1. 题目7-2

    ​ 根据单一职责原则,一个类应尽量实现一个功能,方便调试和修改;在求最大面积时应该还有更好的算法,需要之后深入的学习之后改进。

    ​ 根据复杂度分析,输出方法的圈复杂度和认知复杂度都比较高,因为其中使用了大量的for语句,不可避免,其他的复杂度都在可接受范围之内。

pta.homework7.test2.DealCardList.showResult() 9.0 1.0 10.0 10.0
pta.homework7.test2.Main.main(String[]) 6.0 1.0 5.0 6.0
pta.homework7.test2.DealCardList.getmaxArea() 5.0 1.0 5.0 6.0
pta.homework7.test2.DealCardList.DealCardList(ArrayList) 3.0 1.0 2.0 6.0
pta.homework7.test2.DealCardList.validate() 3.0 3.0 2.0 3.0
pta.homework7.test2.Card.compareTo(Object) 1.0 2.0 2.0 2.0
pta.homework7.test2.Rectangle.validate() 1.0 1.0 1.0 2.0
pta.homework7.test2.Trapezoid.validate() 1.0 1.0 1.0 3.0
pta.homework7.test2.Triangle.validate() 1.0 1.0 1.0 6.0
pta.homework7.test2.Card.Card() 0.0 1.0 1.0 1.0
pta.homework7.test2.Card.Card(Shape) 0.0 1.0 1.0 1.0
pta.homework7.test2.Card.getShape() 0.0 1.0 1.0 1.0
pta.homework7.test2.Card.setShape(Shape) 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.Circle() 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.Circle(double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.getArea() 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.getRadius() 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.setRadius(double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Circle.validate() 0.0 1.0 1.0 1.0
pta.homework7.test2.DealCardList.DealCardList() 0.0 1.0 1.0 1.0
pta.homework7.test2.DealCardList.cardSort() 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.Rectangle() 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.Rectangle(double,double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.getArea() 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.getHeight() 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.getWidth() 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.setHeight(double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Rectangle.setWidth(double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Shape.Shape() 0.0 1.0 1.0 1.0
pta.homework7.test2.Shape.Shape(String) 0.0 1.0 1.0 1.0
pta.homework7.test2.Shape.getShapeName() 0.0 1.0 1.0 1.0
pta.homework7.test2.Shape.setShapeName(String) 0.0 1.0 1.0 1.0
pta.homework7.test2.Shape.toString() 0.0 1.0 1.0 1.0
pta.homework7.test2.Trapezoid.Trapezoid() 0.0 1.0 1.0 1.0
pta.homework7.test2.Trapezoid.Trapezoid(double,double,double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Trapezoid.getArea() 0.0 1.0 1.0 1.0
pta.homework7.test2.Triangle.Triangle() 0.0 1.0 1.0 1.0
pta.homework7.test2.Triangle.Triangle(double,double,double) 0.0 1.0 1.0 1.0
pta.homework7.test2.Triangle.getArea() 0.0 1.0 1.0 1.0
Total 30.0 42.0 59.0 74.0
Average 0.7692307692307693 1.0769230769230769 1.5128205128205128 1.8974358974358974
  1. 题目9

    ​ 当时做作业时,还不知道双向关联的类关系,导致程序中用了大量的for循环嵌套,使程序的效率极低;为了遍历所有数据,还创建了不必要的数组列表,浪费了大量空间,这些问题都可以通过双向关联解决;主函数中的方法太多,导致程序可读性很差,也没有实现单一职责原则,应该尽量把方法封装在类或者接口中;

    ​ 根据复杂度分析,不出所料,程序简直惨不忍睹,处理和检验数据的方法大量的for语句使程序复杂了几个量级,之后我一定会改正。

pta.homework9.Main.Dealdata(String[]) 82.0 1.0 20.0 21.0
pta.homework9.Main.validate(String) 54.0 5.0 16.0 25.0
pta.homework9.Account.equals(Object) 8.0 5.0 4.0 8.0
pta.homework9.Card.equals(Object) 7.0 4.0 4.0 7.0
Total 156.0 73.0 103.0 122.0
Average 2.6 1.2166666666666666 1.7166666666666666 2.033333333333333

五、总结

​ 本次作业是学习OO的最后一次作业(虽然还有实验),贴近实际的设计习题是一个很好的结尾,面向对象编程的基本知识也就此告一段落,不过编程之路还有很长的路要走,之后的还需要学习关于设计模式等知识来进一步改进自己的对象编程;本次主要巩固了类之间关系的知识,类之间的关系更加明确,也学会了如何根据功能设计类;还学会了一些接口和方法的使用,equals方法和comparable、comparator接口等;总之,通过这三次习题,我巩固了类的基本使用知识,也知道了更多类设计的知识,让我能够更好的对实际中的开发有一定了解;之后的学习还道路遥远,学到这里java也仅仅才是入门,还需更加努力

六、相关知识

  1. 单例设计模式

    单例模式 | 菜鸟教程 (runoob.com)

以上是关于OOP第三次总结的主要内容,如果未能解决你的问题,请参考以下文章

OO第三次总结

OOP第四次作业(第一次总结)

OOP课程题目集第二次总结

OO第三次总结博客

OOP第四到第六次训练总结

OOP第三次上机