BUAA_OO_Unit3总结
一、整体概述
JML(Java Modeling Language) 是用于对 Java 程序进行规格化设计的一种表示语言,它对于方法内部具体是如何实现的并无要求,只是对方法的接口以及行为进行限制,具体来说就是对方法里面允许接受的数据,可以做出的改动,必须返回的数据,异常表现等进行限制,最终保证方法的无二义性。
本单元的作业背景是一个简单的社交系统,允许对数据进行有序存储,建立数据之间的关系,以及精确查询,由于已经给出了JML规格,所以并不需要自己从零开始设计架构,只用把需要实现的方法按照JML规格实现即可,在实现的过程中必须特别注意方法的复杂度。
二、测试
-
性能测试:构造菊花图、完全图等数据测试程序性能
-
正确性测试:随机生成数据,与同学对拍
三、设计思路
第一次作业
对于qci指令使用的并查集维护,并进行路径压缩,我选择用HashMap来存储关系,value所对应的id是key值对应id的父节点。
第二次作业
本次作业中需要完成最小生成树,选用了Kruskal算法实现。取出id所在的连通块,初始时联通块的每个点都是一个划分,每次都取出value最小的关系,并将两个划分合并,直到连成一个划分。
第三次作业
未完成
四、性能问题和修复情况
在最后一次作业中,测试中发现ArrayList的contains方法耗时很多,在同学建议下改为HashMap/HashSet,查询速度快了很多。
五、Network拓展
-
PPT
内容: -
假设出现了几种不同的
Person
-
Advertiser
:持续向外发送产品广告 -
Producer
:产品生产商,通过Advertiser
来销售产品 -
Customer
:消费者,会关注广告并选择和自己偏好匹配的产品来购买 -- 所谓购买,就是直接通过Advertiser
给相应Producer
发一个购买消息 -
Person
:吃瓜群众,不发广告,不买东西,不卖东西 -
如此
Network
可以支持市场营销,并能查询某种商品的销售额和销售路径等 请讨论如何对Network
扩展,给出相关接口方法,并选择3
个 核心业务 功能的接口方法撰写JML
规格(借鉴所总结的JML
规格模式)
-
核心业务方法
-
生产产品
/*@ public normal_behavior
@ requires !(\exists int i; 0 <= i && i < getPerson(personId).products.length; getPerson(personId).products[i].getId() == id);
@ assignable getPerson(personId).products ;
@ ensures (\forall int i; 0 <= i && i < \old(getPerson(personId).products.length) ;
@ getPerson(personId).products[i].getId() == id );
@ ensures getPerson(personId).products.length == \old(getPerson(personId).products.length) + 1 ;
@ ensures getPerson(personId).hasProduct(id);
@ also
@ public exceptional_behavior
@ signals (EqualAdvertiseIdException e) (\exists int i; 0 <= i && i < getPerson(personId).products.length;
@ getPerson(personId).products[i].getId() == id) ;
@*/
public void addProduct(String personId, Advertisement id);
-
Customer 中
sendRequest
/*@ public normal_behavior
@ requires (messages.length > 0 && preferences.length > 0);
@ assignable nothing;
@ ensures (\forall int i; (0 <= i && i < messages.length) &&
@ (messages[i] instanceof Advertise) &&
@ (\exists int j; 0 <= j && j < preferences.length;
@ preferences[j] == ((Advertise)message[i]).getPreference);
@ (((Advertise)message[i]).getAdvertiser.sendRequest(message[i])));
@*/
public void sendRequest();
/*@ public normal_behavior
@ requires existProduct(product);
@ ensures \result == (product.getPrice * (\sum int i; 0 <= i && i <= people.length;
@ isCostomer(people[i]) ? people[i].queryAmount(product) : 0))
@ also
@ public exceptional_behavior
@ requires !existProduct(product);
@ signals (ProductNotFoundException e) !existProduct(product);
@*/
public int querySales(Product product) throws ProductNotFoundException;
六、心得体会