敏捷与结构性模块化(二) 研讨OSGi

在上一篇文章中,介绍了结构性模块化与敏捷之间的关系,在这个系列的第二篇文章中,我们将会研讨OSGi,在实现Java的结构性模块化方面,OSGi扮演了核心的角色;OSGi与流行的敏捷方法论之间存在着自然的联系。

1 但我们已经实现了模块化!

绝大多数开发人员都同意程序应该模块化。尽管在面向对象的程序设计出现的早期,逻辑性模块化的要求就被迅速满足了(见http://en.wikipedia.org/wiki/Design_Patterns), 但是软件行业花费了很长的时间才理解结构性模块化的重要性。特别是,结构性模块化可以提高程序的可维护性和灵活性,控制和减少环境带来的复杂性。

只是JAR文件的组合

在《Java Application Architecture》(本书已经由机械工业出版社引进出版,中文书名为《Java应用架构设计:模块化模式与OSGi》——译者注)一书中,Kirk Knoernschild探索研究了结构性的模块化,并建立了一套关于结构化设计的最佳设计模式。Knoernschild认为,在模块化风潮中并不需要开发模块化的框架;对于Java,JAR文件结构就足够了。

 

事实上,在“敏捷”开发团队中根据代码库的增长将应用分解为较小的JAR文件的做法并不罕见。随着JAR文件大小的增加,他们会被分解为更小的JAR文件的集合。从代码角度,特别是如果遵循Knoernschild的结构化设计模式,我们会认为,从某个结构层看,程序是模块化的。

 

但这是否敏捷?

从创建应用的团队,以及负责随后维护人员的角度来看,应用是更敏捷的。团队了解依赖关系,以及变化的影响。然而,这种知识并没有关联到组件上。一旦团队成员离开了公司,程序和业务就有可能立刻受到影响。同样,对第三方(即使是同一个组织的不同团队)来说,该应用可能依然是单独的巨大代码库。

如果程序中只有一层结构性的模块,它必然不是自描述的。由于缺乏描述模块之间内在关系的元数据,由此产生的业务系统本质上是脆弱的。

那么MAVEN呢?

Maven文档(项目对象模型,Project Object Model——POM)也能表达组件之间的依赖关系。这些依赖关系由组件的名称定义。

鉴于此,基于Maven的模块化程序可以被任何第三方很容易地整合起来。然而,在上一篇文章我们已经提到,由名称定义依赖关系是有缺陷的。由于组件之间的依赖关系并不能明确表明需求(Requirement)和功能(Capability),第三方不能推断出依赖关系的存在原因和可替代的部分。

程序可以被整合,但却不能变更。这种方式是否使得程序比之前的“JAR文件组合”更为“敏捷”还值得商榷。

对OSGi的需求

就如Knoernschild在《Java应用架构设计》中阐述的那样,一旦实现了结构性模块化,我们很容易就能将它迁移到OSGi 之中,也就是Java领域中的模块化标准。

OSGi不仅帮助我们保证结构性的模块化,它同时提供了必须的元数据来保证我们建立的模块化结构也是敏捷的结构。

OSGi通过需求和功能表达依赖关系。因此,第三方可以立刻知道哪些组件可能是可替换的。因为OSGi同样使用语义化的版本控制,所以第三方可以立即推测出,某个组件的变更是否有破坏系统的潜在危险。

OSGi同样也具有展现结构化层次的能力。

在模块化的一端,我们使用面向服务的架构(Service Oriented Architecture,SOA);在另一端,我们使用Java包和类。然而,正如Knoernschild表述的那样,在这两端之间缺少了必要的层次。

图1: 结构化层次:缺失了中间的部分(Kirk Knoernschild – 2012)

时间: 2024-10-29 05:49:48

敏捷与结构性模块化(二) 研讨OSGi的相关文章

敏捷与结构性模块化(三) 现实世界的挑战

现实世界的挑战:基于OSGi/Bndtools的开发.发布和版本控制的工作流程 该系列的第一篇文章介绍了结构性模块化和敏捷的根本性的关系,在第二篇中我们了解到如何使用OSGi实现高度敏捷和高度可维护的软件系统. 第三篇文章基于标题为"现实世界的挑战:基于OSGi/Bndtools的开发.发布和版本控制的工作流程"(Workflow for Development, Release and Versioning with OSGi / Bndtools: Real World Chall

敏捷与结构性模块化(一) 探讨结构性模块化和敏捷之间的关系

1 简介 敏捷开发方法论日益流行,然而大多数"敏捷"专家和分析师都在孤立地讨论敏捷,也就是说忽视了系统"结构"(Kirk Knoernschild是一个例外,他编写了一本名为<Java Application Architecture>的图书阐述这一理念).考虑到"敏捷"是基础实体的一个重要特性或属性,那么,这种疏忽令人感到很惊讶.一个实体要具有"敏捷"的特性,它必须具有高度的结构性模块化(structural m

模块化服务规范——OSGI

什么是OSGI OSGi(Open Service Gateway Initiative)有双重含义.一方面它指OSGi Alliance组织:另一方面指该组织制定的一个基于Java语言的服务(业务)规范--OSGi服务平台(Service Platform). OSGi Alliance是一个由Sun Microsystems.IBM.爱立信等于1999年3月成立的开放的标准化组织, 最初名为Connected Alliance.该组织及其标准原本主要目的在于使服务提供商通过住宅网关,为各种家

项目怎么实现“模块化”部署?

问题描述 比如一个系统包括"人员管理","设备管理","订单管理","库存管理"等内容,实际的项目可能不需要所有的功能,只需要其中一部分.现在所有代码都写在一起了,所有的表都在一个库里面,如果不需要某些功能 就是修改页面,把相关的链接去掉,页面上没了但是后台代码和数据库还有.如果想实现"模块化"部署,应该怎么重构,重构的思路什么? 解决方案 如果仅仅是模块化部署,使用maven足够了将各个子系统拆分成不同的

一种轻量级、可重用、可扩展的OSGi应用程序测试框架

引言 OSGi 是一个基于 Java 的,提供动态模块加载和管理的运行时框架,在业界已经得到广泛应用.OSGi 框架使用 Bundle 把复杂的应用程序模块化.在 OSGi 的框架中,Bundle 的生命周期由 OSGi 运行环境进行管理:Bundle 之间以松耦合的形式相互依赖:Bundle 有严格的访问安全限制.但也正是由于以上这些特点,给测试这些 Bundle 带来了很大的困难.许多测试用例要求被测 Bundle 及其依赖的 Bundle 同时运行于 OSGi 环境中:同时若需将测试代码和

初探Java企业级开源框架OSGi

第一次接触OSGi 是2006年看见的一则网上新闻,该新闻中提到BMW 汽车的通信-娱乐(infotainment)系统采用了OSGi 架构,这套系统主要用来控制汽车上的音箱.灯光.导航和通讯等设备,整个系统由1000多个模块组成,启动时间却只需要3.5秒钟,这对于一个基于Java 的框架来讲,具有两个重大意义:一.说明了Java 执行效率并不差:二.OSGi 框架的性能尤其优秀.因此笔者对OSGi 框架产生了极大的兴趣,后来终于在一个项目中负责研究和开发基于OSGi 框架的应用程序,从此对它便

使用.NET进行高效率互联网敏捷开发的思考和探索

不知从什么时候开始,创业变得很廉价,谈什么都是互联网,动辄融资千万.这阵风好像也刮向了程序员中,有那么一大批开发者,数据结构不好好学习.数据库原理不扎实掌握,在github上发布几个项目,用nodejs创建一些服务,再用H5写出APP,就自以为迈入了高级程序员的队伍,能够运筹帷幄互联网项目,难道学习新技术.新理念就是快速成长吗,显然不完全是,在这浮躁的氛围中,各种粗制滥造的互联网网站.APP接踵而至,很多看似漂亮的APP,连简单的http接口安全都没有措施应对,很多美丽的响应式网站,目录结构随意

《深入理解OSGi:Equinox原理、应用与最佳实践》一1.1 什么是OSGi

1.1 什么是OSGi OSGi(Open Service Gateway Initiative,直译为"开放服务网关")实际上是一个由OSGi联盟(OSGi Alliance,如图1-1所示)发起的以Java为技术平台的动态模块化规范. OSGi联盟是由Sun Microsystems.IBM.Ericsson等公司于1999年3月成立的一个世界性的开放标准化组织,最初的名称为Connected Alliance,该组织成立的主要目的原本在于使服务提供商通过住宅网关为各种家庭智能设备

敏捷软件开发宣言--常读常新

敏捷软件开发宣言 http://www.agilemanifesto.org/iso/zhchs/ 我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人.由此我们建立了如下价值观: 个体和互动 高于 流程和工具 工作的软件 高于 详尽的文档  客户合作 高于 合同谈判  响应变化 高于 遵循计划 也就是说,尽管右项有其价值,我们更重视左项的价值. Kent BeckMike BeedleArie van BennekumAlistair CockburnWard Cunningham