中国建设工程造价网站,仿站源码,wordpress整站模板,小程序开发 深圳一、规格历史 最初的程序设计是直接面向机器的#xff0c;代码编写困难、可读性差#xff0c;当时对于软件开发的需求并不多。随着对于程序规模的需求#xff0c;出现了面向过程的设计思想#xff0c;开发者开始忽略底层实现#xff0c;进行程序设计。对于面向过程设计思想… 一、规格历史 最初的程序设计是直接面向机器的代码编写困难、可读性差当时对于软件开发的需求并不多。随着对于程序规模的需求出现了面向过程的设计思想开发者开始忽略底层实现进行程序设计。对于面向过程设计思想的变革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.requestrequest)( this.taxiSelection.isEmpty()); */ 2. public boolean isCross(int x, int y){ /** * REQUIRES * MODIFIES: guigv.m.graph; * EFFECTS: * (x0||x79||y0||y79)\resultfalse; * (x0guigv.m.graph[x*80y][(x-1)*80y]1)crosscross1; * (x79guigv.m.graph[x*80y][(x1)*80y]1)crosscross1; * (y0guigv.m.graph[x*80y][x*80y-1]1)crosscross1; * (y79guigv.m.graph[x*80y][x*80y1]1)crosscross1; * (cross3)\resulttrue; * (cross3)\resultfalse; */ if(x0||x79||y0||y79) return false; int cross 0; if(x0guigv.m.graph[x*80y][(x-1)*80y]1) cross; if(x79guigv.m.graph[x*80y][(x1)*80y]1) cross; if(y0guigv.m.graph[x*80y][x*80y-1]1) cross; if(y79guigv.m.graph[x*80y][x*80y1]1) cross; if(cross3) return true; else return false; } 描述内容是实现算法更改方式应该是从后置条件的含义入手如下 /** * REQUIRESnone; * MODIFIES: guigv.m.graph; * EFFECTS: * (x0guigv.m.graph[x*80y][(x-1)*80y]1)crosscross1; * (x79guigv.m.graph[x*80y][(x1)*80y]1)crosscross1; * (y0guigv.m.graph[x*80y][x*80y-1]1)crosscross1; * (y79guigv.m.graph[x*80y][x*80y1]1)crosscross1; * \resulttrue (cross3); * \resultfalse (cross3)|| (x0||x79||y0||y79); */ 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