规格化设计调研

大致发展历史

--> 自给自足的私人化的软件生产方式。

--> 落后的软件生产方式无法满足迅速增长的计算机软件需求,软件的开发与维护出现一系列严重问题。

--> 正式提出“软件工程”。

--> 提出结构化程序设计,以模块化设计为中心,分而治之,引出了规格化抽象。

--> 软件系统日趋复杂,结构化程序设计的缺点日渐暴露出来,面向对象由此产生,规格化设计进一步发展。

--> 设计模式、设计原则、架构模式的产生。

为何得到重视

  1. 有助于程序员理解程序、分解程序,独立化开发任务、加快开发速度。
  2. 有助于团队中的人互相理解代码。
  3. 有助于程序在细节和整体上进行验证,以保证程序的正确性。
  4. 有助于提高程序未来的可维护性、可扩展性。

三次作业的bug列表分析

列举几个规格bug并改进

前置条件的错误样例及改进

    static int getRandomInRange(int range) {
/**
* @REQUIRES : None;
* @MODIFIES : None;
* @EFFECTS :
* 返回一个随机整数,范围从0,1,2...到range-1
*
*/
return (int) (Math.random() * range);
} =============================================================================   static int getRandomInRange(int range) {
/**
* @REQUIRES :
* range>0;
* @MODIFIES : None;
* @EFFECTS :
* 返回值为一个随机整数,其范围从0,1,2...到range-1
*
*/
return (int) (Math.random() * range);
}
    private DIR calDir(MyPoint ptobe) {
/**
* @REQUIRES :
* ptobe!=null;
* @MODIFIES : None;
* @EFFECTS :
* 根据传入的目标点,与当前的点相比,判断从目标点在当前点的哪个方向。
*/
if(ptobe.x==place.x && ptobe.y==place.y+1)
return DIR.EAST;
else if(ptobe.x==place.x && ptobe.y==place.y-1)
return DIR.WEST;
else if(ptobe.x==place.x+1 && ptobe.y==place.y)
return DIR.SOUTH;
else if(ptobe.x==place.x-1 && ptobe.y==place.y)
return DIR.NORTH;
return null;
} ============================================================================== private DIR calDir(MyPoint ptobe) {
/**
* @REQUIRES :
* ptobe!=null;
* @MODIFIES : None;
* @EFFECTS :
* 若 传入的目的坐标点 ptobe 与 出租车当前所在的位置坐标点 \this.place 为相邻点,则返回值为 ptobe 相对于 \this.place 的方向。
* 若 ptobe 和 \this.place 为不相邻点,则返回值为null。
*/
if(ptobe.x==place.x && ptobe.y==place.y+1)
return DIR.EAST;
else if(ptobe.x==place.x && ptobe.y==place.y-1)
return DIR.WEST;
else if(ptobe.x==place.x+1 && ptobe.y==place.y)
return DIR.SOUTH;
else if(ptobe.x==place.x-1 && ptobe.y==place.y)
return DIR.NORTH;
return null;
}

