论软件的模块化与架构

看了一篇关于模块化架构的文章,感觉很不错,指明了多个我模糊的总结观点,收藏多看看好好消化。

原文:http://www.cnblogs.com/aquastone/p/software-architecture.html

不记得从哪儿看到的一句话,大意是:面向对象的设计模式掩盖了软件设计其实是这样一个事实:把模块按照依赖关系,组织成有向无环图。"无环”是一个重要的要求,即软件模块之间不要出现循环依赖的情况。更好的架构是模块分层次,某一层的模块只依赖比它低一层的模块。另外,模块间的依赖,也就是图里的边,越少越好,边越少,架构越简单。

每个模块应该是一组方法的集合,也就是一个抽象数据结构。一种数据结构,实际上是由它上面的一组操作来定义的。比如整数,只要满足整数的运算规则,这种数据结构都叫整数。所以,模块应当只包含方法,这组方法完全定义了这个模块。如果是Java语言,理论上每个模块都应该是一个interface。

每个模块可以有多个实现,具体采用哪种实现,是动态绑定的——也就是说,不是在编译期,而是在运行期决定的。我提出一个观点(也许有人提出过了,待考证),把运行期划分为“初始化期”和“运转期”。在“初始化期”,需要为每个模块指定一种实现,并且建立模块间的依赖、引用关系。这个过程可以自写代码,也可以通过类似spring的框架完成初始化和依赖注入。初始化期完毕,软件进入“运转期”,这时软件才真正进入运行,可以实现既定的功能。

在“运转期”,模块间的依赖应当只包括抽象方法,而于某种具体实现中的特有方法无关。做出这种区分后,应当把尽量多的操作放在初始化期,因为初始化期软件尚未执行,而且初始化期只执行一次,无需考虑效率,可以进行复杂的操作和严格的检查。而且无论是执行检查、还是输出日志,都不会产生很大的量。初始化期易于检查、易于调试,尤其对于多线程程序,线程尚未运行,调试难度大大低于运转期。

目前的编程语言里没有提供区分“初始化期”和“运转期”的特性,但是做出这种区分是有意义的。对于某个具体实现,比如一个class,内部的成员变量可以大致分成两类,一类属于配置变量,一类属于运行状态变量。两者分别对应于初始化期和运转期。比如一个连接数据库的类,数据库地址、用户名、库名属于配置变量,在初始化期设定,并且一旦初始化后往往不会改变。而某次query返回的错误状态,属于运行状态变量,它在运转期不停地被改变。显然,状态变量使得软件行为更不可预测,而且带来并行安全性问题。我们希望状态变量越少越好,最好是没有。如果没有的话,这就是一个所谓的“幂等性”模块(即多次调用返回的结果是一样的)。

通常的编程语言并不提供定义“配置变量”和“状态变量”的语法,但是可以做个类比。如果类比java,可以把前者看成final变量。final变量在构造函数中赋值,并且不能改变。但是,有些配置变量不一定在创建对象的时候就能赋值,而是在创建对象以后、开始运转之前被赋值。这样Java就没法区分了。spring中提供了类似的概念,它将接口和实现完全分离,并且使用xml文件完成初始化期的工作。

与成员变量类似,成员方法可以按初始化期和运转期作类似的划分。例如对象A持有一个指向对象B的引用,我们通常会在A中提供一个类似‘setB()‘的函数,向A中注入B的引用。这就是一个典型的“配置函数”,它的作用是在初始化期建立模块间的依赖关系。而模块的抽象接口中定义的方法,通常是“运转期”方法。

如果接口和实现在初始化期绑定后,这种绑定关系在整个软件生存期不再改变(这种情况在工程中也是比较常见的,如果要替换实现,重新初始化即可),那么这种动态绑定完全可以放到编译期执行,例如I是一个接口,A和B都实现了I。我们初始化一个A的对象,并且将I的变量指向A的对象。如果在I的变量的整个生存期里这种绑定关系保持不变,那么这在编译器就可以确定。例如,可以把I里的所有方法直接替换成A里的方法,这样省去动态绑定所带来的虚函数查找开销,不过这似乎没有多大意义。此外可能有意义的一点是,如果这个过程放到编译期,编译器就可以进行更多的语法检查。把错误尽可能的在更靠前的阶段消除,能够大大减少调试时间。

OO里的两大核心概念:抽象和多态,前者用于解决模块化问题,后者解决接口和实现的绑定问题。这里要解决的核心问题,是接口和实现的分离。至于为什么要分离,根本原因还是控制复杂性。一个模块,在概念上应当是简单的,而实现上也许很复杂,但是这种复杂被约束在了模块内部,外部只能看到简单的概念。所以,模块的划分要合理。如果模块数量过多,或者关系杂乱,甚至接口定义经常改变,那么使用的工具再好也是无济于事的。

时间: 2024-10-13 10:15:31

论软件的模块化与架构的相关文章

全栈软件工程师和系统架构师的异同

