301
社区成员
发帖
与我相关
我的任务
分享利用 UML 图形建模来全面设计和实现 Java 应用程序,我们可以逐步进行以下流程来设计和实现 :
通过以上步骤,可以利用 UML 图形建模来全面设计和实现 Java 应用程序,并在开发过程中充分考虑系统的功能、动态行为和状态变化,从而提高系统的质量和可靠性。



最初根据作业要求有了第一版的设计构想

之后的设计也大致围绕着这个展开,并在此基础上有一定的修改
这次作业主要新增了一个图书漂流角,相应的增加了图书捐赠,转正,非正式图书等操作。另外的一个内容有关书籍借阅期限,需要在归还时判断是否逾期,且要支持续借操作。
在架构上的变化最大的就是加入了drift,即图书漂流角类。其与Bookshelf类较为相似。
同时书籍的属性有了更多的变化,对于正式图书与非正式图书在预约,借阅等操作时需要不同的处理。
需要注意的是这次作业对整理有了一定的要求,在开馆对应的整理后,借还处不应该有书,预约处不应该有逾期的书。最开始忽略了这个条件导致了一些错误。
这次作业增添的内容也并不多,主要是引入了信用分机制。
因此用户会新增信用分属性。并且为了满足加减信用分的操作,捐献书籍需要知道对应的捐献者。最困扰我的其实是关于涉及多个信用分同时加减的操作时的先后顺序。好在经过讨论区与指定书的阅读搞清楚了相关顺序。
本单元三次作业都没有出现bug,也算是完美收官(前面几个单元有点菜了 (ಥ_ಥ))
这种追踪关系在我看来主要应该是指UML模型中的各种元素(如类、对象、关系、行为等)与代码中的相应构造之间存在着映射关系。例如,UML类可以直接映射到代码中的类,类之间的关联关系可以映射到代码中的成员变量或方法调用关系等。这样能够保证UML模型设计和代码设计的一致性,使得通过UML模型所描述的系统结构、行为和交互能够在代码实现中找到对应的体现。
最后回顾一下我最终的代码设计和UML模型设计,两者之间的追踪关系还算结合的不错,但还是存在着一些没有考虑到的地方。
在UML模型的设计中,主要的类和类主要的属性与方法我都有考虑到,并且在代码中都有相应的实现。但是有一些细节的方法实现在一开始我是没有考虑到的,是在代码编写的过程中发现可以做出简化或者必要的方法。这也说明了UML模型设计并不是从一开始就能够设计得十全十美,也会有考虑不周到的地方,在代码实际开发过程中也可以做出修改。
UML模型设计是代码设计的前置工作,它为代码设计提供了指导和依据。但是在软件开发过程中,需求和设计可能会发生变化,导致UML模型和代码设计需要进行相应的调整。因此,需要确保UML模型和代码之间的变更是同步的,对代码的修改也应该能够更新到UML模型中。
建立代码设计和UML模型设计之间的追踪关系也有着重要作用:
在这一个学期OO课程的学习中,架构设计思维确实经历了不少演进(*/ω\*)
第一个单元是训练目标是层次化设计。(在之后的单元中也都有用到)
既然要有层次,必然涉及多对象,层次化设计在我看来其实是一种对对象的管理方式。在第一单元的学习中,我加深了类的层次化设计的理解,针对目标应用情景我们应该如何建类,这些类之间有什么关系,这些类分别要负责什么工作,等等,这都是我们需要考虑的内容。
在层次化设计中十分重要的一环就是抽象层次设计,对于一个应用场景,其层次可能并不是十分清晰明了,需要我们去分析各个对象,提取共性,完成分层。抽象层次设计考验了我们对继承和接口的理解与运用,其对我们的设计与架构有着重要作用:
第二个单元的训练目标是线程安全设计(也是令我有些痛苦的单元 o(TωT)o )
线程安全是一个重要的对象特性,对象共享是产生线程安全问题的根本原因。
在考虑线程安全设计时,主要关注几个问题:
对象
使用不可变对象
使用final来强制限制对属性成员的修改
要小心对可变对象的引用
使用可变对象
操作的原子性
共享对象要始终处于严密控制之下
避免不受控的对象发布
设置范围适当的临界区
使用合适的监控器monitor
临界区
临界区和监控器的匹配
经验原则:临界区中代码围绕监控器对象开展工作
如果临界区代码不访问监控器(而访问其他共享对象),则无法获得安全保护的效果
临界区最小化
如果一个临界区中某行代码不访问monitor,应把相应的代码移出临界区
如果临界区中某行代码仅访问monitor中的不可变数据,应把相应的代码移出临界区
确保线程安全的设计,归结起来,三个关键要素
控制对象发布和共享
复杂的对象引用和共享是导致程序死锁或数据竞争的主要原因
共享对象设计为线程安全类
访问共享对象的类无需额外采取同步控制措施
同步控制范围不宜过大,性能与安全的平衡
读写锁一般可以获得更好的性能
保持简洁的线程类
run方法只负责顶层的控制逻辑
不去管理具体业务数据
不要让一个线程对象去访问另一个线程对象
第三单元聚焦于规格化设计
规格化设计是一种致力于保证程序正确性的方法,其正确性的含义是——在规定的输入范畴内给出满足规定要求的输出,即“你”如果能够保证前置条件成立,“我”就能保证后置条件成立。
主要从两方面来看,一个是类规格,一个是方法规格。
类规格定义了与用户的契约,包含数据规格(类所管理的数据内容,及其有效性条件(invariant, constraint))和方法规格(类所提供的操作,权利+义务+注意事项)。类规格定义了开发人员必须实现的规约——实现数据内容并确保始终有效,任意一个方法的实现都不能破坏对象的有效性,任意一个方法的实现都要满足方法本身定义的规约。
方法规格是一个方法与其用户交互的契约(契约:权利+义务+注意事项)
义务:用户要保证提供有效的输入以及有效的对象状态
权利:用户能够获得满足确定条件的输出结果
注意事项:方法执行过程中可能会修改用户对象的状态
方法规格是一个方法对实现者做出的规约要求(规约:前置条件+后置条件+副作用)
前置条件:实现者可依赖的初始条件
后置条件:实现者如何提供满足要求的结果
副作用:不去做多余的事情
第四单元也正如前几部分所体现的一样,讲求的是模型化设计。
模型化设计,顾名思义,使用系统化的模型语言来表示设计结果,进而开展设计思考。其最需要,也是最考验的能力就是抽象能力。抽象是建模中的最重要方法,重点在于要忽略细节,抓住本质。
重点内容在前面第四单元的总结中也都有所谈到,就不再赘述了。
总体来看,四个单元,每个单元侧重训练的设计思维都有所不同,但都是面向对象中在设计层次重要的一环。在一次次单元训练中,我的设计思维也逐渐变得更加完善,能够更全面综合的来思考问题了。
每个单元的测试都给我带来了一些新的思考
第一单元我测试主要是靠手搓样例。关注的点主要是一些特殊点测试和边界测试。
第二单元依靠了一下佬的评测机,所关注的测试策略加入了高并发测试
第三单元由于有Junit测试的要求,就顺便自己手搭了一个简陋的评测机进行测试。这一单元加深了对黑箱和白箱测试的理解
第四单元在测试策略上没有什么大的变化,但是接触到了一种新的测试方式,交互性测试,根据程序上一步做出的输出来决定下一步的测试输入。
其实总体来说,每个单元的测试都有些相同的地方,前面所列出的只是在每个单元中重点关注的方法,但是通过这一学期课程的学习,在测试上面也是有了更多的心得与思考吧。
::.--.-.::
:( ( ):::::
(_, \ ) ,_):: |
:::-'--`--:::::::: ~~| , \ _ /
::::::::::::::::::: ,|`-._/| -== (_) ==-
::::::::^^::::::::.' | /||\ / \
::::::^^::::::::.' | ./ ||`\ |
:::::::::::::::/ `-. |/._ || \
::::::::::::::| || || \
~~=~_~^~ =~ \~~~~~~~'~~~~'~~~~/~~`` ~=~^~
~^^~~-=~^~ ^ `--------------'~^~=~^~_~^=~^~
这幅画很好的概括了我OO课的体验,历经艰苦,卒有所闻。
这一学期的OO课体验确实是跌宕起伏。从第一次作业直接强测报表,未进互测,完美开局,到最后一次作业被OS挤占,只能一天搞定,再加上中间数不清楚的苦和泪,可以说是幸好能够“熬过”整个OO课,脱离苦海。
要说收获的话,确实一时不知道从何说起,也许是太多方面,太多内容了。无从下口。从面向对象思想本身到其具体的实现,从应用情景的分析到代码架构的设计,从编写代码的能力到测试代码的能力.........o(≧口≦)o不说了。
最后感谢CCTV,感谢MTV,
最后感谢课程组,感谢助教,感谢评测机佬,感谢互测空刀我的同学,感谢每一个给予我帮助的人!
(づ。◕ᴗᴗ◕。)づ