决定如何将需求归纳为概念,并确定在每个算法中使用哪些概念,这或许是构建通用库最困难(但也是最重要)的部分。在此过程中,有一个指导原则,我们称之为需求最小化原则。
需求最小化原则:最小化对组件输入参数的需求,以提高其可重用性。
这一原则中存在一种天然的张力。根据定义,组件为了完成其任务,必须使用输入参数(此处“组件”指函数模板或类模板)。因此,挑战在于以某种方式实现组件,在完成任务的同时,对输入做出最少的假设(即最小化需求)。
传统的抽象概念直接与最小化需求的思想相联系。输入越抽象,需求就越少。因此,概念实际上就是 C++ 模板编程中通用抽象数据类型的体现。
在为某个问题领域设计概念时,牢记其目的是非常重要的,即表达组件输入的需求。就需求最小化原则而言,这意味着我们希望尽量精简概念。
概念的最小化属性与所表示问题领域的底层语义相关。在基本容器的问题领域中,要求单向遍历比要求双向遍历的需求更小(因此区分了 ForwardIterator 和 BidirectionalIterator)。这种语义上的差异可以很容易地从具备前向迭代器的数据结构集合与具备双向迭代器的数据结构集合之间的区别中看出。例如,单向链表属于具备前向迭代器的数据结构集合,但不属于双向迭代器集合。此外,仅使用前向迭代器能实现的算法集与使用双向迭代器能实现的算法集截然不同。正因如此,将需求族细分为更细粒度的概念非常重要。例如,迭代器的需求被拆分为六个 STL 迭代器概念(平凡、输出、输入、前向、双向和随机访问)。
| 版权 © 2000 | Jeremy Siek(jsiek@osl.iu.edu) Andrew Lumsdaine(lums@osl.iu.edu), 2007 David Abrahams. |