OO课程总结
正向建模总结本单元使用UML的方式,引导我们开展正向建模。从实际体验而言,正向建模对我的感受很奇怪:由于类图设计过程中只泛泛地写方法和成员,而没有考虑实际实现,导致在设计时很难评判自己建模方案的优劣性和可行性。从个人角度还是比较习惯直接写代码的过程,但是本单元使用正向建模后,架构在每次迭代中,相较于前几个单元变化极小(不过由于题目不一样也没什么可比性)。 架构设计类图 类图看似简单,其实内部还是有一定的思考的。 第一次迭代本单元目标是实现一个图书管理系统,需要模拟图书的位置,开馆闭馆和用户借阅等一系列规则。在架构设计方面,本单元最值得一提的是关于图书馆的不同部位(书架,归还处,预约处,用户)应当怎么管理。 一个比较清晰的方案是,将不同的地方单独建类,每个类提供方法进行书籍的移动。 这个方法最为直观,但是可以优化:由于这四个地方具有很多公共方法,因此可以直接建立一个 bookContainer 作为这四个方法的父类进行管理。 这个方法最大的优点是:架构清晰,可迭代性强。 但是考虑到 bookContainer 这样一个容器类,其没有很复杂的方法需要实现(例如 U1 Poly 的...
OO第三单元总结-社交网络
题目回顾:本单元的题目较为特殊,有着较少的题目描述,主要题目靠 JML 间接提供。我会将题目和官方包放在 [github 仓库](s7777777h/BUAA-OO: buaa oo 个人代码 (github.com))中,这里不过多赘述。 第一次作业:建立一个较为朴素的社交网络,维护人际关系的整个图。 第二次作业:在网络中引入公众号和文章的概念,每个人可以加入公众号贡献文章,也可以接收文章。 第三次作业:引入消息和emoji的概念,每个人可以发送不同类型的消息,同时emoji消息会给emoji增加热度,需要进行发送Message操作和维护emoji操作。 架构设计存储方式本次作业中选取恰当的容器较为重要。对于 Unit3 而言含 id 对象使用 HashMap<Integer, Object> 较为合适,对于可重复的对象使用 HashMap<Integer, ArrayList<Object>> 较优。 对于 receivedArticle...
OO第二单元总结-电梯调度
题目回顾第一次题目有 6 部电梯,在某些时间节点,会有一些乘客发出请求:乘坐指定电梯 e,从楼层 x 到楼层 y,且每个乘客有一个优先级 p。当电梯开门,关门,到达任一楼层,乘客进出电梯时,需要输出特定的信息。每一部电梯的移动速度给定,同时电梯的开关门之间有一定的时间间隔。目标是将所有乘客送到目的地(正确性),且使得系统总运行时间,乘客优先级加权等待时间,电梯耗电量(与开关门次数和移动次数有关)最小化。 第二次迭代乘客不再指定乘坐哪一部电梯,而是由系统自行决定。同时,新增临时调度(SCHE) 事件,要求指定电梯以特定移动速度,从楼层 x 移动到楼层 y ,到达 y 后使所有乘客离开,关门并等待一秒,结束临时调度事件。SCHE-BEGIN 必须在输入 SCHE 后短时间内输出(不能有两次 ARRIVE)。临时调度期间不能有 RECEIVE和中间楼层的开关门。 同时,新增了 RECEIVE 约束,当将乘客分给某个电梯时,要输出一条分配信息,当电梯没有任何的 RECEIVE 时,电梯不能移动(防止自由竞争策略)。 RECEIVE 的解除有两种情况:当乘客离开电梯时会解除其的...
多线程Debug经验分享
OO多线程 debug 经验分享前情提要本人4月4日晚上 debug 写到了4月5日凌晨三点,睡前以为修好了bug,在自己评测机上跑了6000组数据,结果第二天起床发现6000组数据中跑出了3个bug,又改到4月5日晚上六点终于改好了(至少跑了3200组数据不成问题)。 这里分享一下这几天 debug 出的心得。 多线程debug - 基础版IntelliJ IDEA 中有一个强力的多线程分析工具 - 转储线程,这个功能可以在运行程序卡死时,查看每个线程的具体情况。我们以最经典的死锁为例。 12345678910public class Main { public static Object A = new Object(); public static Object B = new Object(); public static void main(String[] args) { DeadClass C = new DeadClass(A, B); DeadClass D = new DeadClass(B,...