301
社区成员
发帖
与我相关
我的任务
分享在本单元开发图书管理系统的过程中,我主要实践了正向建模与开发,这包括从需求分析到系统部署的整个流程。接下来,我使用UML进行建模。首先确定了主要用例,主要有
七类。其中,查询包括查询书的在架数量和查询学生的积分。然后,我们绘制了类图,定义系统中的类及其关系,关键类包括“书架(Bookshelf)”、“用户类(Student)”、“图书漂流处(Drift)”等。在类图中,我们明确了各类的属性、方法及类之间的关联(如继承、聚合、关联等)。此外,我们还使用顺序图展示系统中各对象间的交互顺序,例如“借书过程顺序图”可以详细展示用户、图书、借阅记录等对象的交互细节。通过状态图,我们能够描述了某个用例或功能的变化状态。
在系统设计阶段,我们确定了系统的整体架构,并根据类图和用例图,详细设计每个类的实现细节,包括属性、方法、参数及其逻辑。紧接着进入编码与实现阶段,我们遵循编码规范,确保代码的可读性和可维护性。根据设计文档,我们实现了各个类和接口,如实现Student类,包含studentId和信用分、所借图书的bookId和应规还的时间等方法和属性。然后,对每个模块进行独立测试,确保功能实现的正确性。而在系统集成阶段,我们将各个模块集成,形成完整的系统,并进行集成测试,确保各模块协同工作正常。
在整个正向建模与开发过程中,UML类图起到了至关重要的作用。它帮助我们在开发前期明确系统的结构和功能,提供了一种可视化的方法来理解和设计系统。通过类图和其他UML图表,我们可以在编码前清晰地定义系统的各个组成部分及其关系,减少了开发过程中的不确定性和返工。同时,UML图表也为后期的文档编写和系统维护提供了宝贵的参考资料。这一系列实践,确保了图书管理系统的高效开发和可靠运行。

本单元的UML类图如上,一共有六个类。
Student类主要有两个方法:addCredit用于更改用户的信用分,calCredit用于在用户的图书逾期时更改用户的信用分。
Main类中有许多方法,Query、Pick、Order、Return、Donate、Renew、Borrow分别用于完成对应的操作,arrange和Arrange用于完成开馆和闭馆后的整理操作。
UML图与实际的程序之间有着十分重要的关系,我主要有以下几个方面的感想:
UML类图中定义的类,例如Bookshelf、Student、Drift等,与代码中的实体类直接对应。类图中的属性和方法基本都在代码中得到了实现。类图中的关系(如继承、关联、聚合)在代码中通过类的继承、对象引用等方式实现。例如,Main类中包含Bookshelf和Reservation的引用,以便调用数据访问层的方法。
状态图与功能模块的映射:状态图中状态的变化,例如“图书借阅”、“图书归还”、“图书查询”、“图书延期”等,在代码中分别由业务逻辑层的相应服务类实现。例如,状态图中的“借书”功能实现了书籍从bs到bro和student的变化。
顺序图与方法调用的映射:顺序图中展示的对象间的交互在代码中通过方法调用链实现。例如,“借书过程顺序图”中的用户、图书、借阅记录等对象交互在Main类的Borrow方法中通过调用getOrderedBook()等方法实现。顺序图帮助我们在设计阶段明确了调用顺序,确保了代码实现时逻辑清晰。
一致性:总体来看,UML模型设计与最终代码设计之间具有高度的一致性。UML类图准确地反映了代码中的类结构和关系,用例图与功能模块的映射清晰,顺序图与方法调用的顺序对应,活动图中的流程控制也在代码中得到了忠实实现。
差异性:在实际编码过程中,可能会出现一些细节上的调整和优化。例如,为了提高性能或可维护性,可能会增加一些辅助类或方法,这些在初始的UML图中未必详细列出。此外,实际代码实现中可能会涉及更多的异常处理和日志记录,这些在UML模型中通常不会详细展示。
扩展性:通过UML设计,我们在代码实现前就能明确系统的架构和组件关系,有助于识别潜在的扩展点。在代码实现过程中,我们可以根据需求变更或优化建议,对类图进行调整并同步更新代码。
在第一单元的学习过程中,我不仅面对着从C语言转变到Java带来的困惑,还需要理解面向对象编程的基本理念和方法。面向对象编程与我之前习惯的过程式编程有着本质的不同。它强调的是将现实世界中的对象及其行为抽象到程序中,通过类和对象的方式来实现功能模块的封装与复用。起初,我对这些抽象概念感到困惑,特别是在处理复杂问题时,如何有效地分解问题并将其映射到类和对象上,是一个巨大的挑战。
面对这种挑战,我开始参考大量的书籍和网上资源,学习其他开发者的设计模式和代码实现。从中我学到了很多实用的技巧,例如如何通过继承和多态来实现代码的扩展性和灵活性,如何使用接口和抽象类来定义和约束系统的行为,以及如何通过组合而非继承来实现类之间的协作。在不断的学习和实践中,我逐渐掌握了面向对象编程的基本思想,并能够在实际项目中应用这些知识。
第二单元的多线程编程则进一步深化了我的理解。多线程编程不仅需要考虑如何正确地编写代码,还需要确保在多个线程之间进行安全的资源共享和通信。初学多线程编程时,我常常遇到线程安全问题,例如死锁、竞争条件和资源争用等。这些问题常常导致程序出现不可预期的行为,甚至崩溃。为了克服这些困难,我花费了大量时间学习线程同步的相关知识,包括锁机制、信号量和条件变量等。
在实际编程中,我逐渐学会了如何通过合理的锁机制来保证线程安全,同时尽量减少锁的粒度以提高程序的并发性能。例如,在设计电梯调度系统时,我需要确保每个电梯的状态在多个线程间是一致的,同时还要保证调度算法的高效性。通过多次的尝试和调试,我逐渐掌握了如何平衡线程安全和性能之间的关系,设计出了一个较为稳定和高效的电梯调度系统。
第三和第四单元的学习则主要集中在JML和UML的应用上。JML是一种形式化规格语言,它允许我们在代码中直接嵌入行为规范,通过这些规范可以在编译时进行检查,从而大大提高了代码的可靠性和可维护性。在学习和使用JML的过程中,我逐渐意识到明确的行为规范不仅可以帮助我们发现和修正代码中的潜在错误,还可以作为文档,帮助其他开发者理解代码的意图和设计。
UML则是一种通用的建模语言,通过各种图形化工具,可以直观地描述系统的结构和行为。例如,在设计复杂系统时,我可以通过类图来描述系统中的类及其关系,通过时序图来描述对象之间的交互过程,通过状态图来描述对象的状态变化等。这些图形化工具不仅帮助我理清了系统的结构和行为,还大大提高了团队协作的效率。在实际项目中,通过UML图可以让团队成员更加直观地理解系统的设计,从而减少了沟通成本,提高了开发效率。