系统架构16 - 软件工程(4)

软件工程

  • 逆向工程
    • 软件复用
    • 定义
    • 四个级别:
      • 实现级 (Implementation Level)
      • 结构级 (Structural Level) :
      • 功能级 (FunctionalLevel) :
      • 领域级 (Domain Level) :
    • 相关概念
      • 重构
      • 设计恢复
      • 再工程
      • 正向工程
  • 系统设计
    • 业务流程设计
      • 流程设计表示工具:
    • 业务流程管理 BPM
    • 业务流程重组 BPR
    • 主要目的
    • 设计方法
    • 主要内容
      • 概要设计
      • 详细设计
    • 结构
    • 原则
    • 模块独立标准
      • 耦合
      • 内聚
    • 人机界面设计
      • 置于用户控制之下
      • 减少用户的记忆负担
      • 保持界面的一致性

逆向工程

软件复用

软件复用是将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的花费。
它是提高软件生产力和质量的一种重要技术。
早期的软件复用主要是代码级复用,被复用的知识专指程序,后来扩大到包括领域知识、开发经验、i设计决定、体系结构、需求、设计、代码和文档等一切有关方面

定义

软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序的表示过程,逆向工程是设计的恢复过程

四个级别:

实现级 (Implementation Level)

包括程序的抽象语法树、符号表、过程的设计表示
如果我们要逆向工程一个简单的计算器程序。在实现级别,我们可以通过分析程序的源代码,了解它是如何实现加法、减法、乘法和除法的,还可以找到程序中定义的变量和函数。

结构级 (Structural Level) :

包括反映程序分量之间相互依赖关系的信息,例如调用图、结构图、程序和数据结构
对于一个网站的逆向工程,我们可以在结构级别分析页面之间的跳转关系,了解不同页面的组织结构确定哪些页面是主要页面、哪些页面是引用页面等。

功能级 (FunctionalLevel) :

包括反映程序段功能及程序段之间关系的信息,例如数据和控制流模型
假设我们想逆向工程一个邮件客户端。在功能级别,我们可以分析程序的逻辑和流程,理解用户发送邮件的过程、邮件的接收和显示等功能的实现方式。

领域级 (Domain Level) :

包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息,例如E-R 模型
一个电子商务网站的逆向工程可以涉及领域级别的分析。我们可以通过分析程序中的实体和关系,了解不同产品、订单和用户之间的关系,进而理解电子商务业务流程。

四个级别中,领域级抽象级别最高,完备性(完整)最低,实现级抽象级别最低,完备性最高

相关概念

重构

是指通过改变程序的内部结构,以改进其设计、可读性、可维护性和性能,而不改变其外部行为。重构可以通过重新组织代码、简化算法、消除重复等方式来改善程序的质量和结构。

假设我们有一个庞大而复杂的代码库,并且我们意识到其中的某个函数或模块存在问题。我们可以对该函数或模块进行重构,以提高其可读性、可维护性和性能,同时保持其外部行为一致。

设计恢复

设计恢复是指通过对已有软件系统的逆向工程分析,还原出其设计和结构。这可以帮助我们理解现有系统的组织方式模块之间的关系以及它们之间的交互。

假设我们继承了一个老旧的软件系统,但缺乏相关的文档和设计说明,我们可以使用逆向工程技术对该系统进行分析,还原出其设计和结构,以便更好地理解和维护它。

再工程

再工程是指对现有软件系统进行重构、改进和现代化,以满足新的需求、提高性能或增强可维护性等方面的要求是在逆向工程所获得信息的基础上,修改或重构已有的系统,产生系统的一个新版本。

假设我们的软件系统存在性能问题,并且需要对其进行优化,我们可以进行再工程。在保持系统功能不受影响的情况下,通过对其进行重构、重新设计和优化,以提高其性能和可维护性。

正向工程

正向工程是指将软件设计的高级概念和抽象转化为实现代码的过程。它是逆向工程的相反过程,不仅从现有系统中恢复设计信息,而且使用该信息去改变或重构现有系统。

假设我们在软件设计阶段使用UML建模工具,我们可以使用正向工程将UML模型转化为具体的代码实现,从而生成可执行程序。

系统设计

业务流程设计

流程设计表示工具:

