301
社区成员
发帖
与我相关
我的任务
分享总结本单元所实践的正向建模与开发
在正向建模的过程中,我第一次选择详细设计程序再进行实现的方法完成项目,深受启发。
正向开发的过程中,我设计了整个项目的基本构成,包括应该实现哪些类,分别执行哪些功能,管理哪些数据等等,在这个简单的构架上,开始详细设计内部的方法。方法会使用到不同的数据,这带来了不同对象之间的关联关系,不同数据需要不同的处理方式,所以逐步确定了数据类型。正向建模的过程是最漫长的,这是因为项目的架构经历了由粗到细的设计过程,数据的类型、方法使用的变量都不能在一开始就决定,而是在设计中逐渐发现问题并修改,同时架构设计也需要做相应的修改。
完成建模后,剩余的开发任务十分轻松,只需根据项目架构设计完成代码即可。本单元作业不存在对性能的要求,也不存在时间复杂度苛刻的算法设计,函数的功能也比较简单,一旦完成了任务设计就只需通过简单的数组插入查询功能实现函数。整个项目的关键就在于事前设计系统完成任务要求。此外,系统的功能之间较为独立,查询、借阅、还书等功能可以分别实现,分解为子任务后进一步降低了设计难度。
相比于不涉及UML图而直接开发程序,正向建模开发的优点在于可以避免重构,浪费代码开发。在设计的过程中,可以直接发现系统设计的不合理,极大程度避免了重复实现代码。而且,先画UML图确保在开发前完整地设计整个系统,如果仅通过概念图等方式思考项目设计,很难保证整个系统是充分思考的,也不能保证所有的函数功能都经过完整的设计,在具体开发过程中还是可能产生bug,导致代码需要重新实现。
总结本单元作业的架构设计,并对比分析最终的代码设计和UML模型设计之间的追踪关系
本单元的任务是实现一个图书馆管理系统,作为程序的起点和整个项目的场景,应当设计Library类作为Main函数。Library类可以接受不同的请求并予以实现,根据请求开闭馆。为了在Library中处理请求,所以需要一个管理员类来管理图书馆数据、用户数据和多种请求。根据现实逻辑,管理员应当能够查看数据、借还处、预约处和漂流角的书籍存放情况并在开闭关阶段进行整理,管理员应当管理用户数据库,每个用户应有独立数据,储存用户的借阅情况和信用点数。据此,需要增加用户类。同时,为了储存不同类型的数据,如借阅信息,漂流角书籍信息,都应该自定义类来存储实现。整个系统的架构根据现实逻辑实现,围绕管理整个图书馆的管理员来实现不同请求的处理和数据的存储。
最终的代码设计严格根据UML模型设计,但在实现的过程中存在个别错误,对UML反向进行了修正。
总结自己在四个单元中架构设计思维的演进
在第一次作业中,我使用了大量简单实现功能的方式,后果是无法进行迭代开发,要求稍作改变即需要重构,这一过程让我认识到架构的合理性非常重要,事关后续任务能否轻松完成。同时,很多架构经历了重构,这并非由于没有留出足够的扩展空间,而是系统的架构本身就不合理,这让我开始改变先写代码,后思考架构的习惯,转为先花时间思考系统如何完成,再着手进行操作。
在代码实现的过程中,我也发现很多函数方法过于冗长,不同类执行的功能有重叠重复,逐渐开始进行封装,明确每个函数的功能,并准确定位类的功能,确保不同的类负责不同任务,使函数清晰易懂,系统做到高内聚低耦合。第二单元中,减少了很多第一单元出现的问题,让调度器来分配人员,让电梯只负责执行物理动作等等,都是这种思维的体现。
在第三单元中,我在阅读JML代码的过程中学会了在设计阶段就通过形式化方法对系统进行规范化描述,确保设计的正确性和可验证性。第三单元的架构是整体性的,在程序开发之初就有了整个系统的指导,在阅读中可以不断感受提前设计架构的优点。并且在第四单元中实践了先设计后实现的优点。
总结自己在四个单元中测试思维的演进
最初。我的测试思维主要集中在基本功能测试上,通过手工编写测试用例来验证递归解析字符串的正确性。以及意识到测试边界条件的重要性,编写了一些特殊情况的测试用例,并使用大量数据随机进行测试。后来,通过使用JML进行形式化规格说明和Junit训练,我了解到如何进行单元测试。不同于对整个程序进行测试,JML的契约和JUnit的测试方式让我学到了对整个系统中的个别函数进行测试,这是一种全新的测试方式。最终在第四单元,我得以结合系统的功能测试和个别函数的单元测试,重复测试整个系统。
总结自己的课程收获
在第一个单元中,我深入理解了递归的基本原理,尤其是如何将一个复杂问题分解为更小的子问题,以及如何设定基准条件来终止递归,递归的退出条件需要严格的设计。
在第二个单元中,我学习了如何使用synchronized关键字和Lock对象来实现线程的同步,避免资源争夺导致的不一致性问题。掌握了如何在Java中创建和管理线程,包括线程的生命周期和常用方法。
在第三个单元中,我理解了形式化规范的概念及其重要性,通过JML编写和验证代码规格,提高了代码的可靠性和可读性。也学习了如何使用JML工具进行代码规范的验证,确保代码行为符合预期。掌握了代码契约(前置条件、后置条件和不变式)的编写和应用,使得代码的设计更为严谨。
最后一个单元中,我掌握了UML的基本概念和图示类型,包括类图、对象图、序列图、用例图等。通过UML图示进行系统分析和设计,提升了对系统结构和行为的整体把握能力。也提高了我正向开发的能力,通过先设计后开发,来提高效率,避免重复的代码浪费。
在整个OO课程中,尤其是在多次迭代的过程中,我认识到了系统设计的重要性,因为在实现和迭代的过程中会反复遇到多种缺陷,很多问题是因为程序设计之初而留下的隐患,包括架构设计不合理或者没有为扩展留出足够的余地,或者通过某些简单算法实现了任务,却牺牲了扩展性等等,这让我深刻认识到提前将系统想清楚再动笔是多么的重要。
在整个OO课的过程中,我不断加深了对面向对象的理解,包括将数据和行为封装在一个对象内部,并通过公开的接口进行访问,从而实现对数据的保护和隐藏。通过继承来实现代码的复用和扩展,使用常用的设计模式,如单例模式、工厂模式、观察者模式等,大幅度提高了我的编程能力。