272
社区成员




前面的Unit开发中虽然会构思整体框架,但都只是有个模糊的思路,总体上还是从小到大,先完善各个相对独立部分,再整理连接起来.
这个过程中会遇到接口错误,架构不统一,冗余重复等问题.导致结构膨胀,接口复杂,形成诸多bug,导致多次重构.
此次Unit要求正向建模与实现,先设计完善的UML,再根据清晰的设计编写代码,在设计阶段就得到优化的结构和具体实现架构.
Book
根据不同指令发生所在地的转移尽管理想的境界是在编写代码前就能够设计出具体到类的属性和方法的架构,
但是本人经验不足,熟练度不足,无法在编写代码前就选择出正确且优美的数据结构和行为实现.
因此还是在设计大概框架后,在编写过程中不断迭代思路和架构,编写完成后才绘制UML图.
或许在未来编写足够多的项目,经验足够丰富后才可以在设计顶层的时候,就敏锐地找到优美的具体实现.
Book
,''拥有者''类:Shelf
,Reader
,CircumstanceDesk
,ReservationDesk
,ReadRoom
,调度类:Dispatcher
Book
的容器Dispatcher
根据命令将书在各个"拥有者"类之间转移,并更新信息accept
需要方法和属性进行判断根据上述分析绘制类图,得到具体结构
设计Book
和Reader
类,BooksTable
和ReadersTable
容器,
最开始按照课程组要求的先设计后编写,对于书本的存在是对于书的属性location
进行修改
但是实现过程中,发现其他类也需要获知书本的转移状态,如果只在类中设计一个属性来记录,会导致使得其他类需要大量遍历或者曲折地逐步获取才能实现
最后更改架构,将书本作为一个新的类,其中存储转移信息,并且将其在书架,读者,借还处,预约处作为实例而非引用的转移,使得实例所在为有无,而非实例属性的所在.
在更改思路后
设置了几个类
实例
Book,
Reader
容器类:
ReadersTable
BooksTable
场所类:
CircumstanceDesk
ReservationDesk
ReadRoom
Shelf
调度类:
Dispatcher
整个Unit迭代过程按照核心“命令-调度-场所处理-书籍转移”和对应的信息记录修改的框架,没有过多修改,只是不断添加新的指令,场所和调度的分支判断。
项目实现是在“代码设计”和“UML模型建模”之间反复交替进行的。最开始设计好确定功能和接口,确定类的属性和方法,构建UML类图,确定类的属性和方法,作为代码实现的参照和模板。
在代码实现过程中,根据经验和需要,新增接口和方法,再对UML进行修改。
最后实现完善的UML和代码实现,两者在类,类的属性,类的方法和方法的接口等等保持一致。
大模型除了第三单元给出JML的情况下,能够直接生成比较良好的代码,其他单元的使用中,主要用于提供一个设计框架,优化思路和评测机.
要求实现表达式的化简
这一单元开始还是缺乏面向对象的意识,没有学会从顶向下地设计和拆分任务.
通过递归下降来化简表达式,逐渐意识到面向对象编程在设计时要抽象任务需求,设计整体框架后再逐层拆分,最后再填写代码.
要求实现多线程并发的电梯
学会了"消费者,生产者"模式的架构,对于需求接受,需求调度和需求处理的三层结构掌握到位.
通过对多线程中相互锁,等待和唤醒的练习,对于并发和相互调度的复杂系统的理解和设计能力有了很大提升.
要求根据JML实现一个社交网络系统
这一单元的整体架构已经由课程组给出,问题本身也较为简单,没有难度,
为了通过中强测而进行结构和性能的优化,让我意识到除了正确性外,性能的重要性,锻炼了优化结构,减少消耗的结构改进能力.
要求设计一个图书馆的图书管理系统
经过上面三次作业的学习,这一单元无论是思考框架还是实现代码都没有花费太多时间,感觉框架设计和代码能力方面没有额外的提升.
了解了UML在项目实现过程中的重要性,学习如何应用UML来规范和辅助代码实现.
这一单元因为有比较方便的python库函数可以使用,第一二次作业在正确性上有可靠的参照, 数据本身也仅仅只是使用随机数据生成即可满足需求.
这一单元bug频发,多线程并发导致没有稳定的输出,并且轮询,死锁等多线程特有的结构bug需要具体到代码细节上,这两者叠加导致难以通过往常的断点调试得到良好的结果.
最后通过在关键代码段中输出特定语句,表示当前状态,对bug的寻找有所帮助.
如果不考虑性能,直接按照JML来直译,应该不会出现问题,问题在于为了优化性能而导致多个属性在多个函数之间关联修改访问.
这一部分使用单元测试,对于多种极端和大量随机情况,通过与直译法得到的结果比较,比较方便寻找bug.
这一单元比较简单,没有复杂结构,甚至不用中测,按照样例修改完bug即可通过强测.
最后因为时间关系,只是手搓了一些边界数据进行测试,没有找到bug.
OO的任务在大二下学期中占了很大的比重.分析问题需求,构建整体框架,实现具体代码,测试寻找bug.这些无论是在思维上还是代码能力上都带来极大的挑战,耗费大量的时间和精力,相应地也得到了项目思维,代码能力,测试能力等等诸多方面的提升.
针对不同场景,递归下降,多线程并发,JML,UML类图等等针对性地设计任务,在基本能力的基础上,为我们未来应对其他问题锻炼了特定技能,打下了不错的基础.