`
snoopy7713
  • 浏览: 1169123 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

我喜欢的软件体系结构——分层、模块化与OSGi

    博客分类:
  • OSGi
阅读更多
软件体系解构是一个比较抽象的概念,按我的理解,可以将其比作一个书架。书架的产生过程大概如下:(1)没有太多的书,想怎么摆都行,不至于太乱、难以分类和查找;(2)越来越多的书籍,你需要考虑是横着排列,还是竖着排列呢?横着排列的话,很容易倒不说,而且很难找到自己想要的且书籍;竖着排列的话,容易找到自己需要的书籍,但是太占地方,而且如果把书竖着摆条长龙的话,拿出几本书后,需要重新整理;(3)因此,我们考虑使用一个架子,这个架子分成几层,每层竖放一排书;(4)在书更多的情况下,需要对每一层加上一个格子,并且为每一本书和每一个格子打上标签;(5)随着时间推移,书架就组成一个图书馆了。软件体系结构对于软件系统构建的作用类似于书架对图书馆的作用了,同时对它的探索也类似人类对图书馆架构优化的探索。这段比喻只是让人初步理解一下它的概念,对其理论在此不作讨论,如果有兴趣的话,可以直接看点书。本文接下来将讨论一下笔者喜欢的一个体系结构。

一个软件系统向用户提供了若干功能,用户使用的每一个功能,我认为,是一种软件纵向代码执行的过程。换句话说,即软件系统是由横向的功能组成,每一个功能的应用是一种纵向代码执行的过程。举个例子,当用户想查询某个股票的行情的话,它会输入一些信息到软件系统,软件系统获取用户输入、执行校验、查询业务逻辑处理、路由到网络某个终端、运行查询服务、执行数据库访问、返回服务结果、经过业务逻辑处理、呈现到用户界面,这种行为从软件系统代码的执行角度来看,可以说是纵向的行为。这种纵向行为中的每一个活动都与前后活动相互关联,在代码中也呈现出直接的依赖。可以这么说,经典的分层体系结构是对横向软件功能的纵向代码的分类,从而划分层次。最初的分层结构是3层体系结构,即根据软件系统各个功能的纵向行为,划分为业务层、逻辑层和数据访问层,随着软件系统日益复杂,开发人员为软件系统抽象了更多类别(层次)的活动,出现了另一7层经典的分层结构。

单从软件系统本身而言,其复杂性由横向(系统功能)复杂度和纵向(涉及的业务逻辑和技术)复杂度组成。分层结构的出现,容易让人只是关注软件的纵向复杂度,对于越复杂的软件系统,我们需要划分成更多的层次。然而越多的层次,意味着更多、更复杂的层间依赖,也使开发、调试变得越来越复杂,在我看来,有点违背了“KISS”原则。当然,有人会说,这已经是最优方案了,也就是面对复杂系统,无奈的最优方案。幸运的是,人们已经发现了这些问题,并衍生了一系列的经典的开发框架,如MVC/MVP/MVVM,IOC,AOP,ORM。这些框架的出现大大降低了复杂系统的复杂性。不过,框架的大量应用,降低系统复杂性的同时,也意味着我们首先需要再付出相应的代价来使用这些框架,引入了更多的编程规则,从另一角度来看,也相应的增加了复杂性。举个例子,一个对象直接依赖另一个对象,肯定要比一个对象通过IOC容器依赖另一个对象来的简单,因为后者不直观而且还应用了新的框架。因此,这种只关注软件纵向活动的分层体系结构是有很大缺陷的。(PS:对于IOC框架,对于我来说,则是能不用最好不用。我想它对我们最大吸引力的地方,就是我们在开发项目的过程中,可以根据需求变化,而直接修改配置文件或者更改少量的代码,避免陷入用户无休止的变更中。当然,IOC的应用也提高了代码的可测性。但是,利用IOC真正有价值的部分只有一点点,因此,我只是觉得按需即可。我以前喜欢追求有艺术的代码,什么是有艺术的代码呢?那就是要有技术含量,殊不知,简单就是艺术!)。

因此,我想换一个角度,从横向复杂度入手,对系统进行模块化切割,从而使得每一个模块尽量的独立且简单。一个纵向复杂度很低的模块,我们甚至什么框架都不需要用到,而且我们可以根据模块的纵向复杂度对每一个模块划分层次。不过,引入模块化进行系统架构,我们不得不解决:(1)如何组装模块?(2)如何解决模块的依赖关系?(3)如何确保模块的独立性,从而降低模块间相互影响?(4)如何开发、调试和部署模块?

OSGi规范的提出,为我们解决了模块化应用的所有问题。对于(1),在OSGi中,每一个模块被称为Bundle,即服务包,由Bundle清单文件、代码文件和资源文件组成。OSGi框架可以从一个文件、文件夹、URL中加载模块。OSGi完整定义了模块化应用系统的单元。对于(2),OSGi提供了2种方法来解决模块依赖:1)是在模块编码的时候,一个模块重用了另一个模块的功能,它通过模块清单的Import、Export、DynamicImport和 Require配置来解决;或者是一个模块继承或在方法、字段的定义上使用了另一个模块的类,它将通过USE指令来定义。2)模块使用了另一个模块提供的服务,这种依赖只能在模块运行的过程中才能体现出来。对于(3),OSGi规范严格定义了框架类加载机制,由Java的ClassLoader代理网络,确保OSGi能够为每一个模块创建独立的类型空间,避免模块间类型的相互影响。对于(4),在开发和部署环节,IDE和OSGi规范已经提供简单、完美的支持,而对于本地调试和远程调试,IDE和运行时虚拟机也都完美支持。

总结:我喜欢的软件体系结构就是模块化(插件化) + SOA!通过模块化思路切割复杂应用系统,通过可管理的服务来解决模块依赖,尽量减少框架的使用和模块的层次,从而使得一切变得简单,达到“简单就是艺术”。

转自: 道法自然 http://www.cnblogs.com/baihmpgy/archive/2009/11/15/1603566.html

分享到:
评论

相关推荐

    osgi doc

    2. **与流行的Java B/S体系架构进行集成** - 探讨如何将OSGi与其他主流Java技术栈(如Hibernate、Spring、Webwork等)集成。 3. **基于OSGi搭建分布式系统** - 讨论如何利用OSGi框架搭建高效的分布式系统。 4. **将...

    智慧校园技术路线.docx

    面向对象的架构设计方法通过抽象、封装、模块化和层次化,从架构设计上确保软件实现的结构化、灵活性和可复用性。关注别离的架构设计思想通过分层、面向方面和容器等设计模式,将需求和架构分析结果织、混沌的软件...

    智慧校园技术路线.pdf

    面向对象设计通过抽象、封装、模块化和层次化,保证了软件的结构化和可复用性。关注别离设计则通过分层、面向方面和容器等模式,梳理复杂的软件元素关系,将不同关注点分离,实现分而治之。这种设计思想有助于构建...

    ONOS-BGP学习心得.docx

    ONOS 的架构是一个分层体系结构,包括面向网络的模块、Core 和应用程序三部分。面向网络的模块通过南向 API 与 Core 进行交互,而 Core 又通过北向 API 与应用程序进行交互。南向 API 定义了协议中立的手段将网络...

    正交频分复用 (OFDM) 基础收发机Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    通信工程勘察设计安全操作规程.docx

    通信工程勘察设计安全操作规程.docx

    【数据库技术】SQL入门与实战指南:从基础语法到应用场景的全面解析

    内容概要:本文是一篇面向初学者和技术爱好者的《SQL 入门与实战》指南,系统介绍了 SQL 的基本概念、功能及其应用场景。文章首先解释了 SQL 是一种用于操作关系型数据库的语言,能够执行数据的存储、查询、更新、删除以及表结构管理等操作。接着详细列举了基础语法,包括 SELECT、INSERT、UPDATE 和 DELETE 等语句的具体用法,并对常用的函数进行了分类说明,如聚合函数、字符串函数、时间函数等。此外,还深入探讨了多表连接、分组与聚合、子查询和窗口函数等进阶语法技巧。为了帮助读者更好地掌握 SQL,文中提供了从初级到高级的学习路线,并通过实际案例展示了 SQL 在后端 API 查询、数据报表分析、数据清洗与迁移等场景中的应用。最后简要比较了几种常见的数据库系统特性,强调了 SQL 在数据处理领域的重要性。 适合人群:适合初学者、实用派和技术爱好者,尤其是那些希望快速上手 SQL 并应用于实际工作的人员,如前端、后端、测试工程师、数据分析师和产品经理等。 使用场景及目标:①作为 SQL 学习入门资料,帮助读者理解 SQL 的基本概念和语法;②指导读者进行 SQL 编程实践,掌握数据查询、更新、插入、删除及表结构管理等操作;③为有经验的开发者提供进阶技巧,如多表连接、子查询、窗口函数等;④为从事数据相关工作的人员提供实用工具,提高工作效率。 其他说明:文章不仅涵盖了 SQL 的基础知识,还涉及到了一些高级主题,如事务、索引、视图、触发器等,并给出了进一步学习的书籍和在线资源推荐,鼓励读者通过持续学习来深化对 SQL 的理解和应用。

    wps办公日常使用11111111

    wps办公日常使用11111111

    卡通小熊素材PPT模板.pptx

    卡通小熊素材PPT模板

    汽车电子:MATLAB_实现CAN总线通信协议分析与故障诊断.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    支付技术基于MCP协议的支付宝AI支付工具集成:支付管理与应用场景详解

    内容概要:本文介绍了国内首个支付MCP(Model Context Protocol)框架,它定义了AI模型如何调用外部支付工具、获取支付数据并与支付服务交互。支付宝与魔搭社区合作,基于支付MCP Server框架为AI智能体提供无缝支付能力。支付MCP Server具有以下特点:支持MCP协议,简化支付接入流程;多端支持,涵盖移动端和网页端支付场景;全流程支付管理,包括支付、查询、退款等功能;灵活配置选项,满足不同开发需求。文中详细描述了支付MCP Server的功能,如创建支付、查询支付状态、发起退款和查询退款信息等,并提供了具体的配置方法和应用场景案例,如AI助手帮助用户在线购物、AI客服处理退款请求等。 适合人群:具有一定编程基础和技术背景的研发人员,尤其是对AI与支付集成感兴趣的开发者。 使用场景及目标:① 开发人员可以通过支付MCP Server快速实现支付功能,简化开发流程;② 提供全流程支付管理,增强应用的支付处理能力;③ 支持多端支付场景,提升用户体验;④ 通过灵活配置,满足不同业务需求,创造更多商业机会。 阅读建议:此资源详细介绍了支付M

    环境工程:MATLAB_实现大气污染扩散模型与可视化分析.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    【充电桩通信技术】基于云快充最新版协议的充电桩与新能源管理系统交互流程及数据格式定义:涵盖通信接口、帧类型、实时数据与运营交互等详细规范标题严格按照您的要求

    内容概要:本文档详细介绍了云快充最新版本的充电桩通讯协议,涵盖了从总则、通信协议结构、应用层报文帧格式、帧类型定义、通信协议流程、注册心跳帧类型码、实时数据帧类型码、运营交互帧类型码、运营平台设置帧类型码、车位锁通信协议、电桩远程维护帧类型码、并充模式帧类型码到附录的完整内容。重点描述了充电桩与新能源管理信息系统之间的数据交互流程、格式和内容,明确了通信接口采用TCP/IP Socket方式,支持有线网络接口和无线GPRS连接。文档还具体阐述了帧结构、数据格式定义、名词解释、各种帧类型的数据定义及流程,如上电流程、APP充电流程、刷卡充电、离线充电模式等,并提供了CRC16校验计算方法。 适合人群:从事充电桩开发、运维的技术人员,以及负责充电桩与平台对接的工程师。 使用场景及目标:①指导技术人员完成充电桩与新能源管理信息系统的对接,确保数据交互的正确性和稳定性;②帮助工程师理解并实现充电桩的各种功能,如登录认证、心跳包、实时数据传输、远程控制等;③为充电桩的日常维护和远程更新提供技术支持。 其他说明:本协议适用于交直流充电桩,交流部分数据无需上送。协议基于国网104充电桩规约,并参考GBT-27930标准。测试服务器地址为121.199.192.223,端口号为8768。文档还提供了详细的帧类型码定义和CRC16校验计算方法,确保数据传输的准确性。

    监理网站推广方案.docx

    监理网站推广方案.docx

    HI3519DV500 配置无线网依赖库以及编译脚本

    HI3519DV500 配置无线网依赖库以及编译脚本

    Clion和MinGW

    Clion和MinGW

    hardware-MLK-F6-7020.rar

    hardware_MLK-F6-7020.rar

    如何查看死锁.md

    如何查看死锁

    定制小米8-lineage22.1安卓15-fast功能项目线刷双版root 解锁bl后fast线刷

    资源说明; 1-----刷写前提是手机必须解锁bl先。而且会在fast模式刷写固件 2-----刷写方法与官方刷写步骤一样 3-----此固件为定制初始固件。可以在fast模式刷写 4-----属于适配固件。也许有个别bug。不接受请勿下载 5-----需要一定的刷机常识与动手能力的友友刷写。 6-----资源有可复制性。下载后不支持退。请知悉 7-----定制其他需求可以在csdn私信博主 博文参阅:https://csdn9.blog.csdn.net/article/details/143058308

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片1122

Global site tag (gtag.js) - Google Analytics