软件体系

2020-05-17  本文已影响0人  小跑001

引言

    软件体系结构的主题是针对复杂软件系统的高层结构、组织单元之间的相互关系的描述,以及围绕这种描述展开的各项活动, 如设计、评估、实现和管理等. 作为一名软件工程专业的学生, 掌握这门课程至关重要, 这门课对未来的职业生涯也发挥着重要的作用.

1.1动机

    工作中,我们经常会接受任务, 比如让设计一个系统. 然而, 没有理论指导, 设计出来的东西经常会考虑不全, 或者局限于思路狭窄而无法设计出来一个较好的系统. 往往会导致项目延期或者项目失败的情况. 软件体系风格就是总结了常用的几种软件设计结构, 以供实际设计系统的时候来参考. 通过理论与实际的结合, 筛选出较好的软件风格体系. 风格的确定就像装修一样, 是选择欧式建筑还是中式还是中西合并的样式, 有了这个风格也能更好指导后面具体详细的设计.

2 软件体系风格概念

    软件体系风格是描述特定领域中软件系统家族的组织方式的惯用模式,反映了领域中众多系统所共有的结构和语义特性, 并指导如何将各个模块和子系统有效的组合成一个完整的系统.

    软件系统里面的元素有构件和连接件,软件体系风格就是描述这些构件和连接件以及这些构件和连接件之间的拓扑关系.

    这些风格都是独立于具体案例建立起来的抽象模型,但是也是基于大量实际案例总结出来, 较常应用在软件体系结构设计当中的, 因此非常具有参考价值, 可以通过这些模型总结达到复用的结果.

3软件体系风格介绍

3.1数据流风格

    数据流风格的特征是:数据的可用性决定处理是否被执行; 系统结构由数据之间的有序移动来决定; 在纯数据流系统中, 处理之间除了数据交换没有其它的交互.

    数据流的组件是各个计算单元,连接件是输入输出流. 然后只有各个组件之间数据近线性流通或者有限循环流通才能应用数据流风格. 如果数据在各个组件之间杂乱无序的流通, 应用数据流风格很容易出现死锁的现象.

    数据流风格分为批处理风格和管道过滤器风格.其中批处理是各个处理单元只有等到上一个处理单元把全部数据处理完才能开始处理这些数据, 各个处理单元相互独立. 而管道过滤器类似自来水管, 上一个处理单元处理一条数据就会发送给下一个处理单元进行处理. 这两种方式的主要区别是一个强调整体数据的传输, 一个强调增量式的传输.

    实际情况,通常会根据业务的需求来选择不同的处理模型. 比如在编译器程序里面会选择批处理风格, 比如先整体进行代码分析得到抽象语法树才会进行下一步的处理, 不同代码文件之间有一定关联性就要求需要整体处理分析. 在数据源源不断产生的场景, 而系统需要对这些数据进行一系列的处理, 可以利用管道过滤器风格.

    数据流风格有很多优点.整个系统也可以看成是由几个独立的处理单元简单合成. 复用性强, 只要提供两个计算单元之间的数据格式, 任何两个处理单元都可以被连接起来. 系统维护和增强性简单, 新的可以添加的现有的系统当中, 旧的可以被改进的过滤器替换. 有一定的并发行, 特别是管道过滤器风格, 不需要等待所有数据处理完, 另外各个处理单元相互独立, 可以并行计算.

    然而数据流风格也有一些缺点.不合适处理交互的应用. 系统性能并不高, 需要在各个管道之间复制数据, 不适合大量数据需要共享的应用上.数据传输格式没有统一的标准,大部分时间用来处理格式转换上.

3.2 调用返回风格

    调用返回风格在实际应用中比较常见,主要分为: 主程序/子程序风格; 抽象数据类型风格;面向对象风格;组件风格.

    主程序/子程序风格在层次结构的程序中应用较多, 可以把一个功能分为各个子功能, 控制程序通过协调各个子功能来完成一个大功能. 各个子程序以及子程序内部可见的数据组成了这种风格的组件, 通过系统调用或者各个模块的数据共享方式来连接, 通常是用单线程来控制各个模块.

    然而这种风格有一些问题暴露出来.比如各个子模块之间如果想隐藏一些机密数据应该如何处理?  有一些数据我想开放, 有一些数据我想隐藏我应该怎么办? 同时模块化方便了我独立的去修改各个子程序, 然而有些数据暴露给其它模块, 如果数据控制权不集中管理, 不方便未来修改.  正确的模块化是暴露不太容易变化的接口, 隐藏内部实现, 未来如果改变也不会影响调用方, 其它模块也不用知道我内部做了什么改变.

    抽象/面向对象风格, 解决了上述数据隐藏性的问题. 对象不光封装了方法也封装了状态, 状态的访问只能通过对象固有的接口来访问, 这样就让状态的变化达到了可控性. 面向对象的风格更进一步, 提供了多态以及继承的特性, 更好的满足了复用以及独立修改的需求.

    面向对象在对象过多情况下,扁平方式就不太好管理对象. 层次化设计和c/s架构来管理对象, 让各个相似的对象分布在某一个层次, 方便各个层次的独立修改. 层次太多也会影响程序性能, 要根据实际业务需要来采取不同的模式来处理.

3.3数据中心体系风格

    数据中心风格主要是以数据共享的方式,方便各个模块之间的协作. 又分为仓库数据风格和黑板数据风格.

    这两种风格最大的不同是数据是被处理还是决定了怎么去处理.仓库风格就像数据库一样, 各个程序用来操作数据库来做增删改查. 而黑板系统由黑板上的数据来决定调用哪些模块来进一步做处理.

    在现代编译器设计当中有用到仓库风格,各个处理单元之间共享了数据, 如果还是用批处理或者管道来传输, 效率非常低. 往往会设计一个数据中心, 方便各个阶段来存取.

    黑板系统类似拼图,在这个拼图上, 可能有各种解法, 每种解法之间没有固定的次序. 程序中例如自然语言处理, 模式识别, 语音以及图像处理等.

    黑板系统的基本结构分为黑板,知识源, 控制器. 黑板用来存储求解状态, 知识源代表了策略以及求解知识, 控制器监视黑板状态以及激活知识源.

3.4事件系统体系风格

    事件体系风格的元素包括事件源,事件, 事件管理器, 事件处理器. 从事件管理方式来看又分为无独立调度模块的事件系统和有独立调度的系统. 例如zookeeper里面的watch机制, 只要订阅了某一个状态的信息, 在变化的时候zk会主动通知过来. 相对来说kafka就引入了中间管理模块来接受和分发事件.

    在独立调度事件风格,又分为广播模式和选择广播模式. 其中选择方式广播又分为点对点广播和发布订阅方式的广播. 根据不同的业务需求选择具体的事件管理模式.

5总结

    以上是各种风格的介绍,虽然各个风格进行了独立介绍, 然而实际应用种并不是选择某一种风格就可以解决问题的, 往往需要选择某一种或者多种风格来解决问题.

上一篇 下一篇

猜你喜欢

热点阅读