0.前言
嗯,抛开U3学习过程一些影响学习体验的意外因素,我个人认为JML的思想还是有一定可取之处的。
层次化设计中,类向外界提供的接口如何设计的易用?使用者调用时怎么能确认方法正确实现了需求,如何甄别其副作用?
U1单元时我学习到了命令-查询分离原则。这是一种在副作用与返回值之间的契约。它能在一定程度上避免我们调用接口时产生副作用,缺点也显而易见:不够灵活。所以,发明一种特殊的语言,来约定方法作用,应是一种理所应然的尝试。带着上述的问题,我在学习过程中不断体会,也可以说是有所收获。
值得一提的是,契约式编程的思想最早正是由 Bertrand Meyer提出。而我在U1时学习的那本《面向对象式软件构造》,正是他提出这种契约式编程的著作。想起来颇为感慨。
1.测试过程
1.1黑箱测试与白箱测试
进行黑箱测试时,测试者站在用户的角度。不关注代码的具体实现,只根据软件规格说明书等文档来检验软件的输出需求。此外,还会关注用户交互体验感,以及运行效率等因素。测试者可能会针对不同需求构造测试数据,来进行边界条件测试,压力测试,错误处理测试等,检验软件在实际使用过程中的表现。
进行白箱测试时,测试者主要从开发者(程序员)的角度出发,通过静态检查,单元测试等方法,关注软件实现的内部逻辑,算法、数据结构等,以及是否能有效覆盖各个代码路径。主要指标为代码覆盖率、路径覆盖率,错误处理等。白箱测试是针对方法本身进行检测或优化的手段,需要检测者对整个系统以及代码实现细节具有较好的掌握。当我们站在整个系统的视角下审视某个方法,或者需要进行优化,白箱测试就比较有用了。
1.2具体测试方法
-
单元测试:单元测试用于检验程序中的最小可测试单元——通常是函数、方法或类。由于如果开发完成后整体调试想必会十分困难,所以对单元进行测试可以按模块检测正确性,降低了复杂度。
-
功能测试:基于黑盒测试实现,检查软件是否能正常实现功能,正常进行错误处理,在压力测试下性能表现如何,以及性能如何。
-
集成测试:模块生产完后当然要组装才能成为产品,对于产品整体也当然需要进行。可以验证各模块之间是否正确协作。
-
压力测试:通过模拟高负载运行条件检测软件实现。如高并发访问,大数据量处理,长时间运行以及异常情况处理。由于软件在交付使用时可能面临类似情况,所以有必要进行压力测试。
-
回归测试:确保更新或迭代有没有对原有方法造成影响,比如修改了原有方法依赖的数据结构等。而软件最好做到对扩展开放,对修改关闭。
1.3数据构造策略
(没搭评测机)但作业中主要应该关系压力测试,避免TLE的出现,以及对边界条件的检测。啊啊啊啊可恶的负数ID!
2.架构设计与图维护
在第三单元中,主要架构被JML已经被JML设计好了。由于在Person中管理acquaintance, 所以实质上是使用了邻接表存储。更总体一点,本单元主要架构如下:
Network中只保管着Person和未发送的Message。而每个Person负责管理自己的tags、acquaintances和messages. Tags里再管理其中的Person.
3.性能分析与实现设计相分离
倒是没出过什么性能问题说一下实现的优化吧
-
第九次作业中,主要是引入了并查集维护关系网络,便于检查blockSum,在mr时为了避免不必要的维护并查集选择脏位推迟维护;对于三元环数量选用动态维护,每次ar或mr时遍历公共熟人加以修改。
-
第十次作业中,主要是使用大顶堆维护Person的熟人队列,这样修改BestID时复杂度为O(ln n)。同时对Tag中的Age等信息进行动态维护。
-
第十一次作业并未用到优化算法,但是addMessage消息方法中使用了Linklist来存储消息。
设计与实现相分离,对于开发者自身,对于与开发者协同的其他开发者、测试者来说都具有意义。
对于开发者自身,可以自由采取实现方式,只需要保证对外提供的接口功能正确即可。减小了模块与其他部分的耦合度,也使得软件功能可以被充分优化。
对于其他软件开发者以及测试者,规格的出现允许并行开发的实现。各开发人员可以各司其职,,最终将各模块合并。
4.Junit测试
既然JML指示了方法的实现,那我们也必然依据JML编写JUnit。依据JML,我们能分析出待检测方法的期望功能,并针对性构造测试。也就是检测在输入数据满足前置条件时,该方法是否满足了后置条件。
当方法有前置条件时,数据满足前置条件才要进行后续检测。在整个检测过程中,需要纳入考虑范围的有三个因素:后置条件,可修改范围内的数据,不可修改范围内的数据。
后置条件需要保证满足,可修改范围内的数据,按后置条件修改;不在可修改范围内的数据也需确保不被修改。
5.学习体会
前两个单元让人欲罢不能,而第三单元如缓冲剂般,给了我们反思与总结的时间。我在前两个单元中积累的一些问题,在第三单元中得到了解答。系统应如何层次化的设计?我似乎更加清晰了。
OO这门课想让学生们学的,我想我已经学到一些了。U4,真有些迫不及待呢~