程序流程图(Program Flow Diagram,PFD): 用一些图框表示各种操作,它独立于任何一种程序设计语言,比较直观、清晰,易于学习掌握。任何复杂的程序流程图都应该由顺序、选择和循环结构组合或嵌套而成。
IPO图: 也是流程描述工具,用来描述构成软件系统的每个模块的输入、输出和数据加工。前面提到的数据流图其实就是一种IPO图。
N-S图: 比较容易表示嵌套和层次关系,并具有强烈的结构化特征。但是当问题很复杂时,N-S图可能很大,因此不适合于复杂程序的设计
问题分析图(PAD): 是一种支持结构化程序设计的图形工具。PAD具有清晰的逻辑结构、标准化的图形等优点,更重要的是,它引导设计人员使用结构化程序设计方法,从而提高程序的质量。

业务流程管理 BPM

一种方法论,用于优化、管理和自动化组织内的业务流程。它涉及识别、建模、分析和优化业务流程,以实现更高效、灵活和协调的运作。BPM关注整个业务流程的管理,包括流程的执行、监控、优化和自动化

业务流程重组 BPR

BPR是更为激进的方法,它着眼于对现有业务流程进行彻底的重新设计和改造,以实现质的飞跃的改进,是对企业的业务流程**进行根本性的再思考和彻底性的再设计,**从而获得可以用诸如成本、质量、服务和速度等方面的业绩来衡量的显著性的成就。

流程管理包含三个层面: 规范流程、优化流程和再造流程

主要目的

根据系统分析的结果,完成系统的构建过程。其主要目的是绘制系统的蓝图,权衡和比较各种技术和实施方法的利弊,合理分配各种资源,构建新系统的详细设计方案和相关模型,指导系统实施工作的顺利开展。
简单点说,需求分析就是找到你要做什么,系统设计就是告诉你怎么做

设计方法

结构化设计方法,面向对象设计方法

主要内容

概要设计、详细设计

概要设计

又称为系统总体结构设计,主要任务是确定软件系统的结构,对系统进行模块划分,确定每个模块的功能、接口和模块之间的调用关系,形成软件的模块结构图,即系统结构图。还需要产出概要设计说明书

详细设计

主要任务是为每个模块设计实现的细节
包含模块内详细算法设计、模块内数据结构设计、数据库的物理设计、其他设计(代码、输入输出格式、用户界面)、编写详细设计说明书、评审。

结构

系统设计的基本结构原理:抽象化、模块化、信息隐蔽、模块独立(高内聚,低耦合)
当进行系统设计时,有一些基本结构原理可以帮助我们更好地规划和构建软件系统。以下是它们的通俗解释。
抽象化:就像画家将一幅画分成不同的图层,系统设计中也会将复杂的问题分成更小、更易管理的部分。这样做能让我们关注重要的细节,同时不被不必要的复杂性所困扰。
模块化:在系统设计方法中,模块是实现功能的基本单位,它一般具有功能、逻辑和状态3个基本属性。功能是指该模块“做什么”,逻辑是描述模块内部“怎么做”,状态是该模块使用时的环境和条件。模块的外部特性是指模块的模块名、参数表和给程序乃至整个系统造成的影响,而模块的内部特性则是指完成其功能的程序代码和仅供该模块内部使用的数据。设计阶段,通常是先确定模块的外部特性,然后再确定它的内部特性
自顶而下,逐步求精:建立一座高楼大厦,首先会构想整体的结构,然后一层层地逐步建造。在系统设计中也是如此,先考虑整体框架,然后逐步添加细节,以确保每个部分都被仔细设计和优化
信息隐蔽: 想象你开车时并不需要了解引擎的每个零件如何运作。在系统设计中,我们可以隐藏复杂的内部细节,只暴露必要的信息给其他部分。这样能够降低不同模块之间的相互影响,使系统更易于管理和维护。
模块独立(高内聚,低耦合) : 就像用乐高积木一样,系统设计中的各个部分应该是独立的,即每个模块都有自己的功能并且尽可能不依赖其他模块。高内聚表示模块内部的元素彼此紧密相关,低耦合表示模块之间的依赖尽可能降低。

原则

