第四次博客作业

一、测试与论证

1、测试是从实践检验真理的维度对程序的各方面进行有效性验证,常用的方法是通过对输入的划分进行覆盖性测试,模拟实际的使用情况,验证其功能性,鲁棒性和安全性等等。

一个好的覆盖测试对问题的揭露是直接而有力的,其纠错能力是毋庸置疑的,相较于正确性论证,测试具有更好的可操作性和可实现性。

但显然这也是一种具有暴力美学色彩的枚举式方法。在已知的方面,一个大工程所实现的功能是强大广泛的,那么对应的输入等各方面测试也将是巨大的,对人力物力都是一个考验。而在未知的方面,我们无法完全覆盖到用户在实际的使用中对软件究竟会使用怎样意料之外的打开方式。

2、正确性论证是在理论高度上对程序作出客观的评测,通过纯粹的逻辑推理和数学表达式论证程序设计的原理正确性。在理论上,理论论证的结果是无懈可击的。也就是说,论证可以找出所有的问题并对程序的正确性作出保证。这是暴力枚举的测试无法做到的。

然而如何进行论证本身就是困难的,对于一个庞大的软件工程的逻辑实现完全转化为数学定义与逻辑表达式是不现实的。这也造成实际的理论证明在理论深度和依赖度上是不够的。这样作出的理论论证也是不够完美的。

二、OCL语言

OCL(object constraint language)对象约束语言,用来进行约束定义的,形式化的无二义的语言。主要是在建模时作为图形符号的补充,说明建模元素的有关细节,例如:约束,前置条件,后置条件等。

OCL可以描述四类约束,分别是不变量、前置条件、后置条件和监护条件。

(1)不变量是在属性的生命期内一直保持为真的规则。

(2)前置条件是在一个操作被调用时必须为真的约束。它是一个断言,不是可执行语句。

(3)后置条件就是在操作完成时必须为真的约束。它不是可执行语句而是断言,必须为真。

(4)监护规则是在对象能够从一种状态转变为另一种状态前其值必须为真的约束。

相同点:

(1)功能的相似性:OCLJSF都是形式化的约束语言,在程序中对各种约束条件啊作出完备的无二义的逻辑约束。

(2)结构的相似性:OCL主要包括不变量,前置条件,后置条件以及监护规则。JSF对应有repOK()REQUIRESEFFECTS以及MODIFIES

不同点:

(1)作用的时空不同:OCL主要用于理论建模时对类图等作出更明确的细节约束。JSF主要用于程序功能实现时的正确性约束。

(2)完备性:感觉OCLJSF要完备一些,理论基础更强大稳固。

三、UML类图

四、顺序图 

五、状态图

 

六、学习总结

知识梳理

1、第一单元主要是初步建立面向对象的编程思想。首先是在实践中熟悉java编程及其基本语法等。在理论上主要包括两大方面,一是类的抽象,二是类的继承。例如类的抽象中应注意高内聚,低耦合等基本原则。

2、第二单元主要是线程安全问题。多任务高请求是当前软件的重要需求之一,多线程扮演了重要的角色。在多线程中,线程安全则又是重中之重。为了保证线程安全需要熟练掌握各种锁的灵活运用。

3、第三单元主要是规格化设计。随着软件工程越来越庞大,为了能更好的协作写出更优质的代码,需要对程序设计作出规格化的约束。JSF形式化语言通过REQUIRESMODIFIESEFFECTES以及repOK()不变式对一个方法的正确性作出统一规格的约束。而整体应当符合solid原则。

4、第四单元主要是自动化测试与正确性论证。程序员有必要保证一份代码的正确性,这一单元提供了程序验证的两套方法,一种是基于输入划分借助软件生成的自动化覆盖测试,另一种是在JSF规格化设计的基础之上,在理论层面论证程序的正确性。

程序梳理

1) 多项式计算

2) 傻瓜电梯

3) ALS可捎带电梯

4) 多线程ALS可捎带电梯

5) IFTT文件监控

6) 出租车模拟

7) 可开关道路的出租车模拟

8) 带红绿灯的出租车模拟

9) 可追踪出租车模拟

  在程序设计上,类的抽象与分工更明确,主要体现在后面几次作业中对程序功能的顺利扩展上,没有出现牵一发而动全身的情况。在最后一次编程作业中,对之前的电梯程序代码进行了重构,大幅删减了繁复不必要的代码,精简方法逻辑,注意方法间的平衡,极大的增强了代码的可读性以及可维护性。

  在测试上,撇开之前的盲测,系统的了解了对输入进行划分的测试分支树,以及依靠软件支持的单元自动化测试。在理论上,了解了正确性论证的基本思路和原理。

  在代码质量上,个人能明显感觉到和开学特别是大一时候的区别,程序逻辑划分更加清晰,功能分配更合理,代码变得精炼,可读性更强。以前的程序码只图一时爽,爽后就不能再爽了甚至是痛苦,逻辑凌乱,全局变量管理混乱,方法功能不完备。

工程化开发

工程化开发是团队合作开发,注重功能分工和对接,注重代码的功能性,要求代码的易读性和易维护性,注重代码的规格统一性。

在开发前要做好的充足的设计论证,一个好的设计会带来加速型的回报。

在分工中,注意各模块间的接口统一,可替换性等。

编写代码中,要注明各种规格条件等,并按照一定的约束条件保证代码的正确性。编写的代码封装性要强,可读性要强,因为在团队中,代码不只是写给自己看的,在协作时还需要互相阅读了解对方的代码。这就要求开发人员要按照实现约定好的规格严格要求自己,不可随意编写。

开发完成后,要对程序做充分的测试,以方法为单元的单元化测试,按输入划分的覆盖性测试,以及在设计规格基础上的正确性论证。

 

posted @ 2018-06-23 22:14  何方程  阅读(138)  评论(0编辑  收藏  举报