OO Unit4 总结

钟昊翔-21231025 学生 2024-06-14 10:22:29

建模设计

架构

本单元采用了LibraryManager类来统一管理所有的请求,BookshelfAppointmentOfficeCirculationDestStudent类可以看做是存放图书的四个容器,同时支持存放和查询(是否存在图书和是否逾期)功能。

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
        ...
    }

类图

img

在本单元完成代码的时候,虽然是根据预先设计的UML模型进行了代码的编写,但是只有类的整体关系上比较符合,具体的方法实现可能与一开始设计的有些区别,有的方法可能用处不大最后被合并,有的方法可能较为复杂最后拆成两个。也可能某个类需要另一个类的接口,导致另一个类需要增加方法,或修改方法可见性等。

四个单元设计思维演进

第一单元主要是类的设计,考察在编写代码的时候,如何将同类的需求整合到一个类中,不同的需求分散到不同的类中,实现高内聚,低耦合。

第二单元在类与类之间的通信协作上是重点,主要考察了同步于互斥。这单元被死锁折磨的非常惨,最后的代码还有有死锁风险,OS学完这一章以后才明白同步与互斥的精髓。

第三单元则是聚焦于规格化,不再是自然语言的描述,而是改为了根据规格正向编写。好处是可以减少设计难度,难点则是在实现代码的时候要完全符合规格的要求,要阅读复杂的规格描述。

第四单元则是正向设计,需要再具体编写代码之前进行总体化的设计。

测试思维演进

第一单元主要是随机生成大数据,然后与标准结果进行对拍。

第二单元也是随机生成交互,之后采用模拟检测输出序列是否合法。

第三单元是与同学的代码进行对拍。

第四单元则是随机生成数据,与模拟系统进行交互。

课程总结

不知不觉为期16周(算上上个学期也可以说24周)的oo课程已经结束了,从上学期第一次接触java和面向对象的设计思路开始,现在已经在各种编程的过程中都开始运用这样的设计方法,让自己的代码更加有可读性,维护更方便。

感谢老师、助教在这段时间的付出。

...全文
77 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