Boost C++ 库

...世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

特性模型图在文本和 HTML 中

作者:Beman Dawes

引言

在他们具有开创性的著作《生成式编程》中,Czarnecki 和 Eisenecker(C&E))描述了如何构建特征模型 [C&E 4.4],该模型包含一个特征图以及语义、原理和其他属性。特征模型随后用于驱动设计周期,最终导致手动或自动配置的组装。

特征模型提供了一种语言来描述库的可变性,而这在 boost.org 的讨论中经常是一个问题。沃尔夫假说认为“语言塑造了我们的思维方式,并决定了我们能够思考什么”,这似乎也适用。在讨论库可变性问题时,我们一直受到缺乏良好语言的困扰。有了特征模型,我们现在有了进行对话的语言。

C&E 所提出的图形特征图不适合 boost.org 依赖的电子邮件讨论。特征图的层次结构可以通过简单的基于文本的特征图语言来表示。特征模型还可以利用 HTML 中固有的超链接。

语法

特征图语言的语法是用扩展巴科斯-诺尔范式表示的;::= 表示产生式,[...] 表示选项,{...} 表示零个或多个实例,| 表示备选方案。

feature-model       ::= concept-name details { feature }

feature             ::= feature-name [details]

details             ::= "(" feature-list ")"      // required features
                      | "[" feature-list "]"      // optional features

feature-list        ::= element { "|" element }   // one only
                      | element { "+" element }   // one or more
                      | element { "," element }   // all
                                                  // [a+b] equivalent to [a,b]

element             ::= feature
                      | details
concept-name        ::= name

feature-name        ::= name

通常的词法约定适用。名称不区分大小写,由一个引导字母,后跟字母、数字、下划线或连字符组成,不允许空格。

每个名称至少应该有一个实例链接到相应的 特征描述

虽然语法旨在用于人与人之间的书面交流,但它也可以很容易地由机器解析,供自动工具使用。

描述信息与每个概念或特征相关联。根据 [C&E 4.4.2],这包括

  • 语义描述。
  • 原理。
  • 利益相关者和客户端程序。
  • 示例系统。
  • 约束和默认依赖关系规则。
  • 可用性站点、绑定站点和绑定模式。
  • 开放/封闭属性。

什么是特征?

特征 [C&E 4.9.1] 是“用户或客户端程序可能希望控制有关某个概念的任何内容。因此,在特征建模过程中,我们不仅记录了功能特征……,还记录了实现特征……、各种优化、替代实现技术等等。”

示例

special-container ( organization,
                    performance,
                    interface  )         // all required

organization [ ordered + indexed ]       // zero or more (4 configurations)

indexed [ hash-function ]                // zero or one  (2 configurations)

performance ( fast | small | balanced )  // exactly one  (3 configurations)

interface ( STL-style + cursor-style )   // one or more  (3 configurations)

应该为 some-container、organization、ordered、indexed、hash-function、performance、fast、small、balanced、interface、STL-style 和 cursor-style 提供特征描述。

如果假设没有约束,则可能的配置数量为 (2 + 2*2) * 3 * 3 = 54。

存在等效的表示。例如

special-container ( organization[ ordered+indexed[ hash-function ]],
                    performance( fast|small|balanced ),
                    interface( STL-style+cursor-style ) )

参考文献

Krzysztof Czarnecki 和 Ulrich W. Eisenecker,《生成式编程》,Addison-Wesley,2000 年,ISBN 0-201-30977-7