精华内容
下载资源
问答
  • 本书以现代软件工程的基本原理为依据、从系统架构师的角色、定位的介绍开始,讲解软件架构师的职责和作用。并以实际案例为基础,导入软件架构设计的基本概念和基本技术方法。
  • 软件架构是系统的抽象 定义了元素以及它们之间的交互 忽略了纯粹属于局部的信息,元素的细节不属于架构
  • 软件架构设计 温昱 第一版+第二版 PDF
  • 一、软件架构设计 软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。 软件系统架构是关于软件系统的 结构、行为和属性 的高级抽象。指定了软件...

    一、软件架构设计

    软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。

    软件系统架构是关于软件系统的 结构、行为和属性 的高级抽象。指定了软件系统的组织结构和拓扑结构

    软件架构是可传递可复用的模型,架构就是体系结构。架构设计介于需求分析和软件设计之间。架构设计就是需求分配,即满足,需求的职责分配到组件上。

    软件架构设计是降低成本、改进质量、按时和按需交付产品的关键因素。架构设计能够满足系统的性能、可维护性等品质;能够使得不同的利益相关人(stakeholders)达成一致的目标;能够支持项目计划和项目管理等活动;能够有效地管理复杂性;等等。然而系统架构的给出必须建立在需求明确的基础上。

    软件架构能够在设计变更相对容易的阶段,考虑系统结构的可选方案,便于技术人员与非技术人员就软件设计进行交互,能够展现软件的结构、属性与内部交互关系。但是软件架构与用户对系统的功能性需求没有直接的对应关系。

    二、架构的模型 4+1视图

    在这里插入图片描述
    逻辑视图:主要支持系统的功能需求,即系统提供给最终用户的服务。(用户关注)

    开发视图:也称为模块(实现)视图,主要侧重于软件模块的组织和管理。(程序员)

    进程视图:侧重于系统的运行特性,主要关注一些非功能性的需求,例如系统的性能和可用性。(并发,集成人员)

    物理视图:主要考虑如何把软件映射到硬件上,它通常要考虑到解决系统拓扑结构、系统安装、通信等问题。(软件到硬件,系统工程人员)

    场景:可以看作是那些重要系统活动的抽象,它使四个视图有机地联系起来,从某种意义上说,场景是最重要的需求抽象。(用例图)

    逻辑视图和开发视图描述系统的静态结构,而进程视图和物理视图描述系统的动态结构。

    三、软件架构风格

    软件架构风格是描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件和这些构件的组织方式;惯用模式则反映众多系统共有的结构和语义特性强调对软件设计的重用

    架构风格定义一个系统家族,即一个架构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。对软件架构风格的研究和实践促进对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。例如,如果某人把系统描述为“客户/服务器”模式,则不必给出设计细节,我们立刻会明白系统是如何组织和工作的。

    1. 数据流风格
    在这里插入图片描述

    1. 批处理序列

      强调数据作为一个整体(数据必须是完整的,以整体的方式传递)

    2. 管道和过滤器

      每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流. (构件–>过滤器;连接件–>管道) (数据流的形式)

    2. 调用/返回风格

    在这里插入图片描述

    1. 主程序/子程序

      计算构件作为子程序协作工作,由一个主程序顺序地调用这些子程序,构件通过共享存储区交换数据. 曾经作为结构化开发方法的主要选择,具有结构清晰,维护方便的特点,缺点是主子程序划分缺乏标准,较难实现不同设计人员间设计的子程序复用。

    2. 面向对象风格

      面向对象在类的层次实现高度内聚,整个系统通过不同类的组合调用实现不同功能,便于类的复用,只是面向对象是一个通用风格,类的划分不同设计人员设计结果有很大不同,对实际架构设计指导意义不大。

    3. 层次结构风格

      分层结构将整个系统按照抽象层次不同分为多层,每个层次的程序只需要负责与相邻的上下两层打交道,简化了系统中调用关系复杂度。允许每层用不同的方法实现,为软件重用提供了强大的支持。(二层C/S、三层C/S、MVC、MVP、MVVP、RIA富互联网应用)

    3. 独立构件风格
    在这里插入图片描述

    1. 进程通讯

      进程通讯架构将系统建设成一个个独立构件,构件间采用命名的消息传递来实现沟通与协作。

    2. 事件系统子风格(隐式调用 )

      事件驱动架构风格与进程通讯风格类似,也是将系统分各个为独立的构件,不同的是不同构件间通讯不采用命名的消息,而是采用隐式调用的方式,先将一个个构件的过程注册到某个事件中,当这个事件发生时,所有注册到该事件的过程自动被触发执行。这类风格的好处是独立构件间耦合度进一步降低,方便构件修改及替换,缺点是触发事件放弃了对被触发执行程序组的控制。

    4. 虚拟机风格
    在这里插入图片描述

    1. 解释器

      具有运行时系统行为 (自)定义与改变能力 。如专家系统。

    2. 基于规则的系统

      基于规则的系统包括规则集、规则解释器、规则/数据选择器及工作内存。(一般用在人工智能领域和DSS中)

    5. 仓库风格
    在这里插入图片描述
    在仓库风格中,有两种不同的构件:中央数据结构说明当前状态,独立构件在中央数据存储上执行。

    1. 数据库系统

      构件主要有两大类,一个是中央共享数据源,保存当前系统的数据状态,另一个是多个独立处理元素,处理元素对数据元素进行操作。中央数据库管理系统通过自身机制如数据排它锁,共享锁等,实现数据高速访问,数据一致性,数据完整性。同时各独立数据处理单元之间互相不受约束。 (如编译器,传统编译器采用批处理架构,现代编译器采用数据共享架构风格。分析树是共享数据。)

    2. 超文本系统

      主要应用于静态网页。

    3. 黑板风格

      由一个作为全局共享数据的黑板,一个控制单元和多个知识源组成,主要应用与专家问题解决系统。通过专家知识和反馈逐步得到正确结果. (如语音识别)

    6. 闭环控制架构

    1. 过程控制

      工业中的过程控制是指以温度、压力、流量、液位和成分等工艺参数作为被控变量的自动控制。过程控制也称实时控制,是计算机及时的采集检测数据,按最佳值迅速地对控制对象进行自动控制和自动调节,如数控机床和生产流水线的控制等。(比如空调制冷,温度大于设定温度制冷,小于等于时停止,一旦大于继续运作)

    2. C2
      在这里插入图片描述

      通过连接件绑定在一起按照一组规则运作的并行构件。

      1. 构建和连接件都有一个顶部和一个底部
      2. 构建的顶部都要连接连接件的底部,构建的底部都要连接连接件的顶部,构建 之间不允许直连。
      3. 一个连接进行直接连接时,必须有其中一个的底部到另一个的顶部。

    四、分层C/S架构风格演化

    1. 二层 C/S
    在这里插入图片描述

    1. 二层 C/S 结构为单一服务器且以局域网为中心,所以难以扩展至大型企业广域网或Internet;(使用范围)
    2. 软、硬件的组合及集成能力有限;(扩展性)
    3. 服务器的负荷太重,难以管理大量的客户机,系统的性能容易变坏;(性能)
    4. 数据安全性不好。因为客户端程序可以直接访问数据库服务器,那么,在客户端计算机上的其他程序也可想办法访问数据库服务器,从而使数据库的安全性受到威胁。(安全)

    2. 三层C/S架构

    在这里插入图片描述

    1. 表现层(Web层)
      负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求 web,web层需要接收 http请求,完成http响应。
      表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。
      表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。
      表现层的设计一般都使用 MVC 模型。 MVC 是表现层的设计模型,和其他层没有关系。
    2. 业务层 (Service层)
      它负责业务逻辑处理,和我们开发项目的需求息息相关。web层依赖业务层,但是业务层不依赖Web层。
      业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。 (事务应该放到业务层来控制)
    3. 持久层 (dao 层)
      负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口;业务层需要通过数据访问层将数据持久化到数据库中。
      持久层就是和数据库交互,对数据库表进行增删改査的。

    优点:

    (1)允许合理地划分三层结构的功能,使之在逻辑上保持相对独立性,从而使整个系统的逻辑结构更为清晰,能提高系统和软件的可维护性和可扩展性。(逻辑独立清晰, 可维护性/可扩展性)

    (2)允许更灵活有效地选用相应的平台和硬件系统,使之在处理负荷能力上与处理特性上分别适应于结构清晰的三层;并且这些平台和各个组成部分可以具有良好的可升级性和开放性。(可升级性/开放性)

    (3)三层C/S架构中,应用的各层可以并行开发,各层也可以选择各自最适合的开发语言。使之能并行地而且是高效地进行开发,达到较高的性能价格比;对每一层的处理逻辑的开发和维护也会更容易些。(开发维护成本/速度/技术门槛)

    (4)允许充分利用功能层有效地隔离开表示层与数据层,未授权的用户难以绕过功能层而利用数据库工具或黑客手段去非法地访问数据层,这就为严格的安全管理奠定了坚实的基础;整个系统的管理层次也更加合理和可控制。(安全)

    3. 三层B/S架构
    在这里插入图片描述

    用户在使用系统时,仅仅需要一个浏览器就可运行全部的模块,真正达到了“零客户端”的功能,很容易在运行时自动升级。(客户端)

    基于B/S架构的软件,系统安装、修改和维护全在服务器端解决。(服务端)

    B/S架构还提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开放性基础。(开放性)

    缺点:

    1. B/S架构缺乏对动态页面的支持能力,没有集成有效的数据库处理功能。
    2. B/S架构的系统扩展能力差,安全性难以控制。
    3. 采用B/S架构的应用系统,在数据查询等响应速度上,要远远地低于C/S架构。(性能)
    4. B/S架构的数据提交一般以页面为单位,数据的动态交互性不强,不利于OLTP应用.

    五、MVC的架构风格

    在这里插入图片描述

    MVC 全名是 Model ViewController,是模型(model)-视图(view)-控制器(controller)的缩写,它是分层架构风格的一种。主要解决 将与 UI 相关的逻辑都定义在针对视图的相关元素的事件上 的问题。

    MVC 中各个部分的分工与协作:

    1. Model 是对应用状态和业务功能的封装,我们可以将它理解为同时包含数据和行为的领域模型。Model 接受 Controller 的请求并完成相应的业务处理,在状态改变的时候向 View 发出相应的通知。
    2. View 实现可视化界面的呈现并捕捉最终用户的交互操作(例如鼠标和键盘的操作)。
    3. View 捕获到用户交互操作后会直接转发给 Controller,后者完成相应的 UI 逻辑。如果需要涉及业务功能的调用,Controller 会直接调用 Model。在完成 UI 处理后,Controller 会根据需要控制原 View 或者创建新的 View 对用户交互操作予以响应。

    六、MVP 的架构风格

    在这里插入图片描述

    MVP 是从经典的模式 MVC 演变而来,它们的基本思想有相通的地方:Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示。

    当然 MVP 与 MVC 也有一些显著的区别,MVC 模式中元素之间“混乱”的交互主要体现在允许 View 和 Model 直接进行“交流”,这在 MVP 模式中是不允许的。在 MVP 中 View 并不直接使用 Model,它们之间的通信是通过 Presenter (MVC 中的 Controller)来进行的,所有的交互都发生在 Presenter 内部,而在 MVC 中 View 会直接从 Model 中读取数据而不是通过 Controller,从而避免了 View 和 Model 之间的耦合。

    扩展:

    1. MVVM架构

    在这里插入图片描述
    2. 富互联网应用(RIA)

    在这里插入图片描述
    3. 分布式架构

    客户机/服务器系统开发时可以采用不同的分布式计算架构:

    1. 分布式表示架构是将表示层和表示逻辑层迁移到客户机,应用逻辑层、数据处理层和数据层仍保留在服务器上(类似三层CS架构的两层应用);
    2. 分布式数据架构是将数据层和数据处理层放置于服务器,应用逻辑层、表示逻辑层和表示层放置于客户机(类似两层CS架构);
    3. 分布式数据和应用架构数据层和数据处理层放置在数据服务器上,应用逻辑层放置在应用服务器上,表示逻辑层和表示层放置在客户机(类似三层CS架构)。

    4. ANSI

    在ANSI/IEEE 1471-2000标准中,系统是为了达成利益相关人(Stakeholder)的某些使命(Mission),在特定环境(Enviroment)中构建的。每一个系统都有一个架构(Architecture)。架构(Architecture)是对所有利益相关人的关注点(Concern)的响应和回答,通过架构描述(Architecture Description)来说明。每一个利益相关人都有各自的关注点。这些关注点是指对其重要的,与系统的开发、运营或其他方面相关的利益。架构描述(Architecture Description)本质上是多视图的。每一个视图(View)是从一个特定的视角(Viewpoint)来表述架构的某一个独立的方面。试图用一个单一的视图来覆盖所有的关注点当然是最好的,但实际上这种表述方式将很难理解。视角(Viewpoint)的选择,基于要解决哪些利益相关人的哪些关注点。它决定了用来创建视图的语言、符号和模型等,以及任何与创建视图相关的建模方法或者分析技术。一个视图(View)包括一个或者多个架构模型(Model),一个模型也可能参与多个视图。模型较文本的表述的好处在于,可以更容易的可视化、检查、分析、管理和集成。

    5. 需求和架构

    需求和软件架构设计面临的是不同的对象:一个是问题空间;另一个是解空间。保持两者的可追踪性和转换,一直是软件工程领域追求的目标

    6. 架构风格和设计模式的区别

    1. 架构风格往往是从全局的角度来考虑问题,他是一种独立于实际问题的通用组织结构。例如,常用的B/S架构,在很多不同的系统中,都有应用。

    2. 而设计模式着眼于解决某一特定的局部问题,是一种局部解决方案的应用。例如,在很多的软件系统中,创建对象时,希望有统一的机制对这些对象的创建进行管理,所以出现了工厂模式,创建者模式等设计模式。比如java内存垃圾的回收机制也做成了一种设计模式。

    7. 软件架构需求

    软件架构需求是指用户对目标软件系统在功能、行为、性能和设计约束等方面的期望。需求过程主要是获取用户需求,标识系统中所要用到的构件,并进行架构需求评审。其中标识构件又详细分为生成类图、对类图进行分组和将类打包成构件三步。软件架构需求并不应该包括设计构件的过程。

    8. 面向构件的编程(COP)

    面向构件的编程(COP)关注于如何支持建立面向构件的解决方案。一个基于一般 OOP 风格的 COP 定义如下(Szyperski,1995): “面向构件的编程需要下列基本的支持:

    1. 多态性(可替代性);
    2. 模块封装性(高层次信息的隐藏);
    3. 后期的绑定和装载(部署独立性);
    4. 安全性(类型和模块安全性)。”

    系统构件组装分为三个不同的层次:定制( Customization)、集成(Integration)、扩展(Extension)。这三个层次对应于构件组装过程中的不同任务。

    9. OMG接口定义语言IDL

    IDL 是一种接口定义语言,具体的定义会涉及到接口以及相关部分。文件包含的主要元素有:接口描述、模块定义、类型定义、常量定义、异常、值类型。接口描述是IDL文件中最核心的内容。

    由于IDL只是一种接口定义语言,最终还是要落地与语言对接的,所以IDL的数据类型要与实现语言进行映射。以Java为例,IDL接口映射为Java类,而该接口的操作映射为相应的成员函数。模块定义映射为Java 语言中的包 (Package)或C++的namespaces。

    9. 扩展知识

    一个软件的架构设计是随着技术的不断进步而不断变化的。以编译器为例,其主流架构经历了管道-过滤器到数据共享为中心的转变过程。早期的编译器采用管道-过滤器架构风格,以文本形式输入的代码被逐步转化为各种形式,最终生成可执行代码。早期的编译器采用管道-过滤器架构风格,并且大多数编译器在词法分析时创造独立的符号表,在其后的阶段会不断修改符号表,因此符号表并不是程序数据的一部分。现代的编译器采用以数据共享为中心的架构风格,主要关心编译过程中程序的中间表示。现代的编译器采用以数据共享为中心的架构风格,分析树是在语法分析阶段结束后才产生作为语义分析的输入,分析树是数据中心中重要的共享数据,为后续的语义分析提供了帮助。

    展开全文
  • 高焕堂android应用软件架构设计
  • 软件架构设计的几点理解

    千次阅读 2018-09-23 17:33:21
    与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础。从和目的、主题、材料和结构的联系上来说,软件架构...

     

    1.软件架构的基本介绍

    架构架构师:软件体系结构是构建计算机软件实践的基础。与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础。从和目的、主题、材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟。一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计。软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作、逻辑和流程。

    软件架构:软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口来实现。

    软件架构设计:软件架构设计就是从宏观上说明一套软件系统的组成与特性,是一系列有层次的决策。

    2.软件结构设计的目的

    • 可重用:为大规模开发提供基础和规范,并提供可重用的资产,软件系统的大规模开发,必须要有一定的基础和遵循一定的规范,这既是软件工程本身的要求,也是客户的要求。架构设计的过程中可以将一些公共部分抽象提取出来,形成公共类和公共接口,其他功能模块所需相关功能即可调用,以达到重用的目的。
    • 缩短周期:一定程度上缩短项目的周期,利用软件架构提供的框架或重用组件,缩短项目开发的周期。
    • 降低开发和维护的成本:大量的重用和抽象,可以提取出一些开发人员不用关心的公共部分,这样便可以使开发人员仅仅关注于业务逻辑的实现,从而减少了很多工作量,提高了开发效率。
    • 提高产品的质量:好的软件架构设计是产品质量的保证,特别是对于客户常常提出的非功能性需求的满足。

    3.软件架构的基本设计原则

    • 满足功能性需求和非功能需求:这是一个软件系统最基本的要求,也是架构设计时应该遵循的最基本的原则。
    • 实用性原则:就像每一个软件系统交付给用户使用时必须实用,能解决用户的问题一样,架构设计也必须实用,否则就会“高来高去”或“过度设计”。
    • 接口复用:公共部分可设计成接口,减少冗余,最大程度的提高开发人员的工作效率。
    • 低耦合:耦合是描述模块之间的依赖程度,如果一个模块的修改,都有另一个模块会受到影响,则两模块之间是相互依赖耦合的。(依赖具有传递性,耦合的两个模块可能间接依赖),低耦合是我们的设计目的,但不是不可以存在耦合不存依赖,依赖是必须的,因为模块之间是必须要通信交互。设计依赖应该依赖于不变或者不易变的接口,无需了解模块的具体实现,即为面向对象的封装性。
    • 高内聚:高内聚是指某个特定模块包括程序、类型都应完成一系列相关功能,描述了不同程序和类型中方法,方法中不同操作描述的逻辑之间的距离相近。高内聚意味可维护性,可重塑性,因为模块对外部的依赖少(功能的完备性)。如果两个模块之间的修改,互不影响各个模块的业务,这说明模块之间是高内聚的。模块的内聚和其担当的职责成反比,即模块的职责越多,模块的内聚性越低,这也是模块的单一原则(SRP),SRP提倡每个类型都最好只承担单一的职责,只有单一的改变因素。

    4.软件架构设计的基本视图

    由于软件系统的不同的角色会站在不同的角度上提出的问题,我们就得从不同的视角来看待软件架构设计这项工作:

    • 逻辑架构视角:从系统用户的角度考虑问题,设计出来的软件架构能够满足业务逻辑的需求,能够处理现在越来越复杂的业务逻辑需求。
    • 开发架构视角:从系统开发人员的角度来考虑问题,设计的架构要易于理解,易于开发,易于单元测试,最好做到让开发人员可以用最少的代码行数完成功能的开发。
    • 运行架构视角:从系统运行时的质量需求考虑问题,特别关注于系统的非功能需求,客户常常都会要求我们系统的功能画面的最长响应时间不超过4秒,能满足2000个用户同时在线使用,基于角色的系统资源的安全控制等。
    • 物理架构视角:关注系统安装和部署在什么样的环境上,例如现在最流行的企业应用服务解决方案IBM Http Server + WebSphere Application Server + DB2,WebLogic + Oracle等。
    • 数据架构视角:如今我们开发的各类系统,如管理信息系统(Management Information System,MIS)、ERP(企业资源计划),SAP,基本上都是对各类数据的操作,把一堆不太好懂的数据展现成用户容易看懂的数据,自动处理各类数据的运算等,所以数据的持久化是十分重要的一件事情。

        1、分析需求和理解业务模型(或领域建模)

        软件的需求,可以分为从用户视角和开发人员视角来看,从用户的角度看,又可以分为功能性和非功能性需求,我们必须从不同的视角和级别去全面的认识需求并分析需求,理解业务模型。实践表明,常常被我们忽视的非功能性需求常常会导致整个项目失败。而理解业务需求最好的方式莫过于进行领域建模,领域建模与需求分析往往是交替穿叉进行的,领域建模主要有以下三个方面的作用:

    • 探索复杂问题,弄清领域知识。Martin Fowler曾经说过,他采用面向对象方法最大的好处就是它有助于解决更为复杂的问题。领域建模本身作为辅助思维的工具,帮助我们将注意力始终保持在最为重要的业务概念及其关系上,使我们能够不断深入地,系统的对需求进行分析和认识。领域建模往往是一个从模糊到清晰,从零散到系统的过程。
    • 决定功能范围,影响可扩展性。任何模型都是对现实世界某种程序的抽象,这种抽象就会忽略某一些东西,例如忽略对象的属性和对象间的关系,而这些忽略往往都是带有一定的目的性的,这种忽略就决定了功能的范围。模型揭示了各种功能背后的结构,如果说定义功能相当于“拍照片”的话,那么领域建模就相当于“做透视”,更加关注问题领域的内在结构,相当于对问题领域进行了一定的抽象,良好的领域模型不仅能很好的支持现有的功能,而且还可以在一定程度上支持未来可能出现的新需求,体现良好的可扩展性。
    • 提供交流基础,促进有效沟通。领域建模通常会使用UML图作为呈现的方式,这样为我们的沟通提供了方便。当然,有时候文字在描述某些特定领域的问题时可能更适合,可以灵活运用。

          2、从各个视角来全面的考虑软件架构

        软件的架构设计必须考虑到各方面,根据前期工作确立的领域模型,关键需求,系统约束等进行设计,必须从用户、开发、运维等人员的角度去分析并解决问题。比如说,如果我们的运行架构采用Cluster方式时,就必须小心Cache和Session等的使用;如果我们的业务逻辑要求我们要操作多个数据库时,就要考虑采用支持二阶段事务提交的方式。

        只有将这些方方面面的问题都考虑到了,这样的架构设计才是完整的。至于每一个视图中,我们应该设计到什么细节这一问题,实际上与整个项目的过程定义有关。例如,如果我们有专门安排数据库概要设计的活动,那我们在架构设计的过程中就可以只需要关注更高层次的数据库特性及数据库之间的关系,而每一张表的数据字典可以在后续的相关活动中进行设计,但如果没有这样的活动,那我们就要细化到每一张表的每一个栏位,以及表之间的关系。

        3、解决技术面的重点问题和难题

        在软件架构设计的过程中,我们往往会需要攻克一些技术面的重点问题和难题,这完全是一项极其需要扎实的理论知识和丰富的实践经验支撑的工作。例如,我们如何提高整个系统的性能?如何能很好的导出极其复杂的“中国式报表”(一般比西方国家产出的报表要复杂很多,而且很多开源的BI类的框架并不能完全解决问题)?

        当遇到确实是很困难的问题,可以去求助度娘或Google,可以想尽办法一切可行的方式去解决,但是千万不要让问题停留在原地。

        4、召开架构设计评审会议进行同行评审

        架构设计评审是极其重要的一环,我曾将其形容为“七种武器”中的离别钩,就是因为在会议上,同行们可能会提很多问题或意见,而且很多意见很尖锐,所以一定要虚心接受,并做好记录,正所谓“良药苦口利于病,忠言逆耳利于行”。

        在评审会议之前,我们要完成很多准备工作,最好是能准备一份简明扼要的电子简报,把最重要的问题列出来,这样在进行评审会议时,就不会漫无目的,在会议前就将这些资料发给与会人员,请他们抽空先了解一下,在会议进行时,要学会控制会议的进度,提高会议的效率。

        5、针对关键Use Case在设计的架构上实现功能来验证架构。

        对于架构设计的验证也是一项十分重要的工作,其验证技术有很多种,在我们公司通常会采用Sample的形式,即XP中所说的迭代0,RUP中所说的切片。这样做的好处是既可以从实际的产品角度出发来有效的验证架构是否满足要求,又可以比抛弃型原型验证技术节省成本。

        这个Sample绝不是我们在解决架构设计中的问题时拿来做实验的一些代码的拼凑,而是完整的实现某一关键Use Case的符合架构设计和一系列规范的可交付的代码及相关文档。同时,这个Sample可以作为你在给大家讲解或培训架构时的教材,也可以作为开发人员使用此架构进行开发的蓝本,甚至是只需要复制粘贴,加上简单的修改即可。

        6、交付给客户Review。

        这一环节,在很多公司可能并不存在,因为他们的软件架构并不一定需要客户Review,但像我们这种做服务的公司,最重要的就是客尊,落实到软件架构设计这一活动,就是让客户理解并接受你的架构设计方案,同时,客户也会起到帮你验证架构的作用。通常,我们的架构得到客户的认可后,便可进入大规模的开发。

    5.软件架构设计的常见误区和解决方案

    1. 架构设计的常常会“高来高去”。所谓高来高去,实际上就是我们的架构设计仅停留在模型阶段,但也绝不是产生第一支样例程式。
    2. 架构设计时常常会在某些方面过度设计(Over engineering)。为了一些根本不会发生的变化而进行一系列复杂的设计,这样的设计就叫过度设计,往往会带来资源的浪费并且会增加开发的工作量或难度。虽然我们必须考虑到系统的扩展性,可维护性等,但切忌过度设计。有时候或许你并不能判断出哪些设计是过度设计,此时你可以请教你的PM,让他站在整个项目的高度来帮你决策一下。
    3. 架构(Architecture)不是框架(Framework),也不是简单的将几种框架或技术的组合,框架本身也是有架构的。框架一般是针对于某一方面或领域的重用性和可扩展性非常好的半成品,我们可以用一句较为经典的话来总结:框架是软件,架构不是软件,框架是一种特殊的软件。我们在工作中通过将许多方面的可重用的工具类,公共类,基础类等抽象出来,即可形成一些可重用的框架。
    4. 架构设计绝不是新技术展示平台,合适的技术才是对于项目有利的技术,必须考虑到开发人员的能力和维护人员的能力。作为一名架构设计师应该更多的考虑如何平衡业务需求,织织运作(主要指团队中的协作)和技术三者的关系,而不仅仅是去关注那些技术细节。
    5. 架构设计的成功与否决定着系统品质的好坏,因为架构设计不好而导致交付的系统Bug过多,无法满足客户非功能性需求等问题,从而导致项目取消的案例时有发生。架构设计不是架构设计师一个人的事情,也不是几天就能完成的一项工作,必须是架构设计师付出大量辛勤劳动后的成果,其成败往往与组织、主管、项目经理的支持有着密切的关系。

    6.软件架构设计的通用技巧

    • 分层(Layer)规则:这里的层是指逻辑上的层次(Layer),并非指物理上的层次(Tier)。目前的绝大多数的企业级应用系统中都分为三层,即表现层,领域层和数据层。在对各层次进行划分时,主要可以从以下几个方面来考虑:A、每一层是一个相对独立的部分,可以作为一个整体,无需对其它层了解;B、将层次间的依赖性降到最低,即降低耦合;C、可以从某种程度上替换掉某一层,而对其它层不会产生过多的影响;D,层次并不能封闭所有的东西,假如用户界面上增加了一个栏位,那么领域层就要增加一个数据域,数据层就要增加一个相应的字段。同时,过多的分层可能会对性能造成一定的影响。
    • 包(package)之间不要产生循环依赖:通常包的划分会先按不同的逻辑层来划分,在层的包下面再按功能来划分。避免包间的循环依赖是一个比较通用的规则,这样的规则一定有其存在的价值和道理,之所以这样主要是出于以下原因:A、循环依赖会使分层失去意义;B、循环依赖会带来许多潜在的风险,如可能会产生嵌套事务(nested transaction,JavaEE标准中并不支持这种事务)的现象,我就曾遇到过这样的问题,在一个项目中,事务放在业务逻辑层统一控制,但由于开发人员忽视了架构中这样的原则,在持久层调用了展现层的公用类,形成了回圈的现象,导致了嵌套事务的发生。
    • 设计模式的应用:在很多人的观念里,提供设计模式就等同于GOF的设计模式,其实设计模式是个广泛的概念,比如需求模式、领域模式、反模式等都属于设计模式。模式其实是一门工具,是人们对于过去解决某一类问题的经验总结,所以我们可以在设计活动中应用各种设计模式,但是在应用这些模式之前一定要先分析清楚问题,否则就可能出现“牛头不对马嘴”的现象。

    7.写在最后

    本文是题主转载与几位博主的文章,再次题主将其再次写出来为了便于查看,另外一方面也会在后来做该方面工作的时候可以继续去补充,希望能和大家共勉,一起去贡献出更精彩的博客!

    注:文章转载列表:

    1.架构师必看:谈软件架构师如何做好架构设计

    2.软件架构设计总结

    3.对软件架构设计的一些总结和理解


    题主只是一个入门的小学生,希望大家多多指教!如果该帖子确实能解决您的问题,望多多留言,谢谢!


    展开全文
  • 软件架构仍在不断发展中,还没有形成一个统一的、公认的定义,这里仅举出几个较为权威的定义。 软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系...

    架构的定义

         软件架构仍在不断发展中,还没有形成一个统一的、公认的定义,这里仅举出几个较为权威的定义。

    1. 软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。

    2. 软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式的约束组成。

    3. 软件架构是指一个系统的基础知识,它具体体现在:系统的构件,构件之间、构件与环境之间的关系,以及指导其设计和演化的原则上。(IEEE1471-2000)


      从技术角度看,软件架构的重要性

      1. 项目关系人之间交流的平台

      2. 早期设计决策。从软件生命周期来看,软件架构是所开发系统的最早设计决策的体现。
        表现为: (1)架构明确了对系统实现的约束条件;(2)架构影响着系统的质量属性;(3)架构可以用来预测系统的质量;(4)架构为维护的决策提供依据;(5)架构有助于原型开发。

      3. 在较高层面上实现软件复用

      4. 架构对开发的指导与规范意义不容忽略

         基于架构的软件开发模型则明确地把整个软件过程划分为:架构需求、设计、文档化、评审(评估)、实现、演化等 6 个子过程。

    架构的模型

    最常用的是结构模型和动态模型。

    1. 结构模型。这是一个最直观、最普遍的建模方法。这种方法以架构的构件、连接件和其他概念来刻画结构,并力图通过结构来反应系统的重要语义内容,包括系统的配置、约束、隐含的假设条件、风格、性质。研究结构模型的核心是架构描述语言
    2. 框架模型。框架模型于结构模型类似,但它不太侧重描述结构的细节而更侧重于整体的结构。框架模型主要以一些特殊的问题为目标建立只针对和适应问题的机构。
    3. 动态模型。动态模型是对结构或框架模型的补充,研究系统“大颗粒”的行为性质。例如,描述系统的重新配置和演化。动态可能指系统总体结构的配置、建立或查出通信通道或计算的过程。
    4. 过程模型。过程模型研究构造系统的步骤和过程。因而结构是遵循某些过程脚本的结果。
    5. 功能模型。该模型认为架构由一组功能构件按层次组成,且下层向上层提供服务。它可以看做是一种特殊的框架模型。

    “4+1”视图模型从 5 个不同的视角包括逻辑视图、进程视图、物理视图、开发视图、场景视图来描述软件架构。每一个视图只关心系统的一个侧面,5 个视图结合在一起才能反应系统的软件架构的全部内容。如下图所示:

    在这里插入图片描述

    视图名称功能关注点关注人员
    逻辑视图主要支撑系统的功能需求描述系统功能用户
    开发视图(模块视图、实现视图)主要侧重于软件模块的组织和管理描述系统配置、装配编程人员
    进程视图侧重于系统的运行特性,一些非功能性的需求描述系统性能、吞吐系统集成人员
    物理视图主要考虑如何把软件映射到硬件上描述系统安装、拓扑结构、通信等系统工程师
    场景视图(用例视图)使四个视图有机得联系起来描述人机互动的系统行为分析人员和测试人员

    在这里插入图片描述

    软件质量属性


    案例分析常考
    属性子属性作用及要点应对策略
    性能效率指标:处理任务所需时间或单位时间内的处理量增加计算资源、减少计算开销、引入并发机制、资源调度
    可靠性容错出现错误后仍能保证系统正常运行,且自行修正错误主动冗余
    健壮性错误不对系统产生影响,按既定程序忽略错误
    可用性正常运行时间比例心跳、Ping/Echo、主动冗余、被动冗余、选举
    安全性系统向合法用户提供服务并组织非法用户的能力侵入检测、用户认证、用户授权、追踪审计、限制访问
    可修改性可维护性局部修复故障对架构的负面影响最小化软件模块泛化、限制模块之间通信、使用中介和延迟绑定、运行时注册、接口实现分离、信息隐蔽
    可拓展性因松散耦合更易实现新特性/功能,不影响架构
    结构重组不影响主体进行的灵活配置
    可移植性适用于多样的环境(硬件平台、语言、操作系统)
    功能性需求的满足程度构建协作
    可变性总体架构可变预先定义规则,作为相关产品基础
    互操作性通过可视化或接口方式提供更好的交互操作体验交互作用
    可测试性软件发现故障并隔离,定位其故障的能力特性记录回放

    软件架构风格

    这部分内容比较多,我又总结了另一篇文章
    软考-系统架构设计师(软件架构风格)

    层次系统架构风格

    二层C/S架构

    提出的原因:C/S架构是基于资源不对等,且为实现共享而提出来的

    结构:C/S结构将应用一分为二,服务器(后台)负责数据管理,客户机(前台)完成与客户的交互任务。

    优点:C/S软件架构具有强大的数据操作和事物处理能力,模型思想简单,易与人们理解和接受。

    局限: (1)二层C/S结构为单一服务器且以局域网为中心,所以难以扩展至大型企业广域网或Internet;
                (2)软、硬件的组合及集成能力有限;
                (3)服务器的负荷太重,难以管理大量的客户机,系统的性能容易变坏;
                (4)数据安全性不好。

    三层C/S架构

    结构:将应用功能分成表示层、功能层和数据层三个部分

    • 表示层:是应用的用户接口部分,它负担着用户与应用间的对话功能。它用于检查用户 从键盘等输入的数据,并显示应用输出的数据。在变更用户接口时,只需修改显示控制和数据检查程序,而不影响其他两层。检查的内容也只限于数据的形式和取值的范围,不包括有关业务本身的处理逻辑。
    • 功能层:相当于应用的本体,它是将具体的业务处理逻辑编入程序中。而处理所需的数据则要从表示层或数据层取得。表示层和功能层之间的数据交互要尽可能简洁。
    • 数据层:就是数据库管理系统,负责管理对数据库数据的读写。数据库管理系统必须能迅速执行大量数据的更新和检索。因此,一般从功能层传送到数据层的要求大都使用 SQL 语言。

    在这里插入图片描述

    解决方案:对这三层进行明确分割,并在逻辑上使其独立。原来的数据层作为数据库管理系统已经独立出来,所以,关键是要将表示层和功能层分离成各自独立的程序,并且还要使这两层间的接口简洁明了。一般情况下是只将表示层配置在客户机中,如果将功能层也放在客户机中,与二层 C/S 结构相比,其程序的可维护性要好得多,但是其他问题并未得到解决。客户机的负荷太重,其业务处理所需的数据要从服务器传给客户机,所以系统的性能容易变差。如果将功能层和数据层分别放在不同的服务器中,则服务器和服务器之间也要进行数据传送。但是,由于在这种形态中三层是分别放在各自不同的硬件系统上,所以灵活性很高,能够适应客户机数目的增加和处理负荷的变动。

    B/S 架构风格

    使用技术:B/S 结构主要是利用不断成熟的 WWW 浏览器技术,结合浏览器的多种脚本语言,用通用浏览器就实现了原本需要复杂的专用软件才能实现的强大功能,并节约了开发成本。

    在这里插入图片描述

    优点:基于 B/S 架构的软件,系统安装、修改和维护全在服务器端解决(零客户端),很容易在运行时自动升级。也可以更加充分利用网络上的各种资源,同时应用程序维护的工作量也大大减少。

    不足:(1)B/S 架构缺乏对动态页面的支持能力,没有集成有效的数据库处理功能;
               (2)采用 B/S 架构的应用架构,在数据查询等响应速度上,要远远地低于 C/S 架构;
               (3)B/S 架构的数据提交一般以页面为单位,数据的动态交互性不抢,不利于在线事务处理(OnLine Transaction Processing,简称 OLTP )应用。

    MVC架构风格

    定义:全名是 Model ViewController,是模型(model)- 视图(view)- 控制器(controller)的缩写,分层架构的一种。

    分工协作

    • Model 是对应用状态和业务功能的封装。Model 接受 Controller 的请求并完成响应的业务处理,在状态改变的时候向 View 发出相应的通知。
    • View 实现可视化界面的呈现并捕捉最终用户的交互操作(例如鼠标和键盘的操作)。
    • Controller 会根据需要控制原 View 或者创建新的 View 对用户交互操作予以响应。View 捕获到用户交互操作后直接转发给 Controller,后者完成相应的 UI 逻辑。如果需要涉及业务功能的调用,Controller 会直接调用 Model。

    在这里插入图片描述

    MVP架构风格

    定义:全称为 Model-View-Presenter。MVP 是从MVC 演变而来。

    与MVC的相同点:基本思想有相通的地方:Model 提供数据,View 负责显示,Controller/Presenter 负责逻辑的处理。

    与MVC的不同点:MVC模式中元素之间“混乱”的交互主要体现在允许 View 和 Model 直接进行“交流”,这在MVP 中是不允许的。在 MVP 中 View 并不直接使用 Model,它们之间的通信是通过 Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter 内部,而在 MVC 中 View 会直接从 Model 中读取数据而不是通过 Controller。

    缺点:由于对视图的渲染放在了 Presenter 中,所以视图和 Presenter 的交互会过于频繁。还有一点需要明白,如果 Presenter 过多的渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么 Presenter 也需要变更了。

    优点:(1)模型与视图完全分离,我们可以修改视图而不影响模型;
               (2)可以更高效的使用模型,因为所有的交互都发生在一个地方——Presenter 内部。
               (3)我们可以将一个 Presenter 用于多个视图,而不需要改变 Presenter 的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;
               (4)如果我们把逻辑放在 Presenter 中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

    面向服务的架构(SOA)

    典型的定义:(1)W3C 的定义:SOA 是一种应用程度架构,在这种架构中,所有功能都定义为独立的服务,这些服务带有定义明确的可调用接口,能够以定义好的顺序调用这些服务来形成业务流程。
                          (2)Service-architecture.com 的定义:服务是精确定义、封装完善、独立于其他服务所处环境和状态的函数。SOA 本质上是服务的集合,服务之间彼此通信,这种通信可能是简单的数据传送,也可能是两个或更多的服务协调进行某些活动。服务之间需要某些方法进行连接。
                          (3)Gartner 的定义: SOA 是一种 C/S 架构的软件设计方法,应用由服务和服务使用者组成,SOA 于大多数通用的 C/S 架构模型不同之处,在于它着重强调构件的松散耦合,并使用独立的标准接口。

    **概述:**SOA是一种在计算环境中设计、开发、部署和管理离散逻辑单元(服务)模型的方法。由于 SOA 考虑到了系统内的对象,所以虽然 SOA 是基于对象的,但是作为一个整体,它却不是面向对象的。

    在这里插入图片描述
    服务的基本结构:

    在这里插入图片描述

    SOA 设计原则:

    1. 明确定义的接口
    2. 自包含和模块化
    3. 粗粒度
    4. 松耦合
    5. 互操作性、兼容和策略声明

    SCA 服务构件于传统构件的区别:服务构件往往是粗粒度的,而传统构件以细粒度居多;服务架构的接口是标准的,主要是服务描述语言接口,而传统构件常以具体 API 形式出现;服务构件的实现与语言是无关的,而传统构件常绑定某种特定的语言;服务构件可以通过构件容器提供 QoS 的服务,而传统构件完全由程序代码直接控制。

    SOA 的关键技术:这些技术都是以 XML 为基础而发展起来的。

    UDDI统一描述、发现和集成数据模型;API;注册服务
    WSDLWeb 服务描述语言服务实现定义包含:服务、端口;服务接口定义包含:绑定、端口类型、消息、类型
    SOAP简单对象访问协议定义了服务请求和服务提供者之间的消息传输规范。SOAP包含:封装、编码规则、RPC表示、绑定。SOAP消息包含:封装(信封)、SOAP 头、SOAP体。
    REST表述性状态转移是一种只使用 HTTP 和 XML 进行基于 Web 通信的技术,可以降低开发的复杂性,提高系统的可伸缩性。

    SOA 的实现方法:

    1. Web Service

    在这里插入图片描述

    1. 服务注册表

    (1)服务注册
    (2)服务位置
    (3)服务绑定

    1. 企业服务总线(ESB)

    内容:ESB 提供了一种基础设施,消除了服务请求者与服务提供者之间的直接连接,使得服务请求者和服务提供者进一步解耦。EJB 是由中间件技术实现并支持 SOA 的一组基础架构 ,是传统中间件技术于 XML、Web Service 等技术结合的产物,是在整个企业集成架构下的面向服务的企业应用集成机制。

    功能:(1)支持异构环境中的服务、消息和基于事件的交互,并且具有适当的服务级别和可管理性;(2)通过使用 ESB ,可以在几乎不更改代码的情况下,以一种无缝的非侵入方式使现有系统具有全新的服务接口,并能够在部署环境中支持任何标准;(3)充当缓冲的 ESB 与服务逻辑相分离,从而使不同的系统可以同时使用同一个服务,不用在系统或数据发生变化时,改动服务代码;(4)在更高的层次,ESB 还提供诸如服务代理和协议转换等功能;(5)头攻可配置的消息转换翻译机制和基于消息内容的消息路由服务,传输消息到不同的目的地。

    优势:(1)扩展的、基于标准的连接;(2)灵活的、服务导向的应用组合;(3)提高复用率,降低成本;(4)减少市场反应时间,提高生产率。

    微服务

    优势:(1)技术异构性;(2)弹性;(3)扩展;(4)简化部署;(5)与组织结构相匹配;(6)可组合型;(7)对可替代性的优化

    挑战:(1)分布式系统的复杂度;(2)运维成本;(3)部署自动化;(4)DevOps 与组织结构;(5)服务间依赖测试;(6)服务间依赖管理

    微服务与 SOA :
    在这里插入图片描述

    架构设计

    在这里插入图片描述

    软件架构文档化

    内容: 一是过程,编档过程能促使架构设计师进一步思考,使得架构更加完善;二是结果,描述架构的文档将作为架构开发的成功,供项目关系人使用。

    架构文档的使用者:架构的项目关系人。编写技术文档最基本的原则之一是要从读者的角度来编写。

    编档规则:

    1. 从读者的角度编写文档
    2. 避免出现不必要的重复
    3. 避免歧义
    4. 使用标准结构
    5. 记录基本原理
    6. 使文档保持更新,但更新频率不要过高
    7. 针对目标的适应性对文档进行评审

    视图编档:

    在这里插入图片描述

    软件架构评估

    方法:

    1. 基于调查问卷或检查表的方式(依赖于评估人员的主观推断)
    2. 基于场景的方式:应用在架构权衡分析法(ATAM)和软件架构分析方法(SAAM)中。它是通过分析软件架构对场景的支持程度,从而判断该架构对这一场景所代表的质量需求的满足程度。
    3. 基于度量的方式:建立在软件架构度量的基础上

    架构权衡分析法(ATAM)

    步骤:

    • ATAM 方法的表述:评估负责人向参加会议的项目代表介绍 ATAM
    • 商业动机的表述
    • 架构的表述
    • 对架构方法进行分类
    • 生成质量属性效用树
    • 分析架构方法
    • 集体讨论并确定场景的优先级
    • 分析架构方法
    • 结果的表述

    分析得到的信息:

    • 已编写了文档的架构方法
    • 经过讨论得到的场景集合及其优先级
    • 效用树
    • 所发现的有风险决策
    • 已编成文档的无风险决策
    • 所发现的敏感点和权衡点
    展开全文
  • 软件架构设计---软件架构概述

    万次阅读 2018-09-17 21:25:54
    通俗地讲,软件架构设计就是软件系统的“布局谋篇”。  人们在软件工程实践中,逐步认识到了软件架构的重要性,从而开辟了一个崭新的研究领域。软件架构的研究内容主要涉及软件架构描述、软件架构设计、软件架构...

         像学写文章一样,在学会字、词、句之后,就应上升到段落,就应追求文章的“布局谋篇”,这就是架构。通俗地讲,软件架构设计就是软件系统的“布局谋篇”。

        人们在软件工程实践中,逐步认识到了软件架构的重要性,从而开辟了一个崭新的研究领域。软件架构的研究内容主要涉及软件架构描述、软件架构设计、软件架构风格、软件架构评价和软件架构的形成方法等。

        软件设计人员学习软件架构知识旨在站在较高的层面上整体地解决好软件的设计、复用、质量和维护等方面的实际问题。

       1 软件架构概述 

        软件架构是软件抽象发展到一定阶段的产物,从编程的角度,可以清晰地看到软件抽象层次和表达工具的发展历史。

    • 20 世纪 60 年代是子程序的年代:出现了原始的软件架构,即子程序,并以程序间的调用为连接关系。

    • 20 世纪 70 年代是模块化的年代:出现了数据流分析、实体—关系图(E-R 图)、信息隐藏等工具和方法,软件的抽象层次发展到了模块级。

    • 20 世纪 80 年代是面向对象的年代:基于模块化的编程语言进一步发展成面向对象的语言,继承性地增加了一种新元素之间的连接关系。

    • 20 世纪 90 年代是框架的年代:标准的基于对象的架构以框架的形式出现了。如电子数据表、文档、图形图像、音频剪辑等可互换的黑箱对象,可以相互嵌入。

    • 当前(最近 10 年来):中间件和 IT 架构作为标准平台出现,用可购买可复用的元素来构建系统,同时,基于架构的开发方法和理论不断成熟。

    1  软件架构的定义 

        软件架构仍在不断发展中,还没有形成一个统一的、公认的定义,这里仅举出几个较权威的定义。

        定义 1:软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。

        定义 2:软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素的相互作用、指导元素集成的模式及这些模式的约束组成。

        定义 3:软件架构是指一个系统的基础组织,它具体体现在:系统的构件,构件之间、构件与环境之间的关系,以及指导其设计和演化的原则上。(IEEE1471- 2000)

       前两个定义都是按“元素—结构—架构”这一抽象层次来描述的,它们的基本意义相同,其中定义 1 较通俗,因此,本章采用这一定义。该定义中的“软件元素”是指比“构件”更一般的抽象,元素的“外部可见属性”是指其他元素对该元素所做的假设,如它所提供的服务、性能特征等。

        为了更好地理解软件架构的定义,特作如下说明:

        (1)架构是对系统的抽象,它通过描述元素、元素的外部可见属性及元素之间的关系来反映这种抽象。因此,仅与内部具体实现有关的细节是不属于架构的,即定义强调元素的“外部可见”属性。

        (2)架构由多个结构组成,结构是从功能角度来描述元素之间的关系的,具体的结构传达了架构某方面的信息,但是个别结构一般不能代表大型软件架构。

        (3)任何软件都存在架构,但不一定有对该架构的具体表述文档。即架构可以独立于架构的描述而存在。如文档已过时,则该文档不能反映架构。

        (4)元素及其行为的集合构成架构的内容。体现系统由哪些元素组成,这些元素各有哪些功能(外部可见),以及这些元素间如何连接与互动。即在两个方面进行抽象:在静态方面,关注系统的大粒度(宏观)总体结构(如分层);在动态方面,关注系统内关键行为的共同特征。

        (5)架构具有“基础”性:它通常涉及解决各类关键的重复问题的通用方案(复用性),以及系统设计中影响深远(架构敏感)的各项重要决策(一旦贯彻,更改的代价昂贵)。

        (6)架构隐含有“决策”,即架构是由架构设计师根据关键的功能和非功能性需求(质量属性及项目相关的约束)进行设计与决策的结果。不同的架构设计师设计出来的架构是不一样的,为避免架构设计师考虑不周,重大决策应经过评审。特别是架构设计师自身的水平是一种约束,不断学习和积累经验才是摆脱这种约束走向自由王国的必经之路。

        在设计软件架构时也必须考虑硬件特性和网络特性,因此,软件架构与系统架构二者间的区别其实不大。但是,在大多情况下,架构设计师在软件方面的选择性较之硬件方面,其自由度大得多。因此,使用“软件架构”这一术语,也表明了一个观点:架构设计师通常将架构的重点放在软件部分。

        将软件架构置于商业背景中进行观察,可以发现软件架构对企业非常重要。

        (1)影响架构的因素。软件系统的项目干系人(客户、用户、项目经理、程序员、测试人员、市场人员等)对软件系统有不同的要求开发组织(项目组)有不同的人员知识结构、架构设计师的素质与经验、当前的技术环境等方面都是影响架构的因素。

    这些因素通过功能性需求、非功能性需求、约束条件及相互冲突的要求,影响架构设计师的决策,从而影响架构。

        (2)架构对上述诸因素具有反作用,例如,影响开发组织的结构。架构描述了系统的大粒度(宏观)总体结构,因此可以按架构进行分工,将项目组为几个工作组,从而使开发有序;影响开发组织的目标,即成功的架构为开发组织提供了新的商机,这归功于:系统的示范性、架构的可复用性及团队开发经验的提升,同时,成功的系统将影响客户对下一个系统的要求等。这种反馈机制构成了架构的商业周期。

    2 软件架构的重要性 

        从技术角度看,软件架构的重要性表现为如下几方面。

        (1)项目关系人之间交流的平台。软件系统的项目关系人分别关注系统的不同特性,而这些特性都由架构所决定,因此,架构提供了一个共同语言(公共的参考点),项目关系人以此作为彼此理解、协商、达成共识或相互沟通的基础。架构分析既依赖于又促进了这个层次上的交流。

        (2)早期设计决策。从软件生命周期来看,软件架构是所开发系统的最早设计决策的体现,主要表现为:

    • 架构明确了对系统实现的约束条件:架构是架构设计师对系统实现的各方面进行权衡的结果,是总体设计的体现,因此,在具体实现时必须按架构的设计进行。

    • 架构影响着系统的质量属性:要保证系统的高质量,具有完美的架构是必要的(虽然不充分)。

    • 架构可以用来预测系统的质量,例如,可以根据经验对该架构的质量(如性能)作定性的判断。

    • 架构为维护的决策提供根据。在架构层次上能为日后的更改决策提供推理、判断的依据。一个富有生命力的架构,应该是在最有可能更改的地方有所考虑(架构的柔性),使其在此点最容易进行更改。

    • 架构有助于原型开发。可以按架构构造一个骨架系统(原型),例如,在早期实现一个可执行的特例,确定潜在的性能问题。

    • 借助于架构进行成本与进度的估计。

        (3)在较高层面上实现软件复用。软件架构作为系统的抽象模型,可以在多个系统间传递(复用),特别是比较容易地应用到具有相似质量属性和功能需求的系统中。产品线通常共享一个架构。产品线的架构是开发组织的核心资产之一,利用架构及其范例进行多系统的开发,在开发时间、成本、生产率和产品质量方面具有极大的回报。基于架构的开发强调对各元素的组合或装配。系统开发还可以使用其他组织开发的元素,例如购买商业构件。

        (4)架构对开发的指导与规范意义不容忽略。架构作为系统的总体设计,它指导后续的详细设计和编码。架构使基于模板的开发成为可能,有利于开发的规范化和一致性,减少开发与维护成本。架构可以作为培训的基础,有利于培养开发团队和培训相关人员。

       从软件开发过程来看,如果采用传统的软件开发模型(生命周期模型),则软件架构的建立应位于概要设计之前,需求分析之后。

        基于架构的软件开发模型则明确地把整个软件过程划分为架构需求、设计、文档化、评审(评估)、实现、演化等 6 个子过程。本章各节将分别对这些子过程进行讨论。

    3 架构的模型

        软件架构作为一个有机的整体,可以分解成多个侧面来认识,每个侧面强调它的不同方面的特征,从而使架构设计师能整体地把握它的重点。我们可以将软件架构归纳成 5 种模型:结构模型、框架模型、动态模型、过程模型和功能模型。最常用的是结构模型和动态模型。

        (1)结构模型。这是一个最直观、最普遍的建模方法。这种方法以架构的构件、连接件和其他概念来刻画结构,并力图通过结构来反映系统的重要语义内容,包括系统的配置、约束、隐含的假设条件、风格、性质。研究结构模型的核心是架构描述语言。

        (2)框架模型。框架模型与结构模型类似,但它不太侧重描述结构的细节而更侧重于整体的结构。框架模型主要以一些特殊的问题为目标建立只针对和适应该问题的结构。

        (3)动态模型。动态模型是对结构或框架模型的补充,研究系统“大颗粒”的行为性质。例如,描述系统的重新配置或演化。动态可能指系统总体结构的配置、建立或拆除通信通道或计算的过程。

        (4)过程模型。过程模型研究构造系统的步骤和过程。因而结构是遵循某些过程脚本的结果。

        (5)功能模型。该模型认为架构由一组功能构件按层次组成,且下层向上层提供服务。它可以看作是一种特殊的框架模型。

        这 5 种模型各有所长,也许将 5 种模型有机地统一在一起,形成一个完整的模型来刻画软件架构更合适。即将软件架构视为这些模型的统一体,通过这些模型的表述(文档)来完整反映软件架构。例如,Kruchten 在 1995 年提出了一个“4+1”的视图模型。“4+1” 视图模型从 5 个不同的视角包括逻辑视图、进程视图、物理视图、开发视图和场景视图来描述软件架构。每一个视图只关心系统的一个侧面,5 个视图结合在一起才能反映系统的软件架构的全部内容。“4+1”视图模型如图 9-1 所示。

        (1)逻辑视图:主要支持系统的功能需求,即系统提供给最终用户的服务。在逻辑视图中,系统分解成一系列的功能抽象,这些抽象主要来自问题领域。这种分解不但可以用来进行功能分析,而且可用作标识在整个系统的各个不同部分的通用机制和设计元素。在面向对象技术中,通过抽象、封装和继承,可以用对象模型来代表逻辑视图,用类图来描述逻辑视图。逻辑视图中使用的风格为面向对象的风格,逻辑视图设计中要注意的主要问题是要保持一个单一的、内聚的对象模型贯穿整个系统。

        (2)开发视图:也称为模块视图,主要侧重于软件模块的组织和管理。软件可通过程序库或子系统进行组织,这样,对于一个软件系统,就可以由不同的人进行开发。开发视图要考虑软件内部的需求,如软件开发的容易性、软件的重用和软件的通用性,要充分考虑由于具体开发工具的不同而带来的局限性。开发视图通过系统输入输出关系的模型图和子系统图来描述。可以在确定了软件包含的所有元素之后描述完整的开发角度,也可以在确定每个元素之前,列出开发视图原则。

        (3)进程视图:侧重于系统的运行特性,主要关注一些非功能性的需求,例如系统的性能和可用性。进程视图强调并发性、分布性、系统集成性和容错能力,以及逻辑视图中的主要抽象的进程结构。它也定义逻辑视图中的各个类的操作具体是在哪一个线程中被执行的。进程视图可以描述成多层抽象,每个级别分别关注不同的方面。

        (4)物理视图:主要考虑如何把软件映射到硬件上,它通常要考虑到解决系统拓扑结构、系统安装、通信等问题。当软件运行于不同的节点上时,各视图中的构件都直接或间接地对应于系统的不同节点上。因此,从软件到节点的映射要有较高的灵活性,当环境改变时,对系统其他视图的影响最小。

        (5)场景:可以看作是那些重要系统活动的抽象,它使四个视图有机地联系起来,从某种意义上说,场景是最重要的需求抽象。在开发架构时,它可以帮助设计者找到架构的构件和它们之间的作用关系。同时,也可以用场景来分析一个特定的视图,或描述不同视图构件间是如何相互作用的。场景可以用文本表示,也可以用图形表示。

        希赛教育专家提示:逻辑视图和开发视图描述系统的静态结构,而进程视图和物理视图描述系统的动态结构。对于不同的软件系统来说,侧重的角度也有所不同。例如,对于管理信息系统来说,比较侧重于从逻辑视图和开发视图来描述系统,而对于实时控制系统来说,则比较注重于从进程视图和物理视图来描述系统。

    展开全文
  • 微服务架构设计实践 目 次1 序言2 微服务3 软件架构设计思想4 微服务架构设计实践4.1 项目概述4.2 架构准备阶段4.3 概念架构阶段4.4 细化架构阶段4.4.1 业务架构4.4.2 数据架构4.4.3 应用架构4.4.4 技术架构4.4.5 ...
  • 软件架构设计之工具实践篇

    千次阅读 2019-05-12 18:16:10
    前面写了两篇软件架构设计的文章,思想篇和理论篇,今天Relax君想跟大家聊一聊如何通过具体的工具去画出软件架构设计中的那些图,这其实也正是上篇文章《这个公众号后面会写些什么》中写到的,Relax君会给大家分享...
  • 嵌入式软件架构设计之分层设计

    千次阅读 2020-01-15 18:00:47
    当然,不能说完全需要,至少对于大多数项目而言,都需要有一个软件架构设计,好处也是有很多,这里罗列一些: 1、应用的代码逻辑清晰,且避免重复的造轮子。 2、如果没有好的架构,移植将会是一件很痛苦的事情。 3、...
  • 软件架构设计文档》模板,很实用。特别是对于初次开发项目的人员来说,又很好的指导意义。
  • 软件架构设计-五视图方法论

    千次阅读 2019-03-06 16:33:17
    在实际工作中,我们经常听到“架构”和“架构师”这样的名词,并不新鲜,但是总让很多刚入门的 ​​​在实际工作中,我们经常听到“架构”和“架构师”这样的名词,并不新鲜,但是总让很多刚入门的人感觉很神秘,...
  • 软件架构设计的6个步骤及工作内容

    千次阅读 2020-01-15 10:12:04
    如何有序、高效、全面做好软件架构设计呢?作为一名软件架构师,应该具备的基本素质是:掌握架构设计的基本步骤,且清晰每个步骤的工作内容。本文结合实际项目经验,将对软件架构设计的步骤及工作内容进行介绍。 在...
  • 温昱--软件架构设计

    热门讨论 2011-09-19 00:07:24
    本书紧紧围绕“软件架构设计”这一主题,立足实践解析了软件架构的概念、阐述了切实可行的软件架构设计方法、提供了可操作性极强的完整的架构设计过程。另外,本书从思维方式的突破、面向对象设计、UML建模、过程与...
  • 软件架构设计---软件架构风格

    万次阅读 多人点赞 2018-09-17 21:33:52
     软件架构设计的一个核心问题是能否使用重复的软件架构模式,即能否达到架构级别的软件重用。也就是说,能否在不同的软件系统中,使用同一架构。基于这个目的,学者们开始研究和实践软件架构的风格和类型问题。  ...
  • 软件架构设计,软件架构电子书

    热门讨论 2010-10-08 13:38:03
    软件架构设计教材。教会你怎样搞软件架构设计。实例较多,理论丰富,很快学会软件架构设计。软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。软件架构是一个系统的...
  • 软件架构设计

    千次阅读 2015-08-16 21:20:46
    什么是软件架构前言:软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要...
  • 前面写了两篇软件架构设计的文章,今天Relax想跟大家聊一聊如何通过具体的工具去画出软件架构设计中的那些图,那么今天主要给大家分享的是一个好用的架构设计画图工具——Enterprise Architect(后面都简称EA)。...
  • 软件架构设计---软件架构视图

    万次阅读 2018-09-18 07:38:21
    软件架构视图  从软件架构本身的特点出发讨论了架构建模及与特定应用领域密切相关的架构风格。本节将从对架构编档的角度对软件架构视图及其风格进行讨论。 1 软件视图的分类   现代软件系统非常复杂,通常在...
  • STM32软件架构设计

    千次阅读 多人点赞 2019-10-30 13:35:55
    STM32软件架构 1、架构设计的意义 (1)应用代码逻辑清晰,且避免代码冗余; (2)代码通用性,方便软件高速、有效的移植; (3)各功能独立,低耦合高内聚; 2、总体架构图 3、结构层说明 4、遵循规则 5、...
  • 软件架构设计说明书

    热门讨论 2012-04-28 10:43:08
    一个真实完整的图书杂志采购和借阅系统软件架构设计文档
  • 软件架构设计---软件架构文档化

    万次阅读 2018-09-18 07:14:38
    它包含两个方面:一是过程,编档过程能促使架构设计师进一步思考,使得架构更加完善;二是结果,描述架构的文档将作为架构开发的成果,供项目关系人使用。  1.架构文档的使用者  架构文档的使用者是架构的项目...
  • 软件架构设计过程实例

    热门讨论 2012-05-30 11:00:07
    这是一个关于大学信息系统的软件架构设计过程实例,PPT文档
  •  软件属性包括功能属性和质量属性,但是,软件架构(及软件架构设计师)重点关注的是质量属性。因为,在大量的可能结构中,可以使用不同的结构来实现同样的功能性,即功能性在很大程度上是独立于结构的,架构设计师...
  • 软件架构设计的一些总结和理解

    万次阅读 多人点赞 2015-09-06 22:28:18
    1. 软件架构设计的What & Why ● 啥是软件架构(Software Architecture)? 软件架构是指在一定的设计原则基础上,从不同角度对组成系统的各部分进行搭配和安排,形成系统的多个结构而组成架构,它包括该系统...
  • 软件架构设计 软件架构是软件抽象发展到一定阶段的产物,从编程的角度,可以清晰地看到软件抽象层次和表达工具的发展历史。 软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的...
  • 软件架构设计---软件架构评估

    千次阅读 2018-09-18 07:29:30
    软件架构评估  软件架构评估是在对架构分析、评估的基础上,对架构策略的选取进行决策。它也可以灵活地运用于对软件架构进行评审等工作中。 1 软件架构评估的方法  业界已开发出多种软件架构评估的方法,按...
  • 嵌入式应用软件架构设计

    千次阅读 2018-07-07 17:15:32
    转自:https://blog.csdn.net/qq8864/article/details/17961375嵌入式应用软件架构设计要做到嵌入式应用的代码逻辑清晰,且避免重复的造轮子,没有好的应用架构怎么行。如果没有好的架构,移植将会是一件很痛苦的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 509,916
精华内容 203,966
关键字:

软件架构设计