小菜鸡儿的第三次OO博客

规格化设计历史

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

  在这里结合现实情况讲一讲自己对程序规格化的理解,首先代码规格化对代码的影响是间接的,或许它不能让你代码里面的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还是一个工程量很大的任务。

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

原文地址:https://www.cnblogs.com/gtwc/p/9094059.html

时间: 2024-08-01 07:35:04

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

Django测试平台开发(三)开发博客②

Django 测试平台开发(三)开发博客② 1.上下文管理器 上下文管理器 django提取context中的数据去供模板调用 需求: 所有的页面都需要一个特定的变量 本质: python函数 , 接收一个HttpRequest对象的参数 , 且返回的必须是一个字典 定义上下文管理器文件名命名不受限, 放置的路径也不受拘束, 可以放在django项目下的任意位置 1.在user文件夹下创建文件process_content.py 1 from . import models 2 3 def ca

三天搭建博客,包括文章迁移

这两天心血来潮,突然想搭建一个博客,域名和主机早就买好了.以前就想搞,不过自己太懒了,就一直拖着,这次总算是实现了自己多年未完成的目标. 一.选择博客系统 我首先在V站上发了个求助帖,想知道大家都是怎么搭建的.出乎我的意料,大家都很热情,纷纷贴上了自己的系统,包括WordPress.hexo.hugo.Typecho.GitHub.Bitcron.ZBlog.Ghost.jekyll等,还有的网友是自己写的系统,也贴出了代码托管的地址. 在综合考虑之后,选择了呼声最高的Typecho,主要以下几

设计与实现分离——面向接口编程(OO博客第三弹)

如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度说一说我感受到的面向接口编程,从而初探设计与实现分离的模式. (本文所使用的面向对象语言为java,相关代码都是java代码) 设计--接口抽象设计 继承的思想很容易理解,提取几类相近数据中的公共部分为基类,各个独立部分在基类的基础上做自己专属的延伸.接口是抽象概括输入和输出,而具体的实现交由具体实

OO博客作业2:第5-7周作业总结

(1)从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化. 第5次作业:多线程电梯 基本照搬了课件上"生产者-消费者"模型的设计策略,将InputHandler设计为生产者线程,将Scheduler设计为消费者线程,将RequestQueue设计为托盘.生产者与消费者的工作并发,提高效率.同时,每部电梯设计为一个线程,因为每部电梯的运行彼此不干扰.InputHandler, Scheduler由主线程创建,三部电梯由Scheduler负责创建,这样使得调度器可以获

接着继续(OO博客第四弹)

.测试与JSF正确性论证 测试和JSF正确性论证是对一个程序进行检验的两种方式.测试是来的最直接的,输入合法的输入给出正确的提示,输入非法的输入给出错误信息反馈,直接就能很容易的了解程序的运行情况.但是,每次测试只是在程序涉及的整个问题空间取一个元素进行测试,一次测试只能确保程序对于测试中的样例和同类样例是正确的,并不能确保全局正确性.而为了追求全局覆盖性,就需要大规模的测试样例轰炸了,但是这时测试的最致命缺陷就出现了,一是如何构造如此大量且属于不同类别的测试样例,二是如何确保构造的测试样例能够

oo博客2

一.从多线程的协同和同步控制方面,分析和总结自己三次作业来的设计策略及其变化 第五次:这次作业我的策略便是读入指令一个线程.调度器一个线程.电梯三个线程,通过调度器线程将读入指令线程读入的指令分配给三个电梯,而三个电梯则一直在运行,检测是否有指令产生.本次作业完全使用synchronized关键字进行同步控制. 第六次:这次作业因为指导书要求不太明确,我便放弃了读入指令线程这个设计以达到更好地同步控制.我的设计是将指令全部读入后,根据指令数量建立对应的监控线程,这样一来我只需做好监控线程的同步即

我的第三十一篇博客---mongo

mongo 进入Mongoshow dbs 展示出mongo里数据库有哪些db 显示当前数据库use admin 切换到admin这个数据库show collections 展示里面的集合 db.info.insert({'name':'zhangsan','age':20}) 向当前数据库info列里插入这项数据db.info.find() 查询info里的数据db.dropDatabase() 删除当前的数据库 mongodb集合的命令不手动创建集合:向不存在的集合中第一次加入数据时,集合会

我的第三十篇博客---scrapy框架

scrapy安装需要一个异步模块Twisted,这个模块得自己手动安装 Twisted下载地址:https://blog.csdn.net/coco56/article/details/82145425 如果自己是python 37 -64位,可以下载这个网盘的文件 按需求选取 pycharm 安装: pip install Twisted存放的路径 打开cmd 运行 scrapy 出数据表示安装成功 不是内部命令,未安装 然后 需要升级 运行指令: pip install pypiwin32

我的第三十三篇博客---flask

使用框架的优点:稳定性和可扩展性强可以降低开发难度,提高了开发效率 在Python中常用的Web框架有:flaskdjangotornado Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQL_Alchemy),都需要用第三方的扩展来实现.其WSGI工具箱采用Werkzeu