规格化设计的调研


随着50年代高级语言的出现,编译技术不断完善,涌现出多种流派的语言,其中就有里程碑式的Pascal语言;进入70年代,由于众多语言造成的不可移植、难于维护,Ada程序设计语言诞生了,强调大型系统可读性胜于可写性,Ada程序自成清晰的文档;经过80年代计算机硬件和操作系统的改善,程序设计重点从算法和数据结构实现技术向规模说明方向转移。从空间的角度观察, 广义上来说, 软件规格说明描述的是整个软件系统;狭义来说, 软件规格说明描述的是软件系统的组成部件。从时间的角度来观察, 广义来说, 软件规格说明方法适用于整个软件生命周期; 狭义上来说, 软件规格说明方法仅适用于软件生命周期的特定阶段。规格化设计可以提高程序的可读性,也可以提高阅读效率,便于以后的修改。

规格bug


可能是我运气太好了,这几次都没被扣规格的bug……

改进写法


1. 前置条件

1.1 忽略前置条件

previous

  public int[][] getMatrix(Point dst){
  /**
   *@ REQUIRES: None
   *@ MODIFIES: visited, dist
   *@ EFFECTS: normal_behaver
          \result == the shortest distance between point(x,y) from point(x2,y2) ;
  */
  }

late

  public int[][] getMatrix(Point dst){
  /**
   *@ REQUIRES: !tmp.empty
   *@ MODIFIES: visited, dist
   *@ EFFECTS: normal_behaver
          \result == the shortest distance between point(x,y) from point(x2,y2) ;
  */
  }

1.2 前置条件不全

previous

  private void chooseTaxi(){
  /* *
  *@ REQUIRES: None
   *@ MODIFIES: \this.TarTaxi;
   *@ EFFECTS: \any int i=0;i<this.list.size;i++:!list.get(i).getTaxiState().equals(TaxiState.STOP)==> \target = list.get(i);
  */   }

late

  private void chooseTaxi(){
  /* *
  *@ REQUIRES: \this.taxi!=null&&\this.taxi is sorted by credit;
  *@ MODIFIES: \this.TarTaxi;
  *@ EFFECTS: \any int i=0;i<this.list.size;i++:!list.get(i).getTaxiState().equals(TaxiState.STOP)==> \target = list.get(i);
  */   }

1.3 范围错误

previous

public void taxiControl(int n) {
/**
*@REQUIRES: n>0 && n<100
*@MODIFIES: None;
*@EFFECTS: ......
*/
}

late

public void taxiControl(int n) {
/**
*@REQUIRES: n>=0 && n<100
*@MODIFIES: None;
*@EFFECTS: ......
*/
}

1.4 自然语言

previous

    private int loadMap(BufferedReader Reader) throws IOException{
/*
@ REQUIRES: in this method we load the map
@ MODIFIES: Map[][]
@ EFFECTS: \any char!=0&&char!=1 ==>System.out&&System.exit
\any somewhere not cross road but has light ==>System.out&&System.exit
*/
}

late

    private int loadMap(BufferedReader Reader) throws IOException{
/*
@ REQUIRES: File(path).exist
@ MODIFIES: Map[][]
@ EFFECTS: \any char!=0&&char!=1 ==>System.out&&System.exit
\any somewhere not cross road but has light ==>System.out&&System.exit
*/
}

1.5 格式错误

previous

public void run(Taxi t){
/*
@ REQUIRES: \t.status.equals(TaxiStatus.SERVING);
@ MODIFIES: None
@ EFFECTS: ......
*/
}

late

public void run(Taxi t){
/**
@ REQUIRES: t.status.equals(TaxiStatus.SERVING);
@ MODIFIES: None
@ EFFECTS: ......
*/
}

2. 后置条件

2.1 自然语言

previous

    public synchronized void changeRoute() {
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: get the minimum flow and change the route
*/
}

late

    public synchronized void changeRoute() {
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: \result = this.route = this.map.minRoute(this.position, point);
*/
}

2.2 后置条件不全

previous

    private int getDir(Point from, Point to){
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: (to.getX() - from.getX() > 0) \return = 0;//D
(to.getX() - from.getX() < 0) \return = 1;//U
(to.getY() - from.getY() > 0) \return = 2;//R
(to.getY() - from.getY() < 0) \return = 3;//L
*/ }

late

    private int getDir(Point from, Point to){
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: (to.getX() - from.getX() > 0) \return = 0;//D
(to.getX() - from.getX() < 0) \return = 1;//U
(to.getY() - from.getY() > 0) \return = 2;//R
(to.getY() - from.getY() < 0) \return = 3;//L
\return = 4;
*/ }

2.3 没有体现modified的改变

previous

    public void run() {
/*
@ REQUIRES: None
@ MODIFIES: system, r, position. credit, state, req, route, timer
@ EFFECTS: \this.state = 2&&\this.reqList.isEmpty==>\this.lastposition = \old.this.position;\this.position = getNextPos();t+=0.2+checkLight(lastposition, position, p);
\this.state = 2&&!\this.reqList.isEmpty==>\this.lastposition = \old.this.position;\this.position = getNextRoute();t+=0.2+checkLight(lastposition, position, p);
\this.state = 1||\this.state = 3==>this.lastposition = \old.this.position;\this.position = getNextRoute();t+=0.2+checkLight(lastposition, position, p);
\this.state = 0 ==> t+=0.2+checkLight(lastposition, position, p);
*/
}

