产生式编程(Generative Programming)方法介绍

简介:

软件业对软件工程期望之高,涉及高度的复杂性,高效的生产效率和质量,以及便于有效地维护和改进。但是,当前的软件工程并不能满足这些目标,现在很多开发更像手工作坊的“一种一个”的解决方案,而不像一个成熟的工程,而模型驱动和产品线工程就是应对这些问题的方法。在模型驱动开发(MDD)介绍中介绍过现在存在多种模型驱动开发方法,而Generative Programming - Mehtods,Tools and Applications这本书主要介绍这个方法,我觉得该书的第一部分不错,提出了非常值得注意到领域工程和元程序设计,让我对产品线工程有更好的认识,所以本篇主要结合这本书来给大家介绍一下产生式编程这个方法。

  在软件中,向自动化制作软件的方向转变需要经历两个步骤:

  1. 把焦点从开发一个系统转移到开发一个系统族上来:开发出正确的共性组件
  2. 使实现组件的装配自动化:使用产生器达到自动化

  我感觉它可以作为产品线工程的一种软件工程方法,产生式编程就是设计实现组件,使之适应于通用产品线结构,同时对配置知识建模,强调如何把抽象的需求转变成特定的组件群,并且使用产生器实现配置知识,通过这些工作来解决前面说的高复杂性、高效率和高质量等问题。

产生式编程是什么?

  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),它不是从头构造一个单独的系统族成员,而是基于一个通用的产生式领域模型。模型由三部分组成:

  1. 指定系统族成员(问题空间 problem space
  2. 组装出每一个成员的实现组件(解空间 solution space
  3. 在问题空间和解空间之间的配置知识映射关系(配置知识
  • 为重用而开发以及使用重用的开发

  框架和组件现在被认为是获取软件重用的最有效的技术,但不幸地是,没有一种OO的分析和设计方法来支持它们的开发。GP包含了两个重要的完整开 发循环:一个设计和实现一个产生式领域模型(为重用而开发);另一个是使用产生式模型制作具体的系统(使用重用的开发),这个其实在我之前的产品线系列blog中也介绍过。

  • 确定一个系统族范围

  为重用而进行的开发目标集中于系统族,它的第一步包括确定感兴趣的家族范围,就是说,决定应该包括哪个特征,不应该包括哪些特征。这就要求分析项目风险承担者和他们的目标、当前和潜在的市场、技术预测等等。

特征建模

  特征模型代表了领域工程对软件工程的重要贡献,并且对产生式程序设计来说是必须的。确定系统族范围的下一步就是确定家族成员的共同特征和差异特征,以及差异特征之间的依赖,也就是分析出产品的721。特征建模可以让我们以一种结构化的方式来记录分析的结果,支持可变性管理。它具有以下优点:

  1. 以明确的方式表示可变点(variation point)和它们之间的依赖性。这种表示提供了取得一个系统族的视线组件类别的基础,并提供了指定家族成员和配置知识的方法。
  2. 区分在一个家族成员内部和家族成员之间的差异
  3. 提供了一种与实现无关的表示差异性的方法,这使得可以在分析模型之外做出关于差异性机制的决策

领域工程是什么

  • 领域工程

1.        纵向领域(verticaldomain):根据系统类别而组织的领域。如预算软件、材料管理、合同管理、企业报表系统等。

2.        横向领域(horizontaldomain):根据软件部件的类别而组织的领域。比如数据关系计算引擎、报表引擎、工作流系统等。

3.        领域之间有3中类型的关系:

a)        包含:比如成本管理软件包含了材料管理系统

b)        使用:比如公司大部分软件都使用了报表引擎

c)        类似:领域之间侧重点不同,但有很多的相似性,通过深入研究一个领域,可以取得对另一个领域的更好理解。比如报表引擎中对于表达式解析和索引部分可能与数据关系计算引擎类似。

  • 应用工程

应用工程是基于领域工程的结果构建系统的过程。对一个新的具体应用做需求分析的时候是利用已有的领域模型,通过领域分析提供的各种通用功能、支持的 变量配置、提供的扩展等来描述客户需要。如果新的需求在领域模型中不存在,则可以定制,或者反馈到领域工程来扩充领域的支持范围。

