zoukankan      html  css  js  c++  java
  • 第九到十一次作业总结

    一、规格化设计的大致发展历史

    这里说到的规格化设计就是将程序进行结构化分析的表现方式。结构化分析在1980年代起开始广为使用。结构化分析包括将系统概念转换为用数据及控制的来表示。数据字典用来描述数据和指令的流动,而用程序规格来描述交易或数据转换的相关信息。结构化分析是许多结构化方法中的一部分。“结构化分析是系统分析、设计及编程技术的组合,其目的是为了处理1960至1980年软件开发所遇到的问题,也没有将需求及设计文件化的技术。但是随着系统越来越大也更加复杂,信息系统的发展也变得越来越困难。”为了方便管理大而复杂的系统,慢慢演进了更多的结构化方法。80年代后,面向对象的设计兴起,相比于单纯的结构化设计,面向对象的设计从审视问题的角度上就有了差异,程序发生了从围绕“行为”执行到围绕“客体”执行的变化,随之而来的,就是封装性地提高,可重用性的提高,可以说,面向对象进一步实现了结构化设计,是结构化设计更进一步的实现。

    规格化设计的重要性就在于,可以让软件设计者和真正写程序的人员之间进行有效的沟通。因为用自然语言进行交流总是会发生歧义,导致交流和沟通不便。只有双方维持着同一套系统的,高效的语言,才能真正发挥规格化设计的作用。

    二、规格bug

    modifies不完整 方法代码行数:150
    不符合JSF规范 方法代码行数:1
    overview是否明确抽象 类代码行数:162

    三、规格bug的产生原因

    1、overview的问题是因为忘记撰写

    2、不符合JSF规范是因为在遍历集合元素时,误把分号写作冒号

    3、modifies不完整是因为成员变量没有加this.

    四、分别列举5个前置条件和5个后置条件的不好写法,并给出改进写法

    REQUIRES:

    (1)*@REQUIRES:String类型的地图路径,System.in。改:*@REQUIRES:path!=null;

    (2)在方法的传入参数有限制的时候,*@REQUIRES:None;改:**!=null;

    (3)传入参数涉及坐标时:int sx, int sy, int dx, int dy,*@REQUIRES:None; 改:@REQUIRES: 0<=sx<80&&0<=sy<80&&0<=dx<80&&0<=dy<80

    (4)get类的方法中,待返回的值不加以约束,*@REQUIRES:None;改:this.*!=null;

    (5)构造方法中,对传入的参数不进行约束,*@REQUIRES:None;改:**!=null;

    EFFECTS:

    (1)自然语言撰写。*@EFFECTS:查询是否重复;改:*@EFFECTS:n.exists==>( esult==true);!n.exists==>( esult==false);

    (2)对异常的处理不明确。(Unknown situation)==>exceptional_behavior(Exception);改:(I/O error occurs)==>exceptional_behavior (IOException);

    (3)涉及算法。(graph[sx*80+sy][dx*80+dy]==1)?true:false;改:

    * @EFFECTS: (road.open)==>( esult==true);

    * (road.close)==>( esult==false);

    改:

    (4)使用synchronized关键字没有进行线程约束。改:

    * @THREAD_REQUIRES: locked(this);

    * @THREAD_EFFECTS: locked(this);

    (5)出现恒等式:

    * @EFFECTS: requestQueue == requestQueue;

    * cars == cars;

    * taxiGUI == taxiGUI;

    改:

    * @EFFECTS:this.requestQueue == requestQueue;

    * this.cars == cars;

    * this.taxiGUI == taxiGUI;

    五、功能bug与规格bug在方法上的聚集关系

    方法名 功能bug 规格bug
    pathlength 1个(搜索算法效率低) 1个

    TargetChange

    1个(红绿灯时间差异) 1个
    noTargetChange 1个(流量最小的控制) 1个

    在上述三个较为重要的方法中,实现的功能较多,因此而产生的bug会比较集中,也正因为实现功能较多,会导致规格的撰写较为冗长,也更容易出现错误。

    六、设计规格和撰写规格的基本思路和体会

    在撰写规格时,我关注的是这个方法究竟改变了什么,以modifies为纲,不去在乎具体的算法,而是在这个方法实现之后,我的程序应该进行到什么程度,改变了什么,返回值是什么。在撰写过程中,有些方法的篇幅较长,改变的东西较多,理清所有的内容需要较长的时间而且写出来的规格也较多较杂。唯一能解决的办法就是,在这个方法中继续拆分出更小的函数单元,分别撰写规格。因为,这几次的作业都是完成一个工程,我们需要从一砖一瓦开始搭建,当有了一个详细的设计图(规格)之后,整个建筑的搭建就会容易很多。在以后的学习中就要学会先进行规格的设计,明确每个类,每个方法的作用,使这个过程不再是零碎的,而是成体系的,有顺序的。

  • 相关阅读:
    项目开发环境
    angluarjs2入门学习资源
    mosquitto安装和测试
    loj#6031. 「雅礼集训 2017 Day1」字符串(SAM 广义SAM 数据分治)
    loj#6030. 「雅礼集训 2017 Day1」矩阵(贪心 构造)
    loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
    HDU4609 3-idiots(生成函数)
    loj#6436. 「PKUSC2018」神仙的游戏(生成函数)
    BZOJ3028: 食物(生成函数)
    洛谷P4841 城市规划(生成函数 多项式求逆)
  • 原文地址:https://www.cnblogs.com/melina/p/9110003.html
Copyright © 2011-2022 走看看