BUAA OO 第四单元博客

OO第四单元博客

本单元所实践的正向建模与开发

根据百度百科的解释,所谓正向建模是一种软件工程方法,它将系统建模为由功能元素组成的层次结构。每个层次的功能被分割成子集,在每个子集中,元素之间存在着逐步的细化和分解关系,从而形成了系统框架。正向建模方法是一种自上而下的设计过程,它从高层次的总体功能出发,逐步细化到低层次的细节设计,以实现对整个软件系统的全面把握。

在本单元的建模过程中,我采用了如下步骤:

1、根据需求设计基础架构

2、根据架构画出关键部分的 UML 图,包括类图、状态图与时序图

3、根据 UML 图进行代码编写,并在编写过程中根据需要动态调整设计与结构

4、进行测试,如有 bug,进一步进行调整

正向建模帮助我们进行更加高效的设计和代码编写,也更加有助于我们理解设计和进行测试,同时也是我们与别人进行合作编写代码时必不可少的步骤之一。除此之外,正向建模可以促使开发人员更加关注系统的结构和内部逻辑,从而设计出更加清晰、可扩展和易维护的系统,也有利于我们对工程进行迭代和完善。

本单元作业的架构设计,并对比分析最终的代码设计和UML模型设计之间的追踪关系

本单元总体的设计架构核心部分是 Library 类和与图书管理有关的如图书管理员 Librarian、自助机器 AutoMachine、预定管理员 Reserver等等,并设计了用于辅助的时间类 Calendar、Date,在 MainClass 先通过 InputHandler 读取到全部的输入,再通过循环模拟时间的流逝,在每一轮循环中进行每天对应的操作,从而实现对图书馆真实情况的模拟。

类图:

在这里插入图片描述

状态图:

在这里插入图片描述

时序图:

在这里插入图片描述

追踪关系:

在状态图中,我将图书状态分成了如下几部分:直接被借走(在学生手中),被预定方式借走(在学生手中),被校际方式借走(在学生手中),校际运输中,在管理员处(整理管理员,自助机器,图书管理处,后勤部门等),被返还到书架上。可以看到书籍的状态模拟了代码中书籍的转移关系,与类图相符合。

在时序图中,我的设计相对简单,取到预定书籍的流程是预定管理员 Reserver 通知图书馆预定到书籍(orderNewBook),图书馆将预定的书籍给 Reserver(dispatch),分发给学生们(getOrderedBook),同样符合代码中设计的预定书籍流程,具有一致性。

四个单元中架构设计思维的演进

第一单元中,是利用递归下降进行表达式分析。在第一单元的设计里,我的设计思路是按照实验代码中给出的思路来进行设计的,所以并没有事先考虑架构的问题,而是走一步算一步,写到哪需要什么就写什么,并没有整体架构上的考虑,所以类之间关系混乱,而且大多是一种面向过程的思想,没有利用面向对象的特性。

第二单元,是多线程电梯的开发。在这一单元中,我初步认识到设计架构的重要性,因为经历过了重构之后,真实认识到重构的痛苦,所以明白了应该在设计初期多下功夫,但是架构设计上仍然有着不小的问题,在迭代过程中进行了代码的部分重构。

第三单元,是学习 JML 语言,理解规格设计。第三单元中没有了代码架构方面的压力,或者说压力降低了不少,但在算法方面的要求很高,如果算法不达标,就难免在强测中 TLE,这也是让我很头疼的一个问题,在迭代过程中更换了多个算法,但都没能达到满意的性能。

第四单元,就是对图书馆日常进行模拟,学习 UML 图辅助正向建模的设计模式。最后一单元中,我真正认识到了针对需求完成代码的一整个具体的流程该是什么样。架构设计方向上,我学会了考虑需求的可能的变化,学会了如何设计架构以期尽可能地实现迭代需求,降低重构风险,同时也考虑到了维护和 debug 方面的需求,真正从全局角度进行了一次架构设计,这一次的设计让我从实践里获得不小的收获。

四个单元中测试思维的演进

在四个单元的磨砺中,我对代码的测试积累了更多的经验。

起初,我只会用最简单的数据测试程序的基本功能,其他测试方法都不是很了解。后来在同学的帮助下,我学会了跟同学对拍,搭建测评机,随机自动生成测试样例等等,然而这些只是单纯的暴力测试,测试的效率并不高。再然后我才了解了白盒测试和黑盒测试,以及压力测试、单元测试、回归测试等等测试方法,测试水平得到提升,测试手段更加科学有效,在测试中也了解到了什么样的代码更容易出现 bug。

自己的课程收获

在课程的训练下,我这一学期过的很辛苦但也收获满满。

首先,我学会了代码的架构设计,并认识到架构设计的重要性。进行上千行的代码设计时,盲目下手并不可取,要考虑到多方面的需求,先进行架构设计再具体编写代码,具体的上面已经说过,这里就不再赘述。

其次,我学会了如何进行测试,并了解到了测试的重要性。我认为代码的测试和代码编写本身同等重要,毕竟如果写出来的代码不具有实用性,就失去了写代码的意义。在编程过程中,其实很难保证没有 bug 或者盲区,所以测试是必要的。

竟如果写出来的代码不具有实用性,就失去了写代码的意义。在编程过程中,其实很难保证没有 bug 或者盲区,所以测试是必要的。

最后,我了解到了面向对象的设计思想,学会了一系列的如单例模式、工厂模式等设计模式。面向对象的核心是将问题看作是由不同的对象组成,这些对象之间相互作用完成对问题的解决。面向对象考虑的是把具体的操作和数据封装到对象中,通过继承和多态等机制,让对象之间互相交互完成整个程序的执行过程。在面向对象的程序设计中,各个对象具有特定的属性和行为,对象之间可以通过通信进行协作,完成特定的任务,这种方式才更加灵活和可维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BUAA数据结构第四次编程题是关于栈操作的题目。题目要求使用数组模拟栈,并按照给定的操作顺序进行入栈和出栈操作。入栈操作表示将给定的数字压入栈中,出栈操作表示弹出栈顶元素并输出。如果栈状态为空时进行出栈操作,或栈已满时进行入栈操作,则输出"error"。最后,需要按照操作的顺序输出出栈元素序列,元素之间用空格分隔。如果栈最终不为空,则最后一个元素后也要有一个空格。 解题思路:使用一个数组来实现栈的数据结构,通过维护一个指针top来表示栈顶元素的位置。根据给定的操作进行相应的入栈和出栈操作。对于入栈操作,将给定的数字存入数组中,并将top指针加1。对于出栈操作,判断栈是否为空,若为空则输出"error",否则输出栈顶元素并将top指针减1。最后,按照操作的顺序输出出栈元素序列。 以下是参考代码: ``` #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<ctype.h> struct stack{ int top; int data<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [BUAA(2021春)栈操作(栈-基本题)](https://blog.csdn.net/zhouEnshen/article/details/116305600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值