首页 > 其他分享 >BUAA OO 第四单元总结 + 课程总结

BUAA OO 第四单元总结 + 课程总结

时间:2024-06-12 21:29:49浏览次数:19  
标签:总结 OO 架构设计 实现 代码 BUAA 设计 UML 单元

第四单元课程着眼于UML语言,重点关注了类图、状态图、顺序图三种不同类型的图,分别从不同的视角展现代码架构设计与思考
在本单元任务要求我们实现一个图书馆系统,能够实现对于学生的借阅、查询、预约、续借、捐赠等操作,该图书馆包括书架、预约处、借还处、漂流角等不同位置,图书馆白天开馆,夜晚闭馆,在开馆期间处理学生的一系列请求,在闭馆期间整理图书,将图书按照规则要求运送到不同的位置

正向建模与开发

其实在每一单元的代码开发过程中,或多或少都运用到了正向建模与开发的思想和方法,但是每单元由于强调UML的使用,所以更加明显的体现了这一过程,我将该过程大致分为以下几个步骤:

  • 首先,我们分析题目或者用户的需求,整理出我们大致需要实现功能的最终效果
  • 之后,我们将需求中的模型抽象出来,将不同的功能整合,明晰我们需要创建的类,在这时我们可以构建UML中的类图,来帮助记录类的相关功能和属性
  • 我更习惯通过顺序图描述整个行为所需要不同类之间的协作,通过构建顺序图有助于理清整个行为的操作顺序,如在预约这一行为中,首先Library接到请求并分析其类型,然后将request传给AppointmentOffice处理,AppointmentOffice则通过StudentTable查询该Student相关的状态,决定是否成功预约,再将结果返回给Library输出
  • 之后我们进行代码的编写,完成具体实现
  • 最后通过测试,保证代码的完备性和正确性

架构分析

在这里插入图片描述
在经历这一单元的学习后,终于用上了自己画的UML类图()
本单元的问题和现实关系比较紧密,可以较为容易的抽象出所需要构建的类,由于每次迭代的内容改变不大,我在后两次的迭代中也就增加了Book类并增加和修改了一些属性和方法,所以这里以最终的类图作为展示

  • 最核心的就是Library类,在其中处理不同的请求,将各个不同的请求分到其他的类之中实现,同时实现开馆馆等操作,以该类为中心调用其他不同类实现功能
  • 几个基础的类分别是StudentBookAppointment类,分别用来记录这三者各自的属性
  • StudentTable类其中主要是Student的集合,用来记录整个图书馆系统中的所有学生,对其进行相应的检查和修改
  • BookshelfAppointmentOfficeDirftCorner分别完成了对整个图书馆细分各个功能的实现,也对应了整理图书中,图书可能运送到的不同位置

在本次作业的进行过程中,我也尝试按照要求先进行架构设计以及UML绘制,再进行代码的编写,但是由于目前我们的任务的规模较小,所需要的规格设计并不是必要的,先进行UML设计再编写代码之后再对应修改UML的过程耗费的时间较多,最终还是采取了先写代码的偷懒行为
但这并不意味着没有提前进行规格设计,我更喜欢采用简单的顺序图来梳理代码整体的逻辑,再按照逻辑顺序依次去实现相应的功能

从“pre”到“昆仑”——一个合格六系人的面向对象修养提升

再回首,不妨把目光放的再远一些,我仍记得初次接触Java,上学期的oopre,每周的迭代开发,一个冒险者的游戏,从最初简单的装备、药水,逐渐升级,再到这学期的昆仑计划,面向对象的思想逐渐改变了我编程的思路,让我在代码编写的过程中逐渐体会到了什么是架构设计,什么是性能优化…那个曾经势单力薄的冒险者,如今也已经完成了“昆仑”的攀登

架构设计思想

  • 在pre当中,我们并没有架构设计的概念,我只是随着指令数量的添加,增加着一个又一个的代码、方法,进行着重构、重写,因为那时的我无法看清整个系统的全貌,只能添加者冗余的代码和方法,被动进行着编写
  • OO U1,至今仍记得刚开学的崩溃,递归下降的推送反反复复看了许多遍还不得要领,依靠着对实验的代码的模仿,才完成了自己的代码设计,已经感受到了实验代码的高可读性,以及高内聚低耦合的设计(虽然那时还不明白这是啥意思),通过对于项、表达式,各个类的继承和使用,对词法器和语法器不同功能的划分,对架构中不同类的分工有了更深刻的理解
  • U2,多线程,神一样的电梯系统,经过这一单元的洗礼,对于生产者—消费者模式有了更深刻的体会,分发器、请求接收器、电梯、等待队列,这一完整的框架已经逐渐成型,也是在这一单元,对类与类之间、线程与线程之间的相互协作有了更深入的认识
  • U3,JML,相较于前两个单元的自行设计和完成,JML给我们天马行空的设计加入了规范和约束规格化设计更加符合于现实生活工程中的要求,而高度抽象化的JML语言也给理解带来了不小的压力,这一单元中,我看到了代码编写的规范与约束
  • U4,UML,我们需要独立完成整个图书馆系统的设计,实现正向建模与开发的全流程,相较于前几个单元而言,U4的难度并不高,但是涵盖了整个设计到代码实现,再到测试的全流程,至此,我们已经能够独立实现系统开发与设计(虽然规模不大)

