软件业对软件工程期望之高,涉及高度的复杂性,高效的生产效率和质量,以及便于有效地维护和改进。但是,当前的软件工程并不能满足这些目标,现在很多开发更像手工作坊的“一种一个”的解决方案,而不像一个成熟的工程,而模型驱动和产品线工程就是应对这些问题的方法。在模型驱动开发(MDD)介绍中介绍过现在存在多种模型驱动开发方法,而Generative Programming - Mehtods,Tools and Applications这本书主要介绍这个方法,我觉得该书的第一部分不错,提出了非常值得注意到领域工程和元程序设计,让我对产品线工程有更好的认识,所以本篇主要结合这本书来给大家介绍一下产生式编程这个方法。
在软件中,向自动化制作软件的方向转变需要经历两个步骤:
- 把焦点从开发一个系统转移到开发一个系统族上来:开发出正确的共性组件
- 使实现组件的装配自动化:使用产生器达到自动化
我感觉它可以作为产品线工程的一种软件工程方法,产生式编程就是设计实现组件,使之适应于通用产品线结构,同时对配置知识建模,强调如何把抽象的需求转变成特定的组件群,并且使用产生器实现配置知识,通过这些工作来解决前面说的高复杂性、高效率和高质量等问题。
产生式编程是什么?
Generative Programming is a software engineering paradigm based on modeling software system families such that, given a particular requirements specification, a highly customized and optimized intermediate or end-product can be automatically manufactured on demand from elementary, reusable implementation components by means ofconfigurations knowledge [CE00].
产生式领域模型
GP的目标集中于系统族,而不是一种一个的系统(one-of-a-kind system),它不是从头构造一个单独的系统族成员,而是基于一个通用的产生式领域模型。模型由三部分组成:
- 指定系统族成员(问题空间 problem space)
- 组装出每一个成员的实现组件(解空间 solution space)
- 在问题空间和解空间之间的配置知识映射关系(配置知识)
为重用而开发以及使用重用的开发
框架和组件现在被认为是获取软件重用的最有效的技术,但不幸地是,没有一种OO的分析和设计方法来支持它们的开发。GP包含了两个重要的完整开发循环:一个设计和实现一个产生式领域模型(为重用而开发);另一个是使用产生式模型制作具体的系统(使用重用的开发),这个其实在我之前的产品线系列blog中也介绍过。
确定一个系统族范围
为重用而进行的开发目标集中于系统族,它的第一步包括确定感兴趣的家族范围,就是说,决定应该包括哪个特征,不应该包括哪些特征。这就要求分析项目风险承担者和他们的目标、当前和潜在的市场、技术预测等等。
特征建模
特征模型代表了领域工程对软件工程的重要贡献,并且对产生式程序设计来说是必须的。确定系统族范围的下一步就是确定家族成员的共同特征和差异特征,以及差异特征之间的依赖,也就是分析出产品的721。特征建模可以让我们以一种结构化的方式来记录分析的结果,支持可变性管理。它具有以下优点:
- 以明确的方式表示可变点(variation point)和它们之间的依赖性。这种表示提供了取得一个系统族的视线组件类别的基础,并提供了指定家族成员和配置知识的方法。
- 区分在一个家族成员内部和家族成员之间的差异
- 提供了一种与实现无关的表示差异性的方法,这使得可以在分析模型之外做出关于差异性机制的决策
领域工程是什么
领域工程
1. 纵向领域(verticaldomain):根据系统类别而组织的领域。如预算软件、材料管理、合同管理、企业报表系统等。
2. 横向领域(horizontaldomain):根据软件部件的类别而组织的领域。比如数据关系计算引擎、报表引擎、工作流系统等。
3. 领域之间有3中类型的关系:
a) 包含:比如成本管理软件包含了材料管理系统
b) 使用:比如公司大部分软件都使用了报表引擎
c) 类似:领域之间侧重点不同,但有很多的相似性,通过深入研究一个领域,可以取得对另一个领域的更好理解。比如报表引擎中对于表达式解析和索引部分可能与数据关系计算引擎类似。
- 应用工程
应用工程是基于领域工程的结果构建系统的过程。对一个新的具体应用做需求分析的时候是利用已有的领域模型,通过领域分析提供的各种通用功能、支持的变量配置、提供的扩展等来描述客户需要。如果新的需求在领域模型中不存在,则可以定制,或者反馈到领域工程来扩充领域的支持范围。
基于领域工程的软件开发(基于MBSE97)
- 领域分析
- 目的
- 选择和定义要解决的领域
- 收集相关的领域信息,把它整合成一个一致的领域模型
- 通常的领域分析活动
- 目的
- 领域设计
- 目的:开发用于领域中系统族的一个架构,并设计一个制作计划。生产计划的实现可能需要编写开发人员指南、实现领域特定的语言和订购GUI、产生器和一个支持组件检索、鉴定、分发等结构的重用结构,并且建立应用程序的生产过程
- 领域实现
- 使用合适的技术来实现架构、组件和过程计划
主要开发步骤
- 领域范围界定
- 特征建模和概念建模
- 设计一个通用架构和识别实现组件
- 为”定制“系统指定领域规范意义
- 指定配置知识
- 实现那些实现组件
- 实现领域特定符号
- 使用产生器实现配置知识
书中提到的其他技术
GP还提供的其他一些技术,这些东西我有些看不懂,下面知识罗列一下备忘而已:
- 动态库和可扩展编程环境
- 元程序设计和产生器
- 面向方面的编程
- 泛型编程
- 协同工作的产生器