当进行系统设计时,遵守一些原则可以帮助我们构建清晰、可维护且高效的软件系统。以下是这些原则的解释:
模块的大小适中:就像一块大蛋糕适合切成小块再吃一样,系统中的模块也应该适中,不要太大也不要太小。这样做可以使每个模块的功能清晰,并且易于理解、测试和维护
减少调用深度:如果需要找到某本书,但由于每次找到的都是一个分类指向里,所以需要不断翻找才能找到,这种情况并不是想要的结果。在系统设计中,减少调用深度意味着尽量减少程序的层层嵌套,以避免复杂的调用关系,使代码更清晰和高效。
多扇入,少扇出:模块应该允许多个模块调用它(多扇入),但它本身应尽量少调用其他模块(少扇出),以减少模块之间的复杂关系。
单入口,单出口:在模块设计中,最好只有一个入口和一个出口。这样可以使模块的功能和接口更清晰,不容易引入混淆和错误。
模块的作用域应该在模块之内:模块的功能应该限制在模块内部。不要让外部模块直接访问内部的细节。这有助于封装和隐藏内部逻辑,防止外部干扰。
功能可预测:模块的功能应该是可预测的。使用者在调用一个模块时应该能够合理地预期它会发生什么,从而避免产生混淆和不可预知的结果。

模块独立标准

衡量模块独立的标准有两个:耦合性和内聚性

耦合

耦合表示模块之间联系的程度。紧密耦合表示模块之间联系非常强,松散耦合表示模块之间联系比较弱,非直接耦合则表示模块之间无任何直接联系。模块的耦合类型通常分为7种,根据耦合度从低到高排序如下表

耦合类型 描述 记忆点
非直接耦合 两个模块之间没有直接关系,它们之间的联系完全是通过上级模块的控制和调用来实现的 无直接关系
数据耦合 一组模块借助参数表传递简单数据 传递数据值调用
标记耦合 一组模块通过参数表传递记录等复杂信息(数据结构) 传递数据结构
控制耦合 模块之间传递的信息中包含用于控制模块内部逻辑的信息 控制变量,选择执行某功能
通信耦合 一组模块共用了一组输入信息,或者它们的输出需要整合以形成完整数据,即共享了输入或输出 软件外部环境
公共耦合 多个模块都访问同一个公共数据环境,公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等 公共数据结构
内容耦合 一个模块直接访问另一个模块的内部数据;一个模块不通过正常入口转到另一个模块的内部;两个模块有一部分程序代码重叠;一个模块有多个入口等 模块内部关联

对于模块之间耦合的强度,主要依赖于一个模块对另一个模块的调用、一个模块向另一个模块传递的数据量、一个模块施加到另一个模块的控制的多少,以及模块之间接口的复杂程度。

内聚

内聚表示模块内部各代码成分之间联系的紧密程度,是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做目标单一的一件事情。模块的内聚类型通常也可以分为7种,根据内聚度从低到高的排序如下表

内聚类型 描述 记忆点
偶然内聚 完成一组没有关系或松散关系的任务 无直接关系
逻辑内聚 完成逻辑上相关的一组任务 逻辑相似,参数决定
时间内聚 所包含的任务必须在同一时间间隔内执行 同时执行
过程内聚 处理元素相关,而且必须按特定的次序执行 指定的过程顺序
通信内聚 所有处理元素集中在一个数据结构的区域上 相同数据结构,相同输入疏忽
顺序内聚 处理元素相关,而且必须顺序执行 顺序执行,输入为输出
功能内聚 完成一个单一功能,各个部分协同工作,缺一不可 共同作用,缺一不可

一般说来,系统中各模块的内聚越高,则模块间的耦合就越低,但这种关系并不是绝对的。
耦合低使得模块间尽可能相对独立,各模块可以单独开发和维护;
内聚高使得模块的可理解性和维护性大大增强。
因此,在模块的分解中应尽量减少模块的耦合,力求增加模块的内聚,遵循“高内聚、低耦合”的设计原则。

人机界面设计

人机界面设计有三大黄金设计原则

置于用户控制之下

  • 以不强迫用户进入不必要的或不希望的动作的方式来定义交互方式
  • 提供灵活的交互
  • 允许用户交互可以被中断和撤消
  • 当技能级别增加时可以使交互流水化并允许定制交互
  • 使用户隔离内部技术细节
  • 设计应允许用户和出现在屏幕上的对象直接交互

减少用户的记忆负担

  • 减少对短期记忆的要求
  • 建立有意义的缺省
  • 定义直觉性的捷径
  • 界面的视觉布局应该基于真实世界的隐喻
  • 以不断进展的方式揭示信息

保持界面的一致性

  • 允许用户将当前任务放入有意义的语境
  • 在应用系列内保持一致性
  • 如过去的交互模型已建立起了用户期望,除非有迫不得已的理由,不要改变它。

你可能感兴趣的:(软考系统架构,系统架构,软件工程,逆向工程,结构化设计)