BUAA_OO_2024 Unit-4总结

BUAA OO Unit4 Summary

1. 正向建模与开发

在面对象编程中,正向建模与开发是指从需求分析到系统实现的一种开发方法;这一方法强调从问题出发,从初步建立起模型描述系统结构、行为与关系开始,一步步过渡到可执行的代码。

在第四单元作业的三次迭代作业中,我们依次体验了UML类图、状态图到顺序图三种正向开发模型,在此基础上进行程序开发设计。由于初次体验正向开发,我并没有严格先画出相应准确地UML图,而是在markdown, staruml等工具上勾勒出了满足本次作业需求的大致框架,再随着程序开发的推进调整整体架构。

总的来说,虽然能力上尚不足以满足完全正向开发的要求,但我也部分地体验到了正向建模与开发的思想与方法。

2. Unit4架构设计

2.1 UML类图

最终版unit4的uml类图

在这里插入图片描述

2.2 UML状态图

描述了模拟图书馆系统中Book的状态转移

在这里插入图片描述

2.3 UML顺序图

描述了在图书管理系统中Student借阅书籍的基本流程

在这里插入图片描述

2.4 架构设计说明

2.4.1 Library设计说明

本单元的任务具体编程任务是按照要求设计一个图书馆的管理系统;整个图书管理系统的核心逻辑放在了Library.java类中,其唯一public方法很好地说明了整个系统的处理思路;后续面对新增要求,只需增加相应的handle方法即可——

public void handleCommand(LibraryCommand command) {
    if (command instanceof LibraryReqCmd) {
        switch (((LibraryReqCmd) command).getType()) {
            case RETURNED:
                handleReturnRequest((LibraryReqCmd) command);
                break;
            case BORROWED:
                handleBorrowRequest((LibraryReqCmd) command);
                break;
            case PICKED:
                handlePickRequest((LibraryReqCmd) command);
                break;
            case ORDERED:
                handleOrderRequest((LibraryReqCmd) command);
                break;
            case QUERIED:
                handleQueryRequest((LibraryReqCmd) command);
                break;
            case RENEWED:
                handleRenewRequest((LibraryReqCmd) command);
                break;
            case DONATED:
                handleDonateRequest((LibraryReqCmd) command);
                break;
            default:
                break;
        }
    } else if (command instanceof LibraryOpenCmd) {
        setDate(command.getDate());
        punishOverdue();
        arrangeBooksBackToShelf();
    } else if (command instanceof LibraryCloseCmd) {
        prepareOrderedBooks();
    } else if (command instanceof LibraryQcsCmd) {
        handleQueryCreditScore((LibraryQcsCmd) command);
    }
}

本着充分尊重作业文档说明的图书馆运行规则,设计了AppointmentOffice, BookDriftCorner, BookShelf, BorrowAndReturnOffice四个类模拟对应图书馆的四大部门;本质上来说,这四个类都是一个放置书的容器,提供相应放入、查询、取书的接口即可,以BookShelf为例:

public class BookShelf {
    private final HashMap<LibraryBookId, Integer> inventory = new HashMap<>();

    public BookShelf(Map<LibraryBookId, Integer> inventory) {
        this.inventory.putAll(inventory);
    }

    public void removeOneBook(LibraryBookId bookId) {
        inventory.put(bookId, inventory.get(bookId) - 1);
    }

    public void addOneBook(LibraryBookId bookId) {
        inventory.put(bookId, inventory.getOrDefault(bookId, 0) + 1);
    }

    public int getBookCount(LibraryBookId bookId) {
        return inventory.getOrDefault(bookId, 0);
    }

    public boolean noSuchBook(LibraryBookId bookId) {
        return inventory.getOrDefault(bookId, 0) == 0;
    }
}
2.4.2 BorrowManager

该类负责对图书借阅、预约过程中一些略显复杂、抽象的逻辑进行统一封装控制,以期代码拥有更加良好的可读性与模块化;其主要负责的功能:

  • 维护借阅历史(borrowHistory),尤其是根据借阅日期维护截止日期(dueDate),以便开闭馆时检查用户借阅是否逾期;
  • 维护图书借阅次数(borrowedTimes),以便后续非正式图书转正操作;
  • 维护逾期归还的惩罚历史(punishments),避免开闭馆整理时重复扣除信誉分

在BorrowManager的加持下,Library中的handle族函数逻辑就十分清晰了

3. OO学习思维演进

  • unit1中,基于表达式展开这一核心任务,我重点学习了“层次化设计”的思想;
  • unit2与其他单元相比与众不同之处在于存在很大的知识点空缺——多线程有关知识的学习也占了该单元很大一部分内容;我也是在oo的unit2中初步接触多线程编程的思想方法,尽管踩过许多坑送了不少分,最终也是收获颇丰;
  • unit3和unit4则偏向于进一步强调设计思维(规格化设计、模型化设计),编程本身的难度并不高

总的来说,尽管体量有大有小,但**“设计与构造”这一主题贯穿着课程的始终;而在理论课上,荣老师也在反复强调之中为我在学习过程中建立起了基础认知:真正的编程只占实际工作任务中很小一部分,最大难点在于编程前的设计**,而这也是优秀程序员区别于他人的真正分水岭之所在;幸运的是,我们的实验课程也在不断强化这一思维。

4. OO课程收获

本学期OO课程学习到此就告一段落了,在完成四个单元迭代练习的过程中,我了解到一般面向对象的开发模式,尤其是体会面向对象的设计思维与构造思想,深度体验了正确性、简洁性、可扩展性、性能之间的trade-off;这一路上没有太多惊喜也没有太多失望,但的确不失为一场回味无穷、收获满满的旅程~再见了,所有的面向对象!!!

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值