OO第四单元总结与反思

杜启嵘-22373362 学生 2024-06-10 23:42:19

一.正向建模与开发

​ 在本单元中,主要的训练目的是通过画UML图进行正向建模与开发,即首先通过画UML图(类图/状态图/顺序图)等设计程序的架构,然后进行代码实现。

​ 在本单元作业中,我主要通过类图进行正向建模与开发。在进行代码实现之前,首先画类图来确定出大致的属性、方法、交互关系等,关于一些比较具体的实现例如参数等先略去,在完成代码过程中进行补充。

二.架构设计

​ 本单元的架构设计在三次迭代中保持的相对稳定,除了类中的方法等细节变动,在类的层面上遵循着面向对象的奥义,对于出现的每一个事物都建一个类,在第二次作业中新增漂流角类。

  • 第一次作业

img

  • 第二次作业

img

  • 第三次作业

img

​ 在三次作业中,我首先进行大略的UML类图的绘制,然后根据第一版类图进行代码构建,在编写代码的过程中不断完善细节和类之间的交互关系,反过来对UML图中的关系进行修改,达到了代码设计和UML模型之间的追踪关系。

三.架构设计思维演进

​ 第一单元聚焦于层次化设计,通过表达式计算这一实际问题来引导同学们进行表达式->项->因子的递归下降建模。在第一单元中,我对于递归下降的理解是不断深入的,在架构设计上,针对递归下降的结构进行设计,即对表达式、项、因子三个层次进行建模,其中因子设计为一个接口,不同种因子设置为接口的实现。

​ 第二单元聚焦于多线程设计,通过新主楼电梯运行这一实际问题来引导同学们进行多部电梯之间的多线程协作编程实践(个人体感上第二单元是最难的,难以复现的bug让人恼火)。在第二单元中,我的架构设计主要在于多线程之间的交互关系上:输入线程、调度器线程、电梯线程之间使用怎样的数据结构,怎样降低耦合度,提高内聚度。

​ 第三单元聚焦于JML规格化设计,通过迷你社交网络这一实际问题来引导同学们根据JML代码来编写实际的JAVA代码。这一单元实际上对于架构设计没有要求,同学们要完成的任务在于根据已经给出的架构进行规格化代码编写,主要的问题是规格与实现分离:给定了JML规格,但不指定具体实现,这其中的算法效率需要同学们进行设计。我感触比较深的点除了使用复杂度较优的算法之外还有进行复杂度分摊:对于一个常使用的复杂度较高的算法可以将他的复杂度分摊在其他较少使用的方法中,达到全局优化的效果。

​ 第四单元聚焦于UML正向建模与设计,在这单元中我尝试首先通过UML类图进行代码架构的建模与设计,然后在代码编写的过程中优化类之间的协作关系以及数据结构,最后反过头来完善UML图中的细节以及修改与代码不符的设计。在第四单元中,我更加深刻地感受到架构设计的重要性,一个好的架构设计可以为代码实现减小实现难度同时维持较好的扩展性,而架构设计的奥义在于高内聚低耦合,在OOpre以及OO课程中我的感受就是“对每一种事物都建一个类来完成对应的职责”。

四.测试思维演进

​ 在四个单元中,我都是采用边缘数据测试+大量随机数据压力测试的方法,在第三单元中,采用了参数化JUnit测试。

​ 在代码编写过程中,我会编写一些简单的样例对已经编写好的代码进行测试,相当于对每一个方法都进行一个小测试,在过程中不断debug,防止最后bug堆积增加debug难度。

​ 完成代码编写后(首先跑样例),手动构造一些从简单到极端数据测试数据范围、运行时间、算法效率等(当然本机运行时间和评测机完全不同,只是进行不同实现间的比较)。然后进行大量随机数据压力测试,这里要感谢DPO的评测机以及Kai_ker的评测机支持。

​ 以上都是进行黑盒测试,在时间充裕的情况下,我还会进行白盒测试,即从头到尾读几遍自己的代码,再推敲一遍实现细节,往往白盒测试能够触碰到一些黑盒测试碰不到的角落bug

五.课程收获

​ 从OOpre初次接触JAVA编程,到OO课程结束已经可以独立编写千行级别有一定质量的代码,我在一次次代码作业中提高编程能力,在一次次博客作业中总结编程经验。从赤手空拳到满载而归,这是一个充满艰辛的过程。

