301
社区成员
发帖
与我相关
我的任务
分享本单元聚焦于UML正向建模与设计。我对正向建模的理解是程序员首先根据需求画出UML图,画出主要的类与方法,然后再根据UML图完成代码。在完成代码的过程中,代码和UML图提供了程序的具体实现和抽象的对照,为程序员增添模块,增添功能以及debug提供便利。
具体而言,对于类图,我们主要需要确定程序中需要哪些类,类中有什么属性以及类与类之间的关系。对于状态图,我们关注的是图书状态(即位置)的转换。对于顺序图,我们关注的是信息的传递和处理,也即图书馆中的某一模块何时需要处理图书,如何处理图书。
在本次作业中,我先是根据要求大概画出类图(只包含类名,一些必要的属性以及类与类的关系)并把输入的框架搭好,然后再根据作业的需求实现具体的函数。有了UML图的对照,我对程序的架构认识也更加清晰,写起来也更加顺利。


第三次作业架构与第二次作业的基本一致。
其具体功能分别是:
MainClass类接收输入并分发给MyLibrary类
while (true) {
LibraryCommand command = SCANNER.nextCommand();
if (command == null) {
break;
}
date = command.getDate();
if (command.getCmd().equals("OPEN")) {
myLibrary.open(command.getDate());
myLibrary.arrangeBook(false);
} else if (command.getCmd().equals("CLOSE")) {
myLibrary.arrangeBook(true);
} else if (command instanceof LibraryQcsCmd) {
myLibrary.queryCredits((LibraryQcsCmd)command);
} else {
myLibrary.parseRequest((LibraryReqCmd) command);
}
}
MyLibrary类里根据指令类型分发给对应的处理函数
public void parseRequest(LibraryReqCmd cmd) {
LibraryRequest.Type requestType = cmd.getType();
switch (requestType) {
case QUERIED:
parseQuery(cmd);
break;
case BORROWED:
parseBorrow(cmd);
break;
case ORDERED:
parseOrder(cmd);
break;
//...
//...
为书本可以存在的位置(书架、预约处、借还处、用户)建立对应的类以及处理逻辑
由于我们需要知道用户是什么时候借的书,所以对于用户手上的书需要使用包含借书时间的MyUserBookId将原来的LibraryBookId封装一下
同样,预约处的预约要包含时间信息,BookId和User。所以使用Appointment封装。
类图不算繁琐,架构比较清晰,也比较好拓展。写完后我才发现,其实从UML图上就可以大致判断这个程序的可拓展性如何。从UML图中可以看出图书馆与其模块是has-a的关系,对于新增模块只需要把新模块需要的信息与BookId封装好,再写上新模块所需要的逻辑就行。不过需要注意的是,封装与拆分应该尽量在类里面完成,这样才能做到高内聚,避免不同类型的封装在"图书馆"里流转。
我的测试主要分为四个阶段
对我来说OO课程的收获主要有两点。
一是在研讨课及交流群中讨论题目思路、分享架构、讨论bug的过程中认识了许多非常热心非常乐意解答问题的同学,而与人交流。同时也了解了不同同学解决思路的不同,从中认识到自己做的好和不好的地方。如果以后的课程也有类似设置就好了
二是在一次次作业中感受到架构设计以及代码实现能力有了一些提升。从一开始的手足无措完全无从下手到能较为顺利的完成作业的大致框架,这离不开一次又一次作业的锻炼。
OO是一门非常完备的课程。从弱测、中测、强测再到研讨课,能够感受到老师和助教都付出了极大的心血和努力。感谢所有老师、助教和同学们的帮助!