看完后.发现.不用怕....因为程序员不会看完.只有"架构师"才有耐心看这么长的. 一 每个好架构师都是一位出色的程序员(卓越的程序员) 架构师,听起来是如此神秘的一个称号.尤其是在开发领域刚入门不久的菜鸟级程序员眼中,架构师都是高手,都是牛人,都是如此高高在上的存在. 不过,在搞了四.五年编程之后,程序员们往往早已失去了当年对这些"高级"职位的神秘感,甚至会对自己所在项目的架构师抱怨不已,背后里称他们是一群水王.所以有江南白衣曾撰文述说:"国内的架构师到

软件需求分、架构设计与建模最佳实践

软件需求分.架构设计与建模最佳实践 cxx 2019-04-13 一.为什么要详细设计,价值? 在多人团队环境中,详细设计驱动开发可实现明确交付的目标和标准 可复用的设计成果 提高代码的可维护性 可对交付进行工作量和质量的评估 实现知识传承,提高软件生命周期 二.控制软件复杂性的基本方法 分解法 抽象法 三.UML有哪些元素 结构 行为 四.基于用户目标的需求组织形式 交互式需求 清晰的责任 场景化 文档的五大功效 有助于编写使用手册 测试用例转化:帮助开发人员设计测试用例 需求用例 利于详细设

优云软件助阵ArchSummit全球架构师峰会(内附大会演讲PPT)

由极客邦科技与 InfoQ 中国主办的 ArchSummit 全球架构师峰会深圳站,于 7 月 7 日 - 8 日在深圳华侨城洲际酒店举办. 本次大会特邀 100 多位国内外技术专家,与1000余名技术管理者.架构师共同分享和交流新技术在行业应用中的最新实践,助力企业技术选型.业务升级与顺利转型.作为ArchSummit大会的高级合作伙伴,优云软件受邀参加本次峰会. ▲峰会现场 优云是广通软件旗下全新一代创新型运维品牌,致力于为客户提供一站式的IT运维解决方案.在此次大会上,向参会者和国内外嘉宾

全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程

在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片DA14580的软件体系-RW内核和消息处理机制>三篇文章分析了DA14580的SDK开发目录结构.硬件架构.低功耗.RW内核和消息处理机制.本篇文章将深入到具体的源码去分析DA14580平台的软件层次架构和具体的BLE消息处理过程,以此佐证前面发表的文章. 一.软件层次架构 1.1 BLE协议栈 从中

软件设计入门1 架构设计

热爱编程才能做优秀的软件设计师! 软件设计有一些方法可以参考.但更重要的是要有好的需求分析.丰富的技术知识和设计经验(多动手!)不断追求更好的精神(多动脑!). 遇到别人的系统想一下自己能否实现,如何实现? 一.优秀设计的标准:性价比高的设计. 1)优秀的设计都是需求驱动的,不熟悉需求就做出来的设计是不靠谱的: 2)优秀的设计应该是当前团队能理解能实现的,太超前的设计项目团队做不出来,这个设计只能是摆设: 3)优秀的设计应充分考虑当前各种限制条件,适当做出平衡,能保证达成项目的目标: 4)优秀的

一款不错的软件中心,基于deb架构的,例如mint ,ubuntu系统。还有QQ可以提供下载哦~!

一款不错的软件中心.类似于windows下的360软件管家.这是基于deb架构的,例如mint ,ubuntu系统.还有QQ可以提供下载哦-! 还有机会赢取iPhone6! 下载地址:软件中心 http://www.nfs-cloud.cn:81/appCenter/open/softcenter 这里是软件中心的界面截图:

ECCV 2018 | UBC&amp;腾讯AI Lab提出首个模块化GAN架构,搞定任意图像PS组合

通常的图像转换模型(如 StarGAN.CycleGAN.IcGAN)无法实现同时训练,不同的转换配对也不能组合.在本文中,英属哥伦比亚大学(UBC)与腾讯 AI Lab 共同提出了一种新型的模块化多域生成对抗网络架构--ModularGAN,生成的结果优于以上三种基线结果.该架构由几个可重复利用和可组合的模块组成.不同的模块可以在测试时轻松组合,以便在不同的域中高效地生成/转换图像.研究者称,这是首个模块化的 GAN 架构. 据了解,腾讯 AI Lab 共有 19 篇论文入选 ECCV 201

【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程

1.可信软件的基础是软件优秀 可信突破是阶段性工作,可信只是优秀软件的一部分,单独追求可信是缘木求鱼. 2.什么是优秀软件 要系统的考虑如何开发优秀软件 对外:功能多,性能好,用户体验好,生态丰富 内部:逻辑简洁清晰,可扩展性好,可维护性好,过程可视 3.怎么做——软件没有银弹 3.1首先要做好架构.骨架好了,才能画好美人 3.1.1架构是每个人的事情,不只是架构师的事情 业务各个环节的人都要有架构思维,架构思维包括两种思维: 系统性思维:系统性是指所有与业务相关的事情都要考虑.例如: 1.设计

软件体系结构---安卓系统架构之应用程序框架层分析---1

本博客只介绍安卓系统架构中的应用程序框架层 什么是应用程序框架? 应用程序框架可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性.其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响. 而对于安卓来说:Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则.我们在开发应用时就是在这个框架上进行扩展.在这个框架中我们可以完全访问核心应用程序所使用的API框架,即我们