规格化设计历史

  规格化设计的历史目前网上的资料并不多,百度谷歌必应也表示无能为力......

  在这里结合现实情况讲一讲自己对程序规格化的理解,首先代码规格化对代码的影响是间接的,或许它不能让你代码里面的bug直接消失,或许它也不能让电梯之间不相互阻塞,但是它能让OO实验拿到更多分啊//笑。玩笑归玩笑,下面具体分析一下规格化设计(JSF为例)的作用:

  • 在代码实现过程中,人们往往不能从一开始对整个项目的每个细节都面面俱到地思考一遍,规格化设计在开发初期可以将项目中的细节隐去,工程师只需要考虑类or包需要完成的功能即可,只用在JSF的effecs写几行功能影响岂不是美滋滋。
  • 其次在代码具体实现过程中,Modifies和Requires有助于减少bug的产生。在项目初期定下的JSF能保证程序猿们在乱七八糟的需求修改下不忘初心,在一次又一次的指导书修改中不忘这个类究竟是要完成怎样的历史使命,明确了每个变量的用途、每个方法的使用目的,时时提醒程序猿们不要犯一些低级错误。
  • 而在企业项目中,代码的规格化尤为重要,一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异。且不说会存在多个人同时开发同一模块的情况,即使是分工十分明晰的,等到要整合代码的时候也有够头疼的了。大多数情况下,并非程序中有复杂的算法或是复杂的逻辑,而是去读别人的代码实在是一件痛苦的事情。统一的风格使得代码可读性大大提高了,人们看到任何一段代码都会觉得异常熟悉。显然的,规格化的代码在团队的合作开发中是非常有益而且必要的。

规格bug分析

  自己写的代码规格基本上属于“你的代码真的很烂”级别,博主懒癌晚期,每次观测点的JSF属于随缘被挂状态。下面来分析一下这些垃圾代码,强迫症大佬谨慎食用:

/**@ REQUIRES: AllNode!=NULL;
* taxi!=NULL;
* loc= int[2];
* des= int[2];

严格地说Requires里面要对各个变量进行详细地规定,要是能与与repOK一致的话是最吼的:

/** @ REQUIRES: AllNode!=NULL;
* taxi!=NULL;
* (loc!=NULL) && (loc.size==2) && (All int i=1;i<=2;)==>(loc[i]>=0 && loc[i]<80);
* (des!=NULL) && (des.size==2) && (All int i=1;i<=2;)==>(des[i]>=0 && des[i]<80);

  这几次作业在书写JSF规格时,更像是一种亡羊补牢的过程,首先要求我们具体实现一次代码,再向代码添加JSF,其实与规格化设计略有相悖,另外我认为课程组可能有一点点低估JSF的完成难度,一个优秀的后补JSF需要程序猿阅读自己都快忘了的一坨屎,读完后还需要将代码抽象出一般性的逻辑。以目前北航计算机系大部分同学的编程风格来说,数百行的类基本上比比皆是,数百行的方法也是大有人写,将三位行数的代码抽象出effects可不是一个简单的过程,而与此同时还要完成复杂的流量红绿灯设计以及基于gayhub的操作系统,这确实有一点点难了。不过在这几次公测中,我有幸抽到了一份JSF尚可的代码:

/**
* @REQUIRES:m!=null;
* @MODIFIES:\this.situation;
* \this.isCalled;
* \this.curTime;
* @EFFECTS:normal_behavior:
* 出租车行驶,\this.situation按照出租车的行驶情况不断变化;\this.isCalled在出租车成功接到单子时变为true;接单结束后变成false;
* exception_behavior(InterruptedException e):
* System.out.println("Oops," + this.toString() + " seems to have some problem.");
*/
  如果没有记错的话自然语言描述依然是在允许范围之内的,当然就算不允许,我认为依然不应凭此扣分,毕竟从复杂的代码中抽象出effects还是一个工程量很大的任务。

Bug分析
  

功能bug

规格bug

是否相关

第九次作业

0

0

第十次作业

3

5

第十一次作业

0

0

  在最近三次的作业中,第九次作业和第十一次作业没有被互测出bug,第十次作业的问题主要集中在:1.出租车并未直接右转;2.出租车在直行时并未按照红绿灯行驶;3.出租车在派单过程中并未按照最短路径原则。首先第三个bug是由第一二个bug造成的,毕竟未正确按红绿灯行驶会造成流量决策必定失败,前两个bug的主要问题是在派单函数中并未做到修改出租车的方向。在我的红绿灯体系中,用1,2,3,4四个数字表示绝对方向,分别对应东北西南,而出租车选择一个绝对方向行驶后应当在下一个红绿灯路口前实现转换,如:出租车A在第一个路口决定往北走,当它抵达第二个路口时,它的驶来方向应该是南边,因此造成了红绿灯判别不正确。规格bug主要集中在对出租车的多态实现时,所有的get&set方法没有写JSF,瞬间被挂满~


