一.前言 本单元作业都是关于JML(Java Modeling Language),JML是一种契约式设计(Design by Contract)的语言,契约式设计的主要目的是希望程序员能够在设计程序时明确地规定一个模块单元(具体到面向对象,就是一个类的实例)在调用某个操作前后应当属于何种状态,它强调三个概念:前置条件,后置条件和不变式,要求输入的参数满足前置条件,要求函数完成时的状态满足后置条件,要求函数开始运行和结束运行时满足不变式,即对调用者来说不变式总是为真,而对函数内部来说不变式可以为…
契约式设计可以理解为正则编程的一种实践: 如果用我的三脚猫能力将这种实践方法形式化的话,大致如下(如有不正确处,请不吝指正): 1.对于方法Method的precondition & postcondition: Function(RegularMthod) = ^ RegularFunction ^ General-Class-Method ^ Assert(precondition) ^ Assert(postcondition); => f1( f2 ) { f1, f2 : Regu…
契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证.因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的.否则,将返回异常或错误并在方法中进行处理.要了解更多关于DBC的内容,可以访问wikipedia.  在我们的示例中,输入参数很可能为null.由于没有进行验证,该方法最终会抛出NullReferenceException.在方法最后,我们也并不确定是否为用户返回了一个有效的Double,这可能导致在别的地方引入其他方法. ) ) t…
契约式设计6大原则的理解 在<Design by Contract原则与实践>中,作者定义了契约式设计的6大原则: 区分命令和查询: 将基本查询和派生查询区分开: 针对每个派生查询,设定一个后验条件,使用一个或多个基本查询的结果来定义它: 对于每个命令都撰写一个后验条件,规定每个基本查询的值: 对于每个查询和命令,采用一个合适的先验条件: 撰写不变式来定义对象的恒定特性. 前面5个针对operation层面而言,不论是面向对象也好,面向过程也好,函数式也好,都可以适用.最后1个针对data层面…
OO第三单元博客作业--JML与契约式编程 OO第三单元的三次作业都是在课程组的JML规格下完成.完成作业的过程是契约式编程的过程:设计者完成规格设计,实现者按照规格具体实现.作业正确性的检查同样围绕规格进行:主要验证作业是否严格按照规格实现. 课程组承诺如果作业严格实现规格,作业的正确性就没有问题.此即是契约式编程的意义之一:工程的每一个环节都有人负责,兼顾高效性和正确性. JML基础 JML(Java Model Language)是一种建模语言,用形式化的符号语言对Java的类和方法进行描…
OO第三单元小结 一.JML语言理论基础及工具链梳理 在本单元我们学习了JML语言的一些基础知识,能够让我们看懂简单的JML规格并写出对应代码, 主要用到的知识点有:   1.requires 该子句定义了方法的前置条件   2.\old(exp),表示执行相应方法前表达式exp的取值   3.assignable子句,列出方法修改的类成员属性.   4.ensure子句,定义了后置条件,如返回的结果或者该方法运行后的逻辑结果等等   5.\result表达式,表示方法返回的逻辑上的正确的结果…
陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输…
Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of "assert" in Python? - Stack Overflow https://stackoverflow.com/questions/5142418/what-is-the-use-of-assert-in-python 7. Simple statements — Python…
一.JML理论基础及应用工具链情况 理论基础 1.JML表达式 \result:表示方法执行后的返回值. \old(expr):表示一个表达式expr在相应方法执行前的取值. \foall:全称量词修饰的表达式. \exists:存在量词修饰的表达式. <==>:等价关系操作符. ==>:推理操作符. \nothing:变量引用操作符,指示一个空集. \everything:变量引用操作符,指示一个全集. 2.方法规格 requires:表示前置条件(pre-condition). en…
郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统MenuOS 一.Linux内核源代码简介 三个法宝和两把宝剑: (1)       三个法宝:存储程序计算机.函数调用堆栈.终断 (2)       操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场).进程上下文的切换 arch/x86目录下的代码是我们重点关注的 init目录:内核启动相关的代码基本都…