oo第三次作业

一、规格历史

最初的程序设计是直接面向机器的,代码编写困难、可读性差,当时对于软件开发的需求并不多。随着对于程序规模的需求,出现了面向过程的设计思想,开发者开始忽略底层实现,进行程序设计。对于面向过程设计思想的变革,goto语句成为讨论的热点。Dijkstra于1968年发表著名的《GOTO有害论》,引起了广泛的关注,结构化的设计思想也在此时应运而生。面向对象设计是一种软件设计方法,是一种工程化规范。面向对象设计模式解决的是类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。程序设计的模块化体现的更为明显,各个部分更加独立,相应地,各个模块之间的交互也更加重要。

​正因如此,程序规格化设计越来越被人们重视,对于代码编写的规范能够让程序变得更加易懂,能让使用者轻松地学会如何正确使用这段程序。通过规格的抽象和总结,使用者能够直接使用这段程序而免去浪费大量时间来看懂代码的痛苦过程,代码的维护也变得更加简单。

二、规格bug

在这三次测试中,我遇到的测试者没有对规格进行报错,但这并不代表我的规格书写没有问题,通过自己分析几次规格书写的bug,得到下面的表格

规格bug

方法行数

effects不完整

5

effects内容为实现算法

11

requires逻辑错误

3

modifies不完整

3


分析:首先,缺少规格设计这样的错误只在第一次书写规格时出现,由于对规格书写了解不够清晰,常常出现应该写规格的地方没有写。我经常出现的错误是effects内容为实现算法,由于常常使用自然语言写effects内容,导致描述算法居多,过度使用自然语言对于规格书写是没有帮助的。Requires逻辑错误的原因,则是由于先写程序后写规格导致的,规格并没能约束程序,程序乱七八糟地修改了,规格却不知怎么跟着修改。

三、一些不好的例子

由于自己随心所欲的书写,出现了许多不好的问题,大部分问题出现在后置条件中,列举如下:

1. public ReqHandler(Request request) {

      /**

       * @REQUIRES:none;

       * @MODIFIES:this;

       * @EFFECTS:将请求加到队列中;

      */

      this.request = request;

      this.taxiSelection = new Vector<>();

   }

这是一开始写的规格,对于request不为空没有约束,而后置条件滥用自然语言

修改如下:

/**

       * @REQUIRES:requires!=null;

       * @MODIFIES:this;

       * @EFFECTS:(this.request==request)&&( this.taxiSelection.isEmpty());

      */

2.

public boolean isCross(int x, int y){

      /**

       * @REQUIRES

       * @MODIFIES: guigv.m.graph;

       * @EFFECTS:

       * (x<0||x>79||y<0||y>79)==>\result==false;

       * (x>0&&guigv.m.graph[x*80+y][(x-1)*80+y]==1)==>cross==cross+1;

       * (x<79&&guigv.m.graph[x*80+y][(x+1)*80+y]==1)==>cross==cross+1;

       * (y>0&&guigv.m.graph[x*80+y][x*80+y-1]==1)==>cross==cross+1;

       * (y<79&&guigv.m.graph[x*80+y][x*80+y+1]==1)==>cross==cross+1;

       * (cross>=3)==>\result==true;

       * (cross<3)==>\result==false;

      */

      if(x<0||x>79||y<0||y>79)

        return false;

      int cross = 0;

      if(x>0&&guigv.m.graph[x*80+y][(x-1)*80+y]==1)

        cross++;

      if(x<79&&guigv.m.graph[x*80+y][(x+1)*80+y]==1)

        cross++;

      if(y>0&&guigv.m.graph[x*80+y][x*80+y-1]==1)

        cross++;

      if(y<79&&guigv.m.graph[x*80+y][x*80+y+1]==1)

        cross++;

      if(cross>=3)

        return true;

      else return false;

   }

描述内容是实现算法,更改方式应该是从后置条件的含义入手,如下

/**

       * @REQUIRES:none;

       * @MODIFIES: guigv.m.graph;

       * @EFFECTS:

       * (x>0&&guigv.m.graph[x*80+y][(x-1)*80+y]==1)==>cross==cross+1;

       * (x<79&&guigv.m.graph[x*80+y][(x+1)*80+y]==1)==>cross==cross+1;

       * (y>0&&guigv.m.graph[x*80+y][x*80+y-1]==1)==>cross==cross+1;

       * (y<79&&guigv.m.graph[x*80+y][x*80+y+1]==1)==>cross==cross+1;

       * \result==true ==> (cross>=3);

       * \result==false ==>(cross<3)|| (x<0||x>79||y<0||y>79);

      */

3.部分方法需要抛出异常,但是没有体现在规格中。

修改方法:增加exceptional_behavior(InterruptedException);

4.

