哈工大2019软件构造期末考试题涉及了软件构造、面向对象设计、单元测试、异常处理等多方面的知识点。在本场考试中,学生们需要运用他们的理论知识和实践能力来解决一系列与软件开发过程紧密相关的实际问题。

  1. 考试涉及到了软件构造的基本概念,特别是build-time view(构建时视图)与moment-in-time view(即时视图)的区别。构建时视图关注软件的静态结构,通常在构建过程中考虑;即时视图则关注软件运行时的动态行为。例如,代码快照(CodeSnapshot)属于构建时视图,测试用例(TestCase)属于即时视图。

  2. 单项选择题中还涉及到在不执行正在开发的软件代码的情况下获得结果的工具或命令。这体现了对静态代码分析工具的了解,例如JunitEclEmma用于单元测试,CheckstyleGit Commit用于代码风格和版本控制。

  3. 关于不可变性(immutability)可变性(mutability)的概念,考试题考查了学生对Java中对象属性的理解。例如,被staticfinal修饰的Java对象不可变,而采用State设计模式的对象是可变的。此外,Collections.unmodifiableList()返回的列表对象是不可变的,保证了程序运行期间内容不会变化。

  4. 针对抽象数据类型(ADT),考题关注了表示(Rep)、抽象函数(AF)和表示不变式(RI)。Immutable类的对象一旦创建后其表示就不能发生变化,而Rep Exposure仅对不可变ADT有意义。此外,AF是关系,具有满射、双射特性;RI是对对象表示的约束,满足RI的对象才是合法的。

  5. 方法规格(spec)的准确描述在软件工程中至关重要,涉及前置条件和后置条件的定义。考试题涉及了方法规格书写的不当之处,例如,若客户端传递的参数不满足前置条件,方法可以直接退出或返回一个异常。

  6. 重写(Override)方法时,需要遵循Java的重写规则,例如覆盖的方法必须具有相同的方法签名,返回类型必须相同或为子类。考题中提到的public Numberinfo(Set a)方法的合法重写包括public Numberinfo(HashSet m),这表示集合的类型参数是Number或者Number子类的超类型。

  7. 关于ADT的equals和hashCode方法,考试题探讨了它们之间的正确关系。例如,如果两个不可变的ADT对象的hashCode值相等,那么它们的equals方法也应该返回true。equals方法重写时必须比较对象的表示中每一个域的值是否相等。

  8. 断言(assertion)与异常(exception)是程序调试和错误处理的重要工具。考试题中提到了assert语句可能对性能造成影响,因此在生产环境中通常会关闭assert语句以提高性能。异常处理要求开发者能够合理使用try-catch-finally结构来处理可能出现的异常情况。