1. Graph<L>
- 可变类型:顶点和边可以在图中添加或删除
- 有向边:边从源顶点到目标顶点
- 加权边:边与正整数权重相关联
- 标记顶点:顶点通过某种不可变类型的标签来区分,如它们可能有姓名String或身份IDInteger
Graph<L>是一个泛型,对Graph<L>的规约是L为不可变类型。客户试图使用可变顶点标签就违反了先决条件,得不到期待的正确行为。
2.GraphPoet
实现GraphPoet这个使用单词关联图生成诗歌的类。
问题1 :测试Graph<String>
设计、记录和实现Graph<String>。
目前只测试(然后实现)带有String类型标签的图,之后扩展到其他标签。
- GraphStaticTest.java中包含对于静态Graph.empty()方法的测试策略和测试。Graph.empty()是静态的,只需实现一次,测试只跑一次。已提供了这些测试,可以自由更改或添加,但对于此问题,可以让它们保持原样。
- 在GraphInstanceTest.java中写你自己对于所有实例方法的测试策略和测试方法,必须使用emptyInstance()方法而不是Graph.empty()来获取新的空图,已给出的testInitialVerticeEmpty()作为参考。
与GraphStaticTest不同,GraphInstanceTest不能直接运行,它有一个空白等待填充:emptyInstance()将提供Graph空对象。下一个问题中,将看到两个子类的GraphInstanceTest通过返回不同类型的空图来填充空白。
GraphInstanceTest必须是Graph声明。
我们要用String标签实现加权有向图两次
- 记录抽象函数和表示不变量
- 在表示不变量中,记录类型如何防止表示暴露
- 实现checkRep检查表示不变量
- 用一个有用的可读的抽象值的表示来实现toString
所有类都要有清楚的规约,这意味着每一个方法都必须有Javadoc comment,除非你使用@Override
ConcreteEdgesGraph和ConcreteVerticesGraph不相关且无共享代码。
ConcreteEdgesGraph中必须使用提供的rep,不可以在rep中添加属性,必须使用到每一个属性。
Edge类:可以定义规约和变量,但必须是immutable类型。
如果比较边的话,需要自己实现观察器,不可以使用equals。
重写toString,必须使用@Override。
你应该加强ConcreteEdgesGraph.toString的规约,在ConcreteEdgesGraphTest.java中为它写测试,不必将这些测试写到GraphInstanceTest。