2.4 不符合格式规定

previous

    public boolean repOK() {
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: (this.map==null||this.map.length==0) \result = false;
\result = true;
*/
}

late

    public boolean repOK() {
/*
@ REQUIRES: None
@ MODIFIES: None
@ EFFECTS: (this.map==null||this.map.length==0) ==> \result == false;
(this.map!=null&&this.map.length!=0) ==> \result == true;
*/
}

2.5 忽略后置条件

心得体会


这个规格也不知道该说点什么,都是写完代码看着复制粘贴,改改格式,然后基本也都是电工课解决的hhh可能之后3次要认真一点了

我一直很佛,对自己的程序和别人的程序都是随便测几个,虽然这不是对学术负责的态度?但是觉得吧几天写出来的东西怎么也会有错,至少我是这么认为自己的。自从ifttt自暴自弃,我就没被报过bug(除了第一次出租车的loadfile有点问题,主要还是自暴自弃吧)可能是大难不死必有后福?不过OO倒是让我知道了要更热爱生活,不然除了黑黢黢的屏幕,什么都不剩了。

第三次OO总结的更多相关文章

  1. 【作业】HansBug的前三次OO作业分析与小结

    OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...

  2. 前三次OO作业小结

    I used to be enamored of object-oriented programming. I'm now finding myself leaning toward believin ...

  3. 小菜鸡儿的第三次OO博客

    规格化设计历史 规格化设计的历史目前网上的资料并不多,百度谷歌必应也表示无能为力...... 在这里结合现实情况讲一讲自己对程序规格化的理解,首先代码规格化对代码的影响是间接的,或许它不能让你代码里面 ...

  4. 2018-北航-面向对象-前三次OO作业分析与小结

    基于度量的程序结构分析 由于平时使用了NetBrains出品的IDEA作为IDE,在分析程序的时候我使用了IDEA的插件Metrics Reloaded.然而在使用时发现不懂得很多分析项目的含义,因此 ...

  5. 前三次OO作业总结

    一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...

  6. 2018-北航-面向对象第三次OO作业分析与小结

    1. 规格设计的发展历史 规格设计用于对程序设提供分解,抽象等的手段.在撰写代码规格的时候,需要对组成部件进行抽象. 在1960s,软件设计出现危机,例如Dijkstra提出了goto语句的种种危害, ...

  7. 第三单元OO总结

  8. 面向对象OO第三单元总结

    第三单元OO总结博客 1 梳理JML语言的理论基础.应用工具链情况 由于篇幅原因,这里只梳理几个在本单元常用的 注释结构 行注释://@annotation 块注释:/* @ annotation @ ...

  9. OO设计原则 -- OO设计的原则及设计过程的全面总结

    这部分增加一点自己的感想,OO设计原则下面讲述的很清晰;看完之后有点感想如果我们在实际开发当中能够把这些原则熟烂于心的话那我们的代码质量和个人能力会有很显著的提神.根据自己的实际经验看很多开发者在开发 ...

随机推荐

  1. destructuring

    解构(结构化赋值): 解构过程中,具备赋值和变量声明两个功能 目的在于把等号左右长的相似的两个东西内部的值取出来. 对象数组都可以参与解构: let obj = {name: ‘duyi’,age: ...

  2. scrapy 爬取豆瓣互联网图书

    安装scrapy conda install scrapy 生成一个scrapy项目 scrapy startproject douban settings文件 # -*- coding: utf-8 ...

  3. Tensorflow的验证码识别

    最近在弄深度学习,从网上找了一些资料.这是基于Tensorflow的深度学习的验证码识别.https://cuijiahua.com/blog/2018/01/dl_5.html http://blo ...

  4. file常用功能

    构造方法 File(String pathname):将指定的路径名转换成一个File对象 File f = new File("D:\\a\\b.txt"); File(Stri ...

  5. mysql出现“Incorrect key file for table”解决办法

    本文来自: https://www.cnblogs.com/zjoch/archive/2013/08/19/3267131.html 今天mysql突然出现以下错误: mysql> selec ...

  6. antd-react-mobile(踩坑记录)

    1.按照官网步骤进行, $ npm install -g create-react-app # 注意:工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试 ...

  7. 从零开始学spring cloud(二) -------- 开始使用Spring Cloud实战微服务

    1.准备工作 2.服务提供者与服务消费者 3.服务发现与服务注册 服务发现: 服务注册表: 服务注册表是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心.服务注册表提供查询API和管理 ...

  8. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录

    CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-总目录: 0.Windows 10本机下载Xshell,以方便往Linux主机上上传大文件 1.CentOS7+CDH5.14.0安 ...

  9. typename的用法

    template <class T> void foo() { typename T::iterator * iter; } class ContainsAType{ public: cl ...

  10. linux-kernel-4.4 移植 (1)启动

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...