​ 面向对象思想是一种好用且高效的思想,理解面向对象思想并不难,通俗的说就是对每一种事物都理解为一个类,有属于自己的职责;但是要想真正写好面向对象代码则需要在不断实践中掌握各种设计模式、不断提高架构设计能力、不断体会高内聚低耦合的设计思路,这也正是课程组在作业中要求我们掌握的。

​ 彼时的少年,站在成长的巅峰,回首来时,满路崎岖。诚实地说学习OO的过程于我而言是痛苦的,难忘深夜新主楼debug的种种艰辛,但是带给我的代码能力的成长也是非常之大的。

​ 在写OO的过程中,我喜欢用Pomodoro Logger记录自己努力的时间,hhhhh真是花了很多时间(只展示时间最长的两次作业)。

img


img

​ 如今在OO课程结束的节点,我很赞同OO是一门绝世好课,无论从课程制度还是难度设置上都越来越合理(可以实实在在地给予同学们一个完整的青春)。感谢老师、助教、研讨课上高谈阔论的同学、Kai_ker哥在我的OO课程中赠予的帮助。
写完了这篇博客,我就要和2024春季的OO课程说再见了,心头感慨万分,甚至有些舍不得,我深知对我能力提高这样大的课程恐怕再难遇到,诚惶诚恐,用每一行代码,每一篇博客小心翼翼地记录下属于我的OO时光。

...全文
76 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 全国计算机等级考试二级教程《Python语言程序设计》(2018年版)被视为针对Python入门者和备考人员的核心学习材料。该资料汇总了教材内的所有编程练习答案,这些答案在Python 3.5.3环境中经过实际执行测试,从而保障了代码的准确性和应用价值。备考人员借助这些答案,能够评估自身的学习进度,并深入理解和熟练掌握Python编程的基础原理与方法。 1. Python基础理论:Python作为一门高级编程语言,因其简明扼要的语法结构和卓越的功能表现而备受推崇。基础内容涵盖了变量、数据种类(例如整型、浮点型、字符串、布尔型、列表、元组、字典、集合)、逻辑控制(比如条件判断if-else,循环控制for、while)、函数的声明及使用、模块的引入等。 2. Python高级应用:Python的进阶内容涉及异常管理(try-except-finally结构),类与实例(面向对象编程的基础,包含类的构造、对象的生成、属性与方法的运用、继承机制、多态表现),装饰器(用于调整函数或类的功能特性),上下文管理器(借助with语句实现资源管理)等。 3. 数据文件处理:Python配备了全面的文件操作功能,涉及文件的开启、数据读写、关闭操作,以及多种操作模式(例如r模式用于读取,w模式用于写入,a模式用于追加内容等)。此外,还包括文本文件与二进制文件的转换处理,以及文件的位置调整、复制和删除等操作。 4. 标准库的运用:Python的标准库资源极为丰富,比如os模块提供操作系统接口,sys模块用于获取系统参数,random模块可用于生成随机数值,datetime模块负责处...
代码下载地址: https://pan.quark.cn/s/664854f01855 TCP/IP SOCKET协议构成了互联网通信的基石,它明确了网络设备之间数据交换的规范。TCP(Transmission Control Protocol)是一种以连接为导向、具备可靠性且基于字节流的传输层通信规范,而UDP(User Datagram Protocol)则是一种非连接型且不可靠的传输协议。在实施TCP/IP SOCKET的调试工作中,专业的软件能够协助开发者更清晰地洞察网络通信的流程,精准地找出故障点,并对代码进行改进。 "TCP模拟调试工具"即为一种实用的辅助性软件,它赋予用户模拟TCP连接、发送及接收数据的能力,从而对网络应用程序进行测试和调试。此工具或许具备以下几项功能: 1. **连接模拟**:可以模拟客户端与服务器之间TCP连接的完整过程,涵盖三次握手和四次挥手阶段,从而帮助理解TCP连接的完整生命周期。 2. **数据发送与接收**:支持自定义数据包的发送,并能显示接收到的数据,这对于核实数据传输的准确性极为关键。 3. **错误检测与重传**:TCP协议内含错误检测和丢失数据自动重传的机制,该工具或许能够模拟这些场景,助力开发者测试其应用的容错性能。 4. **流量控制与拥塞控制**:TCP通过滑动窗口机制实现流量控制与拥塞管理,工具或许提供查看和调整这些参数的选项。 5. **端口监听**:能够监听指定的端口,观察数据的进出情况,这对于服务器端程序的调试尤为有益。 6. **日志记录**:记录所有通信事件,便于后续的分析与问题定位。 7. **多线程支持**:针对处理多个并发连接的程序,工具或许提供多线程或并发会话的模拟。 8. **协议解...

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