/**

            * @REQUIRES: none;

            * @MODIFIES: SchedulerSys.taxis, result.txt;

            * @EFFECTS: 根据请求处理原则,选派相应出租车响应,并将响应结果写入文件,同时更改参与抢单出租车的信用值;

            * @THREAD_REQUIRES:\locked(finalTaxi);

         * @THREAD_EFFECTS:\locked(),整个方法同步;

           */

没有写明具体修改内容

修改方式:增加具体修改内容

5.经过研究其他同学的代码,我发现自己代码有一个很大的问题就是有些方法写的太长了,动辄好几百行,像是面向过程代码,不是一个很好的结构。这是由于书写时没有先写规格,在最后写规格时无从下手。这种规格改正方式,只有推翻重写。

四、聚焦关系

由于规格设计的问题,导致代码功能不清晰,并造成了至今无法查出的crash问题……

作业次数

方法名

功能bug

规格bug

 

taxi

2

2

9

hanndleFileReq

1

1

10

getAailaleDir

1

1

11

getAailaleDir

1

1

 

 

 

 

五、心得体会

 总的来说,这三次作业主要折磨我的还是规格设计的问题。我无法做到先设计规格再根据规格写代码,常常是写完代码了,要花更多地时间去“编”规格。事实上,我无法体会到书写规格的意义,对于我这种底层群众来说,可能书写规格和写注释没什么区别。而且对于规格的规范等等,各人有各人的理解,常常能在朋友圈看到大家被挂7,8个规格错误,然后就是一场撕逼,过去的三个星期虽然一定不是作业量最多的,但一定是大家最生气、戾气最多的时间。说实话,学到现在,有些迷茫了,我不清楚这门课到底要我们干什么,无法理解它和数据结构、c语言的区别,它对于我来说,可能就只是一门很痛苦的课程而已吧。庆幸的是遇见的人都很不错,然而身边见到的不良例子太多了……虽然说最可怕的出租车已经过去了,但是我想每一次撕逼,每一个挂在朋友圈的帖子,都是一把刺在人心上的刀子,伤虽然愈合了,但疤痕永远都在。

转载于:https://www.cnblogs.com/lemonj1998/p/9107620.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帮助推动Java EE向前发展

如果您还记得我写的题为《 Java EE 8&#xff1a;当前状态是什么》的文章 &#xff0c;很明显&#xff0c;在过去的几个月中&#xff0c;Java EE的发展肯定已经放缓。 肯定有一些Java EE下的JSR具有比其他JSR更多的活动&#xff0c;但是自JavaOne 2015以来&#xff0c;整个Java…

35

1 转载于:https://www.cnblogs.com/venicid/p/9116284.html

glassfish默认密码_在MySQL上使用含盐密码的GlassFish JDBC安全性

glassfish默认密码我在该博客上最成功的文章之一是有关在GlassFish上使用基于表单的身份验证设置JDBC安全领域的文章 。 对这篇文章的一些评论使我意识到&#xff0c;要真正使它安全&#xff0c;应该做的还很多。 开箱即用的安全性 图片&#xff1a; TheKenChan &#xff08; …

Endnote生成的中英文混排参考文献中“等”与“et al”的处理

已有 12791 次阅读 2010-3-27 00:50 |个人分类:学习|系统分类:科研笔记|关键词:Endnote,参考文献,等,et al from: http://blog.sciencenet.cn/home.php?modspace&uid485&doblog&id306545 相信有很多科研工作者在管理参考文献、写论文时选用了Endnote作为首选参考…

【洛谷】P4643 【模板】动态dp

题解 在冬令营上听到冬眠的东西&#xff0c;现在都是板子了猫锟真的是好毒瘤啊(雾) (立个flag&#xff0c;我去thusc之前要把WC2018T1乱搞过去 &#xff09; 好的&#xff0c;我们可以参考猫锟的动态动态dp的课件&#xff0c;然后你发现你什么都看不懂&#xff08;菜啊 但是我们…

让 CentOS 启动时不启动桌面服务

