目录

  • 羿先生的学习笔记[6]: 规约(Specification)
  • 一、什么是规约
  • 二、如何写规约
  • 三、规约的强弱

羿先生的学习笔记[6]: 规约(Specification)

一、什么是规约

软件设计中的规约(Specification),指明了某个方法要求的输入及产生的影响。
规约是程序与客户端之间达成的一种契约:使用者有义务按照规约的要求输入数据,程序对正确输入的数据应进行正确的处理。使用者和程序都有义务遵循规约。
规约据此可以分为两部分:前置条件(pre-condition)和后置条件(post-condition)。前置条件是对客户端的约束,是使用方法时必须满足的条件;后置条件是对开发者的约束,是方法结束时必须满足的条件 。
使用者在使用方法时,不必关心方法的具体实现,只需阅读规约便可以理解方法的作用。

二、如何写规约

我们以下面这个方法为例:

public static int find(int[] arr, int val)
requires: val occurs exactly once in arr
effects: return index i such that arr[i] = val

方法在arr数组中找到val值并返回val值的索引,要求val在数组中仅出现一次。
我们用注释的方式格式化地给出规约:

 /*** Find a value in an array* @param arr array to search, requires that val occurs exactly once in arr* @param val value to search for* @return index i such that arr[i] = val* @throws NumberException if val does not occur or occurs more than once in arr*/public static int find(int[] arr, int val) throws NumberException{//some code here}

即:

  1. 给出方法的功能
  2. 用@param表示输入的参数,给出参数的含义
  3. 用@return表示返回值的含义
  4. 用@throws表示抛出异常对应的情况

这一规约格式可在IDEA等编译器中,在方法前输入 /** ,按回车换行即可自动生成。

三、规约的强弱

我们作为方法的调用者时,能否通过两个方法的规约来判断是否可以调用某一个方法替换另一个方法?这就涉及到了规约的强弱比较:
一个规约A比另一个规约B更强,表示A比B具有更弱的前置条件和更强的后置条件。
例如:

是一个原始的规约

是更强的一个规约,因为其减弱了前置条件。

是一个更强一些的规约,因为其加强了后置条件。
越强的规约,意味着开发者的自由度和责任越重,而使用者的责任越轻。
我们还可以用图形象地表示规约的强弱关系:

越强的规约,在图中所占的面积越小。如果一个规约A在图中所占区域完全被另一个规约B包含,就表示A比B更强。

羿先生的学习笔记[6]: 规约(Specification)相关推荐

  1. SpringBoot 学习笔记

    SpringBoot 学习笔记 文章目录 SpringBoot 学习笔记 1. SpringBoot简介 1.1 什么是Spring 1.2 Spring 是如何简化Java开发的 1.3 什么是 S ...

  2. JavaScript学习笔记(五)

    JavaScript学习笔记(五) ①Array类 本地对象 ②Date类 ①Global对象 对象的类型   内置对象 ②Math对象 宿主对象 今天继续学习JS中的对象,昨天内置对象Global对 ...

  3. 学习笔记:The Log(我所读过的最好的一篇分布式技术文章

     学习笔记:The Log(我所读过的最好的一篇分布式技术文章)         前言 这是一篇学习笔记. 学习的材料来自Jay Kreps的一篇讲Log的博文. 原文很长,但是我坚持看完了,收获 ...

  4. 软件工程学习笔记《四》需求分析

    文章目录 软件工程学习笔记<目录> 需求工程师 当代的需求工程师需要具备的能力 当代的需求工程师需要努力的方向 当代的需求工程师需要注意的错误 需求的定义 需求目标 需求分析的实质 需求分 ...

  5. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

  6. 基于I2C总线的MPU6050学习笔记

    MPU6050学习笔记 1. 简述 一直想自己做个四轴飞行器,却无从下手,终于狠下决心,拿出尘封已久的MPU6050模块,开始摸索着数据手册分析,一步一步地实现了MPU6050模块的功能,从MPU60 ...

  7. 大数据学习笔记:Hadoop生态系统

    文章目录 一.Hadoop是什么 二.Hadoop生态系统图 三.Hadoop生态圈常用组件 (一)Hadoop (二)HDFS (三)MapReduce (四)Hive (五)Hbase (六)Zo ...

  8. UI学习笔记---EasyUI panel插件使用---03

    UI学习笔记---EasyUI panel插件使用---03 UI学习笔记---EasyUI panel插件使用---03 1.panel简单小例子 ------------------- 2.可以自 ...

  9. 我的Android进阶之旅------gt;Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

最新文章

  1. 360浏览器登录_360安全浏览器12下载-360安全浏览器12最新版下载
  2. linux-RPM安装
  3. 每日一皮:从项目的开始到结束,开发人员的变化...
  4. 通俗易懂详解Java代理及代码实战
  5. 用Scikit-learn和TensorFlow进行机器学习(五)
  6. 你们要的二维码测试点来了,扫它!
  7. pat 1006. 换个格式输出整数 (15)
  8. Go 性能优化技巧 4/10
  9. 文字处理技术:新布局思路验证成功
  10. 计算机本地用户和组winx,计算机(Winx系统)实用操作手册.doc
  11. 第1关:身份证归属地查询
  12. 常见元件、封装及尺寸
  13. 计算机右边键盘数字无效,巧妙解决电脑键盘右边的数字键失灵问题
  14. mysql 计算农历_公历转换农历算法
  15. 无情未必真豪杰,怜子如何不丈夫——愿天下有情人终成眷属
  16. linux环境下的进程
  17. Scratch2的鸡兔同笼
  18. 数据中的知识发现KDD和机器学习概念
  19. Java并发——AQS、AQS到底什么是AQS?这玩意干啥的?
  20. 免费的oa办公系统好吗?

热门文章

  1. php curl error code
  2. 土木工程模板计算机专业,土木工程专业职业生涯规划模板(5页)-原创力文档...
  3. 解决电脑插上充电器却充不上电的情况
  4. AutoCAD学习之基本操作学习笔记
  5. tp6隐藏省略去掉url里的index.php路由前缀
  6. 计算机知识大全的软件有什么区别,硬件和软件的区别是什么
  7. Linux查看系统资源占用
  8. ef mysql跟踪sql语句_EF Core 日志跟踪sql语句
  9. 小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
  10. oracle一条sql运行时间很长,oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析...