BUAA_OO_Unit3总结

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;

六、心得体会

在花费一些时间仔细阅读过JML语法规则,充分理解JML语句的含义后,完成作业就简单多了。在第二次作业我本学期第一次与同学对拍,一起验证程序的正确性和性能。在提升性能方面,学习了迪杰斯特拉的小顶堆优化,其他的性能优化就是看懂一句核心代码就能理解。经过这个单元,我熟悉了JML语法,之前自己阅读到别人的代码时,因为不了解别人的思路而无法理解,此时深刻地理解到统一规格对于合作开发的重要性,我在今后的学习中也会更加注意到自己代码的规格。

posted @ 2022-06-06 15:37  走马行川  阅读(16)  评论(2编辑  收藏  举报