后置条件的错误样例及改进

  public Car(int id) {
/**
* @REQUIRES :
* 0<=id<100;
* @MODIFIES :
* \this.id;
* \this.place;
* \this.dir;
* @EFFECTS :
* \this.id == id;
* 位置place更新为随机的点,其中点的横纵坐标都是属于[0,79]的整数。
* 初始方向随机为东南西北中的一种。
*/
try {
pw = new PrintWriter("car" + id + ".txt", "UTF-8");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.id = id;
place = new MyPoint(RanGen.getRandomInRange(TaxiSys.MAP_LEN), RanGen.getRandomInRange(TaxiSys.MAP_LEN));
TaxiSys.gui.SetTaxiStatus(id, place.toAwtPoint(), 2);
int ran = RanGen.getRandomInRange(4);//随机设置初始朝向
switch(ran) {
case 0://状态和编号是一一对应的,按从北开始的顺时针方向
dir = DIR.NORTH;
break;
case 1:
dir = DIR.EAST;
break;
case 2:
dir = DIR.SOUTH;
break;
case 3:
dir = DIR.WEST;
break;
}
}
===============================================================================
  public Car(int id) {
/**
* @REQUIRES :
* 0<=id<100;
* @MODIFIES :
* \this.id;
* \this.place;
* \this.dir;
* \this.pw;
* @EFFECTS :
* \this.id == id;
* 位置\this.place为一个随机的点,其中点的横纵坐标都是属于[0,79]的整数;
* 初始方向\this.dir为东南西北中的随机的一种;文件写入器\this.pw得到初始化;
*/
try {
pw = new PrintWriter("car" + id + ".txt", "UTF-8");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.id = id;
place = new MyPoint(RanGen.getRandomInRange(TaxiSys.MAP_LEN), RanGen.getRandomInRange(TaxiSys.MAP_LEN));
TaxiSys.gui.SetTaxiStatus(id, place.toAwtPoint(), 2);
int ran = RanGen.getRandomInRange(4);//随机设置初始朝向
switch(ran) {
case 0://状态和编号是一一对应的,按从北开始的顺时针方向
dir = DIR.NORTH;
break;
case 1:
dir = DIR.EAST;
break;
case 2:
dir = DIR.SOUTH;
break;
case 3:
dir = DIR.WEST;
break;
}
}
synchronized public void addReq(Request r) {
/**
* @REQUIRES :
* r!=null;
* @MODIFIES :
* \this.q;
* \this.req_id;
* @EFFECTS :
* \this.q.size()==\old(this).q.size()+1 && \this.q.contains(r);
* @THREAD_REQUIRES : None;
* @THREAD_EFFECTS :
* \locked();
*/
q.add(r);
r.setID(req_id);
req_id++;
TaxiSys.gui.RequestTaxi(r.src_p.toAwtPoint(), r.dst_p.toAwtPoint());
}
================================================================================
synchronized public void addReq(Request r) {
/**
* @REQUIRES :
* r!=null;
* @MODIFIES :
* \this.q;
* \this.req_id;
* @EFFECTS :
* \this.req_id==\old(this).req_id+1;
* \this.q.size()==\old(this).q.size()+1 && \this.q.contains(r);
* @THREAD_REQUIRES : None;
* @THREAD_EFFECTS :
* \locked();
*/
q.add(r);
r.setID(req_id);
req_id++;
TaxiSys.gui.RequestTaxi(r.src_p.toAwtPoint(), r.dst_p.toAwtPoint());
}

归纳我在设计规格和撰写规格的基本思路和体会

  • 确实没有设计规格之说,我相信大部分人也都是先写代码,然后发现需求改了,然后改代码,然后debug,最后写文档和JSF。所以我觉得这门课比较遗憾没有对同学们进行设计规格的训练。
  • 既然没有设计规格之说,那么撰写规格也就成了复制粘贴并根据套路微调,成了细心、耐心、恒心的比拼。
  • 基本思路:没啥好说的。主要就是(1)掌握课上给的几个例子和模板,对于相似的方法能够套用 或 进行合理地改进创新。(2)锻炼自己的描述能力,如何做到准确地、全面地、逻辑地、无二义性地描述规格。(3)可以进行场景代入:你可以假设自己是团队设计者,写了规格之后,是要把规格交给你的队友去码代码的,这样或许能够更加锻炼你的规格化设计。
  • 不过,以后如果要我们根据需求和框架来设计规格,然后把规格交给团队的其他人去完成代码,怕是也需要另外进行训练吧嘤嘤嘤。
  • 又或者,更积极一点地去想,其实我们在搭框架、写代码的时候,内心就已经给每一个类和方法赋予了比较模糊的规格,因此,更加有意义的事情,不在于撰写规格,而在于搭框架码代码的过程中 展现出的 清晰的逻辑 和 思想的火花 吧,毕竟后者才更接近于 设计 规格。
  • 体会:虽然有学到一些东西,但是所耗时间精力较多,而且效果不佳。回想规格之前的作业,虽然难度大,但我甚是怀念呢。
  • 最后,很感谢一起熬过这段艰难时期的朋友们,现在心里也平静了许多。

精神突然荒凉,笑容逐渐消失。

目睹人心险恶,但所幸患难见真情,有友如此足矣。

得到最大锻炼的,是一颗刚强的心。

日后何去何从,大家自有论断。

OO第9~11次作业总结的更多相关文章

  1. OO第二次博客作业——电梯调度

    OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...

  2. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  3. day 11课后作业

    # -*- coding: utf-8 -*-# @Time : 2019/1/3 20:03# @Author : Endless-cloud# @Site : # @File : day 11 课 ...

  4. C语言程序设计第11次作业

    一.本次课主要内容: 本章主要介绍指针相关的基础知识,本节课的主要如下 (1)通过示例"密码开锁"引入指针的概念和主要知识点,分析了密码开锁的过程来说明变量.内存单元和地址之间的关 ...

  5. 201621123062《java程序设计》第11周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 思维导图: 2. 书面作业 本次PTA作业题集多线程 2.1. 源代码阅读:多线程程序BounceThread 2 ...

  6. OO第二次博客作业(第二单元总结)

    在我开始写这次博客作业的时候,窗外响起了希望之花,由此联想到乘坐自己写的电梯FROM-3-TO--1下楼洗澡,然后······ 开个玩笑,这么辣鸡的电梯肯定不会投入实际使用的,何况只是一次作业.还是从 ...

  7. 201621123018《java程序设计》第11周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  8. OO第1~3次作业总结

    作业1——多项式运算 基于度量和类图分析设计 先看Metrics插件做出的复杂度分析: 乍一看没有红色报警,其实是因为选中某一行时会自动将该行改为黑色,无论之前是红色还是蓝色emmm 真正展开第一行时 ...

  9. BUAA OO 2019 第四单元作业总结

    目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...

随机推荐

  1. python学习之老男孩python全栈第九期_day004知识点总结

    1. 列表list: 列表转换成字符串: s = 'kidd' s1 = '_'.join(s) # 用_连接 字符串转换成列表: split() range(头,尾,步长): [0,1,2,3,4, ...

  2. JavaScript高级编程——引用类型、Array数组使用、栈方法

    JavaScript高级编程——引用类型.Array数组使用.栈方法 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  3. BZOJ3165: [Heoi2013]Segment(李超线段树)

    题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include& ...

  4. Git冲突与解决方法

    1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景二:多个分支向同一个远端分支推送代码时: 实际上,push操作即是将本地代码merge到远端库分支上. 关于push和pull其实就分 ...

  5. ActiveReports 报表应用教程 (15)---报表换肤

    在葡萄城ActiveReports报表中,可以设置报表中不同控件的样式,然后把这些样式保存到一个外部的XML文件当中,供其他报表使用.如果用户希望同一份报表以不用的外观分发,只需要简单地修改样式表单, ...

  6. android 点击数字跳转到电话界面

    实现方式两种: 1,在xml文件下很简单的实现 只需要在textview属性中加入android:autoLink="phone".  <TextView           ...

  7. Android--播放Gif的取巧办法

    由于做的项目,要有个动画的等待效果,第一时间想到的就是Gif(懒,省事),但是试了好多据说能播放Gif的控件,也写过,但是放到魅族手机上就是不能播放,所有就想了个招,既然Gif能在浏览器上播放,那an ...

  8. CSS实现DIV从隐藏到展示的过渡效果

    CSS中有很多功能强大的方法,其中过渡属性transition就很牛叉.你不用写一行JavaScript代码,随便写点css就可以实现一个动画效果.下面结合我在W3C网站上看到的实例,举个栗子说明下( ...

  9. 基于MSMQ绑定的WCF服务实现总结

    一. 创建消息队列    1 1) 创建一个非事物性的私有队列    1 2)设置消息队列访问权限    2 二.创建WCF服务并绑定消息队列    4 1)创建HelloService服务    4 ...

  10. eclipse neon配置tomcat8无法显示默认页面解决方法

    下载对应tomcat8版本到本地后,在eclipse中添加tomcat8的对应目录,输入http://localhost:8080时无法显示tomcat的index.jsp页面(会显示404页面).原 ...