正向建模与开发
利用UML图形建模设计JAVA应用程序。
1. 类图设计:
- 确定类:识别系统中的主要类和对象。
- 定义属性和方法:为每个类定义属性和方法。
- 确定关系:确定类之间的关系,如继承、关联、聚合、组合等。
- 绘制类图:使用UML表示类及其关系。
2. 状态图设计:
- 确定初始状态:确定对象的初始状态。
- 定义可能的状态:识别对象可能处于的所有状态。
- 定义状态之间的转换:确定对象从一个状态转换到另一个状态的条件。
- 绘制状态图:使用UML表示状态和状态之间的转换。
3. 顺序图设计:
- 识别对象:确定用例中涉及的对象。
- 定义消息传递顺序:定义对象之间的消息传递顺序,包括方法调用和返回。
- 绘制顺序图:使用UML表示对象之间的交互过程,显示消息的传递顺序。
步骤:
- 根据类图设计创建Java类。
- 使用状态图定义对象的状态和状态转换。
- 使用顺序图描述对象之间的交互。
- 类图描述了静态结构,状态图描述了动态状态变化,顺序图描述了对象之间的交互过程。
- 在代码实现中,确保保持类与类图中的定义一致,状态转换与状态图一致,对象交互过程与顺序图一致。
这样,我们就可以基于这些设计开发出符合需求的Java应用程序。
第四单元架构设计
任务目标:
完成一个简单的图书管理系统,可以实现借书、还书、查询、预约和取书操作,并且需要对图书进行整理。
UML类图:
LibraryManager 图书馆管理类
BorrowAndReturnOffice 借还处
AppointmentOffice 预约处
BookDriftCorner 图书漂流角
Student 学生类
数据统一由LibraryManager进行处理,parseCommand方法对指令进行解析:
public void parseCommand(LibraryCommand command) {
LocalDate date = command.getDate();
if (command instanceof LibraryOpenCmd) {
info.clear();
moveBook(date);
} else if (command instanceof LibraryCloseCmd) {
info.clear();
LibrarySystem.PRINTER.move(date,info);
} else {
if (command instanceof LibraryReqCmd) {
LibraryReqCmd request = (LibraryReqCmd) command;
LibraryRequest.Type type = request.getType();
String studentId = request.getStudentId();
if (!students.containsKey(studentId)) {
Student student = new Student();
students.put(studentId,student);
}
switch (type) {
case QUERIED :
queryBook(command);
break;
case BORROWED :
borrowBook(command);
break;
case RETURNED :
returnBook(command);
break;
case ORDERED :
orderBook(command);
break;
case PICKED :
pickBook(command);
break;
case RENEWED:
renewedBook(command);
break;
case DONATED:
donateBook(command);
break;
default:
}
} else if (command instanceof LibraryQcsCmd) {
String studentId = ((LibraryQcsCmd) command).getStudentId();
if (!students.containsKey(studentId)) {
Student student = new Student();
students.put(studentId,student);
}
queryBook(command);
}
}
}
架构较为简洁清晰且具有可扩展性。
四个单元中架构设计思维的演进
第一单元任务是对复杂表达式进行计算化简。在第一单元中我们初步接触了模块化层次化设计,初步形成了面向对象编程的思维。在将具体任务抽象为代码架构这一步往往是需要不断尝试的,我在实践的过程中逐步地加深了对模块化设计的理解。
第二单元任务是电梯调度,对多线程的考察。我们需要对各个线程之间共享对象进行加锁,可以通过UML类图来清晰地了解类之间的关系,从而完成同步和互斥。
第三单元主要内容为JML和契约式编程,JML训练了我们规格化编程的思维,同时减少了架构设计的内容。
第四单元通过UML类图、状态图、顺序图的设计进行代码的编写,让我体会到了架构设计对于程序的重要意义,它为程序编写理清思路,将任务分解为不同的组件和模块,定义不同类之间的关系,提高开发效率和质量。
测试思维的演进
第一单元的测试我对表达式之间的乘法和加法运算和表达式合并进行了测试,若每个子模块都能实现既定的效果则程序运行出错的概率就较低。
第二单元的测试重点在线程之间的同步和互斥,不同线程之间对共享对象的访问可能会出现冲突,造成死锁或错误,而由于任务较为复杂,线程之间出现冲突的可能情况非常多,因此需要进行充分的测试。
第三单元我们进行了JUnit测试,对三个方法分别进行了测试,让我对JML中前置条件,后置条件和不变量有了更深的理解,并且切实体会到了白箱测试与黑箱测试的意义。
第四单元的输入输出具有交互性,让我接触到了交互性测试。
总结课程收获
本学期的OO课总体来讲还是很有意义的,让我真正学会了很多知识,切实提高了代码能力和抗压能力。
课程设置较为合理,有学习体验,感谢课程组的辛苦付出。
本学期的学习让我体会到了何为面向对象编程,在今后的学习生活中我也会继续培养层次化模块化编程的思维,提升代码能力。非常感谢室友和助教的帮助(●♡ᴗ♡●)。