4.6.2 使用更加困难
效率通常会制约程序使用的容易性。假设我们的程序库用户需要一个函数,它返回所给节点的入射边集合;那么,最优雅的接口将会返回一个包含Edge对象的Set集合:
- template<class T>
- class Node {
- public:
- Set<Edge<T>*> incident_edges() const;
- //...
- };
如果Node类是用Incedges类实现的,那么incident_edges函数的实现就必须进行一次转型:- template<class T>
- Set<Edge<T>*>Node<T>::incident_edges() const {
- //把Incedges对象转型为Set对象。
- //...
- };
而当使用Set类来实现Node类时,我们并不需要这样的转型。
另一种实现方法是,我们可以把类Incedges转移到程序库的接口中,即让Node::incident_edge函数返回一个Incedges对象:而不是一个Set对象;这样我们就可以不进行转型,从而减少了由转型带来的运行时间开销:
- template<class T>
- class Node {
- public:
- Incedges<T> incident_edges() const {
- return incedges;
- }
- private:
- Incedeges<T> incedges;
- //...
- };
遗憾的是,我们的程序库现在变得更难使用了。用户现在必须知道具有特殊用途的类Incedges;而且,用户代码的编写也变得更加困难;就如前面小节的is_adjacent函数一样,incident_edges函数的编写也变得更加困难了。