测试思想

  • 最初的最为基础,本地并不进行过多的测试,通过样例简单测试功能,交给中测,出现问题后再回头寻找问题,较为依赖开放的数据点
  • 通过简单的搭建评测机,通过随机大量数据的生成,以数量战胜质量,与同学进行对拍,检测多种情况下的正确性
  • 通过Junit对个别方法进行细致的检查,构造能够保证全覆盖的样例,这一思想在U3尤为突出
  • 通过构造特殊样例、边界情况、以及大量耗费时间的指令,对代码进行压力测试,测试代码的性能是否达标,互测中hack的常用方式
  • 终极测试方法瞪眼大法!通过对每个要求、每种情况,一行行代码的寻找,试图找出bug所在

课程感悟

我们作为一个冒险者出发,收集装备和药水,完成了化简表达式的考验,在旅途中搭建起与他人的社交网络,最终乘坐着电梯,努力以较快的速度来到了昆仑山顶的图书馆,成功预约了《补给站(bushi)
面向对象课程是我在诸多专业课中收获最大的一门,不单单逐渐掌握了java的用法,对于面向对象思想的理解和对于代码规格设计的感悟定会让我终生受益
尽管旅途中也有过不少问题,也曾深夜一行行地瞪代码,但最终还是登上了“昆仑”
还是以U1中的话来结尾吧

祝大家享受OO,享受生活~

标签:总结,OO,架构设计,实现,代码,BUAA,设计,UML,单元
From: https://blog.csdn.net/stardream001/article/details/139619412

相关文章

  • 使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能
    今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。首先引入nuget包Wesky.Net......
  • 小米充电头总结
    小米充电头总结小米67w版本1,65w充电头(满血):型号MDY-11-EB2,67w秒充版(满血):型号MDY-12-ES3,67w轻享版(残血):型号MDY-12-EF4,67w(残血):型号MDY-14-EV5,67w(残血):型号MDY-15-EQ6,67w1a1c(满血):型号MDY-14-EU7,67w小布丁版(残血):型号MDY-16-EJ,支持UFCS融合快充,但是很垃圾。8,67w小布丁大字......
  • springboot2.6x集成swagger2踩坑点
    最近在用springBoot2.6.13集成swagger2.9.2时出现了几个bug,经过几番尝试后,得出了最终的结论,时间紧可以直接看结论。首次集成swagger2时,启动springboot后的bug:org.springframework.context.ApplicationContextException:Failedtostartbean'documentationPluginsBoots......
  • [DP] DP优化总结
    写在前面$DP$,是每个信息学竞赛选手所必会的算法,而$DP$中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素$DP$的时间复杂度和空间复杂度进行优化与处理,以达到满足题目要求的目的;参考文献:动态规划算法的优化技巧毛子青c++DP总结《算......
  • springboot rabbitmq如何保证消息顺序消费
    很多时候,消息的消费是不用保证顺序的,比如借助mq实现订单超时的处理。但有些时候,业务中可能会存在多个消息需要顺序处理的情况,比如生成订单和扣减库存消息,那肯定是先执行生成订单的操作,再执行扣减库存的操作。那么这种情况下,是如何保证消息顺序消费的呢?首先,为了效率,我们可以设置......
  • 模拟赛总结
    一T1:小奇挖矿2因为只能走4步或7步,可以发现,当步数差\(\ge18\)时,一定能到达。而当步数差\(<18\)时,枚举出所有能到达的情况即可。#include<bits/stdc++.h>#definergregister#defineqwq0#defineintlonglongusingnamespacestd;constintN=1e5+3;intn,m;struc......
  • 高效管理JMeter中的Cookies:测试工程师的全面指南
    前言在性能测试和自动化测试中,Cookie管理是一个至关重要的环节。ApacheJMeter提供了强大的Cookie管理器,帮助测试工程师在模拟用户会话和维持状态时更加方便。本指南将详细介绍如何在JMeter中配置和使用Cookie管理器。什么是Cookie及其重要性Cookie是一种由服务器发送并存储在......
  • 苹果WWDC24一文总结,携手OpenAi,开启Ai新篇章
    北京时间6月11日凌晨1点,苹果2024年全球开发者大会(WWDC)正式开幕。按照往年惯例,每年的WWDC大会,苹果都会将重心放在对新版系统的介绍上,本次也不例外,苹果发布了包括iOS18、iPadOS18、macOS15以及visionOS2等在内的一系列软件更新。除了例行的系统更新,发布会的最重头大戏就是AI......
  • Java集合总结
    JAVA中常见的集合总结使用集合的好处:可以动态的保存任意多个对象,使用比较方便提供了一些列方便的操作对象的方法:add,remove,set,get等使用集合添加,删除元素的示意代码简洁明了集合主要分为两种:单列集合:集合中存放的是单个对象双列集合:集合中存放的是键值对对象C......
  • python-爬虫-获取浏览器的cookies
    1、封装浏览器对象#-*-coding:utf-8-*-"""封装类将获取浏览器的对象封装成一个类调用方法:1、importGet_Browser2、driver=Get_Browser.Get_Browsers().get_browser()"""fromseleniumimportwebdriverclassGet_Browsers:def__init__(self......