301
社区成员
发帖
与我相关
我的任务
分享本单元采用了LibraryManager类来统一管理所有的请求,Bookshelf,AppointmentOffice,CirculationDest和Student类可以看做是存放图书的四个容器,同时支持存放和查询(是否存在图书和是否逾期)功能。
Book类是对图书的模拟,包含书的基本信息和借还时间。
对于图书的移动操作和请求的保存全部在LibraryManager内完成,这样可以减少类直接的耦合。其中还保存了所有出现过的学生,这样可以对信用分和图书借还周期进行追踪。
public void handleCommand(LibraryCommand command) {
if (command instanceof LibraryOpenCmd) {
moveBooks(command.getDate());
} else if (command instanceof LibraryCloseCmd) {
// do nothing
} else if (command instanceof LibraryQcsCmd) {
queryCredit(command);
} else {
request = (LibraryReqCmd) command;
String studentId = request.getStudentId();
if (!students.containsKey(studentId)) {
students.put(studentId, new Student(studentId));
}
switch (request.getType()) {
case QUERIED:
queryBooksNumber();
break;
case BORROWED:
borrowBook();
break;
case ORDERED:
orderNewBook();
break;
case PICKED:
getOrderedBook();
break;
case RETURNED:
returnBook();
break;
case RENEWED:
renewBook();
break;
case DONATED:
donateBook();
break;
default:
break;
}
}
}
对于信用分的在图书逾期时候的扣除,我选择在开馆的时候统一结算。
private void moveBooks(LocalDate date) {
// handle overdue
students.forEach((name, stu) -> stu.handleOverdue(date));
// move books from appointmentOffice to bookshelf
...
// move books from circulationDest to bookshelf/bookCorner
...
// move books from bookshelf to appointmentOffice by appointmentList
...
}

在本单元完成代码的时候,虽然是根据预先设计的UML模型进行了代码的编写,但是只有类的整体关系上比较符合,具体的方法实现可能与一开始设计的有些区别,有的方法可能用处不大最后被合并,有的方法可能较为复杂最后拆成两个。也可能某个类需要另一个类的接口,导致另一个类需要增加方法,或修改方法可见性等。
第一单元主要是类的设计,考察在编写代码的时候,如何将同类的需求整合到一个类中,不同的需求分散到不同的类中,实现高内聚,低耦合。
第二单元在类与类之间的通信协作上是重点,主要考察了同步于互斥。这单元被死锁折磨的非常惨,最后的代码还有有死锁风险,OS学完这一章以后才明白同步与互斥的精髓。
第三单元则是聚焦于规格化,不再是自然语言的描述,而是改为了根据规格正向编写。好处是可以减少设计难度,难点则是在实现代码的时候要完全符合规格的要求,要阅读复杂的规格描述。
第四单元则是正向设计,需要再具体编写代码之前进行总体化的设计。
第一单元主要是随机生成大数据,然后与标准结果进行对拍。
第二单元也是随机生成交互,之后采用模拟检测输出序列是否合法。
第三单元是与同学的代码进行对拍。
第四单元则是随机生成数据,与模拟系统进行交互。
不知不觉为期16周(算上上个学期也可以说24周)的oo课程已经结束了,从上学期第一次接触java和面向对象的设计思路开始,现在已经在各种编程的过程中都开始运用这样的设计方法,让自己的代码更加有可读性,维护更方便。
感谢老师、助教在这段时间的付出。