基于领域工程的软件开发(基于MBSE97)

  • 领域分析
    •   目的
      • 选择和定义要解决的领域
      • 收集相关的领域信息,把它整合成一个一致的领域模型
    • 通常的领域分析活动
  • 领域设计
    • 目的:开发用于领域中系统族的一个架构,并设计一个制作计划。生产计划的实现可能需要编写开发人员指南、实现领域特定的语言和订购GUI、产生器和一个支持组件检索、鉴定、分发等结构的重用结构,并且建立应用程序的生产过程
  • 领域实现
    • 使用合适的技术来实现架构、组件和过程计划

主要开发步骤

  1. 领域范围界定
  2. 特征建模和概念建模
  3. 设计一个通用架构和识别实现组件
  4. 为”定制“系统指定领域规范意义
  5. 指定配置知识
  6. 实现那些实现组件
  7. 实现领域特定符号
  8. 使用产生器实现配置知识

书中提到的其他技术

GP还提供的其他一些技术,这些东西我有些看不懂,下面知识罗列一下备忘而已:

  • 动态库和可扩展编程环境
  • 元程序设计和产生器
  • 面向方面的变成
  • 泛型编程
  • 协同工作的产生器










 本文转自 jingen_zhou 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/403114,如需转载请自行联系原作者

相关文章
|
算法 测试技术 vr&ar
Unity Vufoia+AR模型抖动的问题
**图像识别与跟踪精度问题**:Vuforia 依赖特征点检测,环境光线不稳定、目标纹理不丰富或遮挡会导致特征点匹配误差,引起AR模型抖动。跟踪丢失和重定位延迟也会导致模型不稳定。 **设备硬件与性能问题**:移动设备摄像头易受手持抖动影响,低性能设备无法及时处理图像数据,导致跟踪结果更新延迟。 **模型与坐标系问题**:AR模型重心设置不合理或坐标系转换误差,会使模型在虚拟空间中不稳定。 **算法与参数设置问题**:跟踪算法局限性和参数设置不合理(如灵敏度过高或平滑度过低)都会影响跟踪稳定性。 。
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
406 0
|
运维 安全 架构师
架构师工具箱:Well-Architected云治理提效实践
本次分享基于阿里云Well-Architected Framework的最佳实践案例,涵盖企业从上云到优化的全过程。安畅作为国内领先的云管理服务提供商(Cloud MSP),拥有800多名员工,其中70%为技术工程师,为企业提供架构安全、数据智能等技术服务。内容包括Landing Zone与Well-Architected的关系、企业云治理现状及需求分析,重点探讨了安全合规、成本优化、资源稳定性和效率提升等方面的最佳实践,并通过具体客户案例展示了如何通过自动化工具和定制化解决方案帮助企业提升云上业务价值。
|
机器学习/深度学习 数据采集 自然语言处理
如何使用 Word2Vec 模型进行情感分析?
【10月更文挑战第5天】如何使用 Word2Vec 模型进行情感分析?
349 3
|
Linux 开发者
【亮剑】Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件
【4月更文挑战第30天】本文介绍了Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件。flock适合脚本,fcntl提供底层灵活性,lockfile用于管理锁定文件,flockfile则结合两者功能。选择锁定策略时需考虑应用场景,如脚本可选flock,复杂需求则用fcntl。理解并正确使用这些工具对保证系统稳定性和数据一致性至关重要。
1300 1
|
设计模式
SpringMVC常见组件之DataBinder数据绑定器分析
SpringMVC常见组件之DataBinder数据绑定器分析
723 0
|
图形学 开发工具 git
Unity与版本控制:游戏开发团队如何利用Git打造高效协作流程,实现代码管理的最佳实践指南
【8月更文挑战第31天】版本控制在软件开发中至关重要,尤其在Unity游戏开发中,能提升团队协作效率并避免错误。本文介绍如何在Unity项目中应用版本控制的最佳实践,包括选择Git、配置项目以排除不必要的文件、组织项目结构、避免冲突、规范提交信息以及使用分支管理开发流程,从而提高代码质量和团队协作效率。
1627 2
|
前端开发 应用服务中间件 nginx
前端服务器部署方式
【8月更文挑战第25天】前端服务器部署方式
778 1
|
Ubuntu 开发工具 Android开发
Repo下载、编译AOSP源码:基于Ubuntu 21.04,android-12.1.0_r27
文章记录了作者在Ubuntu 21.04服务器上配置环境、下载并编译基于Android 12.1.0_r27版本的AOSP源码的过程,包括解决编译过程中遇到的问题和错误处理方法。
1330 0