测试实际上就是对程序进行的一种黑箱测试,利用各类各样的测试样例去检验程序是否可以给出正确的结果。其中的单元测试则是将总体的测试拆分红单元来进行,但其仍然躲不开黑箱测试的形式。而正确性论证虽然也是从各个方法入手,但其并非盲目的对比输入输出是否同样,而是从逻辑上梳理某个方法运行过程当中仅可能出现的输入(即前置条件)和针对这些输入仅可能给出的结果(后置条件),从而在确保各个方法实现均正确的状况下将其组合起来成为一个正确的系统。编程
从效果上来说测试因为并不能穷举全部的状况,而正确性论证我认为其实是对各类状况的抽象和归类,从而将无穷变为有穷,其效果也明显优于测试。但正确性论证若是要梳理清楚各类逻辑的关系,其复杂程度要高于测试不少, 所以作起来也相对复杂,测试只须要设计各类测试样例而且自动运行查看结果便可,相比而言较为简单。数组
OCL (Object Constraint Language) 即对象约束语言,是一种指示用户建模系统中的限制方式,它是UML可选的附加内容,能够用来更好的定义对象的行为,并为任何类元指定约束。微信
OCL是一种精确无二义性的语言,而且是一种规范说明性语言,可以用来约束UML图中的对象。多线程
相同:并发
均使用了数学的方法(谓词逻辑、集合论)来表达对对象和方法的约束,都采用了天然语言和数学符号折衷的方式模块化
均是一种声明式的语言,即内容中不包含具体实现单元测试
都包含前置条件和后置条件的声明,也都包含不变式相关逻辑学习
不一样:测试
OCL中没有JSF的MODIFIES,但多出了“监护规则”。除此以外OCL很是注重类型的声明,而且细化了各类容器,相比之下JSF均抽象为数组来表达了。线程
第一单元我认为主要是初步认识面向对象思想,掌握类属性方法等元素以及继承、多态等OO的基本思想,顺便学会如何使用Java编写OO程序。第二单元主要面向OO当中的多线程编程,在前一个单元的基础上利用面向对象的方式编写多线程程序。第三单元主要是JSF的引入,以及设计方面的更高级要求(如SOLID、规格)。第四单元则是对于测试和正确性论证的学习,即一个程序写到最后要确保写的是对的。
这四个单元我认为前两个单元主要更侧重编程技术方面,实际上学习多线程编程除了掌握并行的思想外,更重要的实际上是怎么在多线程如此混乱的状况下让程序跑出本身想要的结果(想起了OS中的互斥和同步的关系),于是技巧方面更重一些。然后两个单元则更侧重设计以及编程以后验证的部分,前者让咱们养成良好的设计思想,我认为规格化的开发思想在程序规模增大的时候才能体现其优点;然后者让咱们确保了本身程序写的是对的,可以通过各类各样的检验。
一个学期以来写了多项式、电梯三部曲、IFTTT、出租车四部曲这么多程序,能够说进步应该仍是有的。
从设计和代码质量上,一开始代码耦合高,第一次ALS电梯一个方法有200行,到后来程序逐渐变得层次清晰,最后第13次和14次做业对电梯进行了解耦,将原先200行的方法拆分红不少个,每一个的行数都较短。原先由于DRY作的很差,重复代码较大致使常常出现改一处忘了改另外一处的状况以后也变得不多了。
虽然第一单元的程序几乎没什么bug,但设计思路方面的不清晰致使多线程部分有所翻车,但在对程序的构思逐渐造成合理的模式后,这种状况在出租车有了很大改善。
我是从大二才开始据说“工程化思想”这一词的,印象最深入的实际上也是上学期的计组,老师不断的强调“工程话思想”。实际上工程化思想我认为只有当程序须要达到必定规模时才能看出其优点,不管是这学期OO到最后代码量很大的出租车仍是上学期完成的计组实验均可以说明这一点,而这二者相比于真正的工程而言更是小巫见大巫。
虽然到如今为止我尚未接触过真正的工程化开发,对于做业也仅仅是利用了一点“思想”而已,所以个人理解还只能停留在空想的阶段。我理解的工程化开发,首先是一种模块化的设计,整个程序是由多个模块构成的,这些模块知足所谓的“高内聚、低耦合”关系,单独来看虽然不能作什么但组合到一块儿才能完成很复杂的工做。其次做为一个“工程”,一定是一个相对长久的概念,所以须要不少我的“前仆后继”的进行努力。所以在工程化开发中我认为规格很重要。如何让你们编程的点子统一块儿来,同时让你们编写的一个个”模块“最后能顺利的组合在一块儿是一个须要重视的问题。规格设计以及接口这一律念在其中充当了很是重要的角色。
1. 在写做业的时候不少问题我都是从同窗的口中得知在”他们班的群里“助教说了什么什么要求,不少时候这些要求没有被通知到,也出现了最后申诉中两人互飙微信群截图的状况。但愿能够有一种统一的要求通知机制(好比对于各类问题能及时梳理到issue),可以统一口径而且减轻助教答疑和同窗们追问的压力。
2. JSF方面首先我感受能够借鉴一下OCL语言,例如其中的各类容器。其次课件中常用多项式以及数组等等来举例子,在这些方面的确JSF能够清晰的表达规格,但对于出租车等复杂逻辑而言没有很好的参考价值。但愿课上能多一些较为复杂的例子。
3. 多线程其实在这个课程中的位置稍显尴尬,的确很重要,但也致使学习曲线较为陡峭。本学期中期OS课上咱们也接触了不少并发相关的概念,其中PV操做讲的那些并发经典例子其实对多线程理解有很多帮助。第一次多线程电梯以前那节多线程的课对于多线程电梯来讲有点“不够”,致使多线程电梯写的云里雾里。但愿在多线程的起步教学这方面能够增长一些内容帮助理解。