心得体会
  程序是让人看的,是要分享给队友或者老师,甚至是任何陌生的人共享交流。或许你的算法复杂度能做到o(1),或许你的代码可拓展性很强,但是这些都比不上一群与你一起开发项目的程序猿
,一群能读懂并指出你规格化代码bug的人。或许在这学期的面向对象课程中JSF是一个很烦人的存在,但是规格化程序设计的重要性是毋庸置疑的。

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
table.MsoTableGrid
{mso-style-name:网格型;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-priority:39;
mso-style-unhide:no;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

小菜鸡儿的第三次OO博客的更多相关文章

  1. OO博客总结——OO落下帷幕

    OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...

  2. Beta版本——第三次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  3. RocEDU.课程设计2018 第六组 第三周进展 博客补交

    RocEDU.课程设计2018第六组 第三周进展 博客补交 小组成员:20155211解雪莹,20155217杨笛,20155227辜彦霖 计划完成任务:完成课设所有内容 实际完成任务:跑通老师uco ...

  4. # RocEDU.课程设计2018 第三周进展 博客补交

    RocEDU.课程设计2018 第三周进展 博客补交 本周计划完成的任务 (1).本周计划完成在平板电脑上实现程序的功能,跟第二周计划完成任务基本相似. 本周实际完成情况 (1).实际完成情况还差最后 ...

  5. 第三次ScrumMeeting博客

    第三次ScrumMeeting博客 本次会议于10月27日(五)22时整在3公寓725房间召开,持续10分钟. 与会人员:刘畅.方科栋.窦鑫泽.张安澜. 1. 每个人的工作(有Issue的内容和链接) ...

  6. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  7. oo前三次作业博客总结

    第一次作业 实现多项式的加减运算,主要问题是解决输入格式的判断问题. 输入实例: {(3,0), (2,2), (12,3)} + {(3,1), (-5,3)} – {(-199,2), (29,3 ...

  8. OO博客作业-《JML之卷》

    OO第三单元小结 一.JML语言理论基础以及应用工具链情况梳理 一句话来说,JML就是用于对JAVA程序设计逻辑的预先约定的一种语言,以便正确严格高效地完成程序以及展开测试,这在不能容忍细微错误的工程 ...

  9. OO博客作业1:第1-3周作业总结

    (1)基于度量来分析自己的程序结构 注:UML图中每个划分了的圆角矩形代表一个类或接口,箭头可代表创建.访问数据等行为.类的图形内部分为3个部分,从上到下依次是类的名称.类包含的实例变量(属性).类实 ...

随机推荐

  1. coTurn测试程序之turnutils_stunclient.exe

    测试使用方法,作为STUN客户端,仅用于测试STUN服务是否正常运行. 使用coTurn服务启动STUN/TURN服务后,执行以下命令即可: turnutils_stunclient -p 61.18 ...

  2. Gson解析泛型

    1.简单对象我们传入对象Class来将JSON字符串转为对象 private static <T> T fromJson(String result, Class<T> cla ...

  3. 排序算法之选择排序的思想以及Java实现

    1 基本思想 选择排序的思想是,每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 2,算法的实现(Java) package Algorit ...

  4. June 11. 2018 Week 24th, Monday

    Love is the beauty of the soul. 爱是灵魂之美. From Saint Augustine. The complete version of this quote goe ...

  5. 【NOI2018模拟5】三角剖分Bsh

    [NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...

  6. C#多线程の遇见长耗时操作以及多任务(简明记要)

    4.0用         Task.Factory.StartNew(()=>{});4.0以下用  ThreadPool.QueueUserWorkItem(()=>{})4.0以上用 ...

  7. Python中的Numpy入门教程

    1.Numpy是什么 很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过nu ...

  8. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别

    数据库事务的四大特性以及事务的隔离级别   本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...

  9. socket编程解决粘包和丢包问题

    ##socket 丢包粘包解决方式 采用固定头部长度(一般为4个字节),包头保存的是包体的长度 header+body 包头+包体 下面的例子不是按照上图中规定的格式编写的,但是思路都是一样的,先读出 ...

  10. UVA1646-Edge Case(递推+斐波那契数列)

    Problem UVA1646-Edge Case Time Limit: 3000 mSec Problem Description Input For each test case, you ge ...