[日期&#xff1a;2012-11-03] 来源&#xff1a;Linux社区 作者&#xff1a;kandyer [字体&#xff1a;大 中 小] 修改/etc/inittab文件&#xff0c;将 id:5:initdefault: 改为 id:3:initdefault: Linux 系统任何时候都运行在一个指定的运行级上&#xff0c;并且不同的运…

bzoj2721樱花——质因数分解

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2721 可以知道 x 和 y 一定都大于 n! &#xff0c;不妨把 y 表示为 n!t &#xff1b; 那么 1/x 1/y 1/x 1/(n!t) 1/n! &#xff1b; 整理一下&#xff0c;最终变成&#xff1a;x (n!)/t 1 &#xff1b…

带有WildFly Swarm的远程JMS

我再次在博客上谈论WildFly群&#xff1f; 简短的版本是&#xff1a;我需要对远程JMS访问进行测试&#xff0c;并且拒绝设置复杂的功能&#xff08;如完整的应用程序服务器&#xff09;。 这个想法是要有一个简单的WildFly Swarm应用程序&#xff0c;该应用程序配置了队列和主题…

CentOS,重启的常用命令

重启命令 Linux中常用的关机和重新启动命令有shutdown、halt、reboot以及init&#xff0c;它们都可以达到关机和重新启动的目的&#xff0c;但是每个命令的内部工作过程是不同的&#xff0c;下面将逐一进行介绍。 1. shutdown shutdown命令用于安全关闭Linux系统。有些用户会…

nosql怎么使用_使用NoSQL实施实体服务–第5部分:使用云提高自治性

nosql怎么使用在之前的文章中&#xff0c;我讨论了如何通过结合使用Java Web Services &#xff0c; Java EE和CouchDB NoSQL数据库为产品构建SOA“实体”服务。 在本系列的最后一篇文章中&#xff0c;我将利用我已经创建的一些技术资产&#xff0c;并使用一些流行的SOA模式实现…

串口MSComm控件五种不同校验方式对数据收发的影响

(2008-09-10 14:50:00) http://blog.sina.com.cn/s/blog_470eccc60100arq7.html串口MSComm控件有五种校验方式&#xff0c;分别是无校验&#xff08;None&#xff09;&#xff0c;奇校验&#xff08;Odd&#xff09;&#xff0c;偶校验&#xff08;Even&#xff09;&#xff0c…

利刃 MVVMLight 3:双向数据绑定

利刃 MVVMLight 3&#xff1a;双向数据绑定 原文:利刃 MVVMLight 3&#xff1a;双向数据绑定上篇我们已经了解了MVVM的框架结构和运行原理。这里我们来看一下伟大的双向数据绑定。说到双向绑定&#xff0c;大家比较熟悉的应该就是AngularJS了&#xff0c;几乎所有的AngularJS 系…

使用Java扫描DynamoDB项目

在之前的文章中&#xff0c;我们介绍了如何查询DynamoDB数据库 查询DynamoDB第1部分 查询DynamoDB第2部分 。 除了发出查询之外&#xff0c;DynamoDB还提供扫描功能。 扫描所做的是获取您在DynamoDB表上可能拥有的所有项目。 因此&#xff0c;扫描不需要任何基于我们的分区键…

实战 SSH 端口转发

from: http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 通过本文的介绍&#xff0c;读者可以从中了解到如何应用 SSH 端口转发机制来解决日常工作 / 生活中的一些问题。学会在非安全环境下使用端口转发来加密网络应用&#xff0c;保护个人隐私以及重要商业信息。…

627.Swap Salary-(LeetCode之Database篇)

问题描述 给出下面的表&#xff0c;名为salary。 idnamesexsalary1Am25002Bf15003Cm55004Df500要求执行一个UPDATE语句&#xff0c;将表转换成下面的样子。 idnamesexsalary1Af25002Bm15003Cf55004Dm500即m与f交换位置。 问题解决 下面我使用SQL中的case when来解决问题。…

unix/linux命令“ls -l”选项输出结果详解

from: http://hi.baidu.com/hoxily/item/12e2a02d03f77e0942634a8e unix/linux命令“ls -l”选项输出结果详解 下面是我在lucidubuntu使用”ls -l /”的结果&#xff1a; hoxilyubuntulucid:/$ ll / total 96 drwxr-xr-x 22 root root 4096 2012-02-06 20:10 ./ drwxr-xr-x 2…

delayqueue_在DelayQueue中更改延迟,从而更改顺序

delayqueue因此&#xff0c;我正在考虑构建一个简单的对象缓存&#xff0c;该缓存在给定时间后会使对象过期。 显而易见的机制是使用Java并发包中的DelayedQueue类。 但是我想知道是否有可能在将对象添加到队列后更新延迟。 看一下Delayed接口&#xff0c;似乎没有充分的理由不…

使用Amalgamate将C/C++项目合并成一个.h/.c[pp]文件

简述 C/C开源库一般是一堆的头文件和源文件&#xff0c;做到声明和实现分离&#xff0c;减小单个模块大小&#xff0c;这在设计上是很好的&#xff0c;但是用起来稍显麻烦。在网上看到有好心人推荐了一个开源工具Amalgamate&#xff0c;专门用来对C/C的头文件和源文件进行合并用…

Java数组排序解码

排序是我们在计算机科学中学习的第一个算法。 排序是一个非常有趣的领域&#xff0c;它有大约20多种算法&#xff0c;而且总是很难确定哪种算法最好。 排序算法的效率是根据所需的时间和所需的空间来衡量的。 一些时间气泡排序是最好的&#xff0c;因为它没有空间需求&#xff…

linux下删除乱码文件名的方法

from: http://www.jb51.net/LINUXjishu/32910.html linux下删除乱码文件名, 不废话: 1. ls -i 列出文件的节点ID, 如: 123456789 2. find ./ -inum 123456789 -print -exec rm -rf {} \; 批量删除: for n in 123456789 987654321;do find . -inum $n -exec rm -f {} \;…