系统分析
数据流图可能出案例题,状态转换图了解作用即可
用例图、类图选择题多,暴徒了解即可
结构化分析
- 结构化分析是面向数据流的需求分析方法,它的思想是通过功能分解方式把系统功能分解到各个模块中。
名称 | 注意事项 |
---|---|
数据流 | 数据流的流向: 从一个加工流向另一个加工 从加工流向数据存储(写) 从数据存储流向加工(读) 从外部实体流向加工(输入) 从加工流向外部实体(输出) |
加工 | 加工要有输入输出: 有输入没有输出 – 黑洞 有输出没有输入 – 奇迹 输入不足以产生输出 – 灰洞 |
外部实体 | 外部实体可以是人、物品、其他系统 |
面向对象分析
- 面向对象的分析(Object Oriented Analysis,OOA)运用面向对象方法,对问题域进行分析和理解,正确认识其中的事物及它们之间的关系,找出描述问题域和系统功能所需的类和对象,定义它们的属性和职责,以及它们之间所形成的各种联系。
- 面向对象的建模是面向对象分析的关键,面向对象建模主要使用UML图。基于UML面向对象需求分析过程大致分为以下几个步骤:
- 利用用例及用例图表示需求。
- 利用包图及类图表示目标软件系统的总体框架结构。
用例图
-
面向对象的分析主要由顶层架构图(包图)、用例与用例图、领域概念模型(类图)构成
-
用例图展现了一组用例,参与者和它们之间的关系
- 参与者:存在于系统外部,并与系统进行交互的任何事物。参与者可以由人、物、其他系统、时钟组成。
- 通信关联表示的是参与者和用例之间的关系,或用例与用例之间的关系。发现用例的方法可以采用“动词(短语)+名词(短语)”的形式
- 用例是由系统执行的一系列动作,为相关的参与者提供其所期望的服务。
-
用例之间的关系:
- 包含关系(include):大家共同的功能,两个或多个用例中共用一组相同的动作,这时可以将这组相同的动作抽出来作为一个独立的子用例,供多个基用例所共享。
- 扩展关系(extends):不一定需要的功能,对基用例的扩展,基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能。
- 泛化关系(generalize):反继承,抽象更高级的类,描述父类与子类之间的关系。
类图
类图展现了一组对象、接口、协作和它们之间的关系。
类之间的关系:关联、聚合、组合、依赖、泛化、实现
- 依赖:使用的关系,一个类的实现需要另一个类的协助。如:汽车依赖汽油。
- 关联:拥有的关系,关联提供了不同类之间的结构关系,它在一段时间内将多个类的实例连接在一起。有单向关联,双向关联。如:人拥有身份证。
- 组合关系:整体与部分的关系。部分只能属于一个整体,部分与整体生命周期相同。
- 聚合关系:整体与部分的关系。部分可能属于多个整体,生命周期可以不同。
- 泛化关系:父类与子类的关系,父类又称为超类或基类,子类又称派生类。如:学生和老师都是人
- 实现关系:将说明和实现联系起来。一个或多个类可以实现一个接口,而每个类分别实现接口中的操作。如:车、船都是交通工具
包图
包被描述成文件夹,可以用于UML任何一种图上。是一种维护和描述系统总体结构的模型的重要建模工具,通过包与包之间关系的描述,展现出系统模块之间的依赖关系。
可以看成是类图的一种
系统设计
主要考这些工具的特点
设计过程选择案例都有可能考
系统设计概述
-
概要设计(系统总体结构设计)
- 功能需求分配给模块
- 模块调用关系形成模块结构图即系统结构图
- 将需求转化为数据结构和软件的系统结构
- 主要使用的图:
- 系统结构图=模块结构图(structure chart,SC):反映系统的功能实现和模块之间的联系与通信,包括各模块之间的层次结构
- 层次图
- HIPO(Hierarchy plus Input-Process-Output,HIPO)图:输入-处理-输出的层级结构,描述系统结构
-
详细设计
- 详细的数据结构与算法
- 程序流程图(Program Flow Diagram,PFD):顺序、选择、循环结构
- 盒图(N-S图):表示层次关系,有结构化的特点
- 过程设计语言(Process Design Language,PDL),又称伪代码
-
处理流程设计
- 确定各个系统模块的内部结构,包括数据组织、控制流、加工过程、实施细节
- 常用图形工具:程序流程图、IPO图、盒图、问题分析图、判定树、表格工具判定表、语言工具过程设计语言
结构化设计
结构化设计的概念
是一个自顶向下、逐步求精和模块化的过程
包括:
- 体系结构设计:定义软件系统和各主要部件之间的关系。零件如何组装成汽车。
- 数据设计:将模型转换成数据结构的定义。好的数据设计将改善程序结构和模块划分,降低过程复杂性。零件间传递的信息,加速,减速。
- 接口设计:软件内部,软件和操作系统间以及软件和人之间如何通信。通过踩油门、刹车的方式传递
- 过程设计:系统结构部件转换成软件的过程描述。接收到加速信息后,要加大电机输出功率。
软件设计
软件结构设计的任务是定义系统的主要结构元素之间的关系。通常是从数据流出发,对数据流图进行分析,得出软件的层次化的模块结构图。
数据流图
模块结构图
结构化设计的特征
- 信息隐蔽与隐藏:信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,并且尽可能少的暴露其内部的处理过程。通过信息隐蔽可以提高软件的可修改性、可测试性和可移植性。
- 模块化
- 高内聚与低耦合
模块
模块是实现功能的基本单位,它一般具有功能、逻辑和状态三个基本属性。
- 外部特性:模块结构与功能
- 内部特性:局部数据、程序代码
在模块划分时需要遵循如下原则:
- 模块的大小要适中
- 模块的扇入(被其他模块调用的次数)和扇出(调用其他模块的个数)要合理,越小越好
- 深度和宽度适当
- 模块要高内聚、低耦合
结构化的程序设计
特征:顺序、选择(分支)、循环结构
如程序流程图
面向对象设计
红色字体选择题高频考点
面向对象的设计过程可以分为:
-
设计用例实现方案
- UML的交互图(顺序图、协作图)适用于用例方案的表示。包含三个步骤:
- 提取边界类、实体类、和控制类
- 构造交互图。UML交互图,以交互图作为用例的精确实现方案。
- 根据交互图精化类图。
- 在UML交互图中,对每个类的对象都规定了它必须响应的消息以及类的对象之间的消息传递通道。
- UML的交互图(顺序图、协作图)适用于用例方案的表示。包含三个步骤:
-
设计技术支撑方案:软件项目往往需要一组技术支撑机制提供服务。如
- 数据持久存储服务
- 安全控制服务
- 分布式事务管理服务
- 并发与同步控制服务
- 可靠消息服务
-
设计用户界面
-
精化设计模型:之前的颗粒度可能较粗,进一步细化。
-
面向对象设计的类有三种类型:
- 实体类
- 来源于领域模型的类
- 一定有属性,不一定有操作
- 反映的信息需要在系统中处理,并需要进行持久化存储。
- 边界类
- 用于系统接口与外界进行交互
- 控制类
- 控制用例工作的类
- 体现应用程序的执行逻辑
- 实体类
设计原则
原则 | 说明 |
---|---|
单一职责 | 目的单一的类 |
开放-封闭 | 对扩展开放,对修改封闭 |
里氏替换 | 子类可以替换父类 |
依赖倒置 | 要依赖于抽象,不是具体实践。对接口进行编程,不要对实现编程 |
接口隔离 | 使用多个专门的接口比使用单一的总接口好 |
组合重用 | 尽量使用组合而不是继承达到重用的目的 |
迪米特 | 一个对象应当对其他对象有尽可能少的了解 |
设计模式
选择题
创建型模式 | 用于创建对象 | 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式、。共五种。口诀:单抽原建厂 |
---|---|---|
结构型模式 | 处理类或对象的组合 | 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。共七种。口诀:外侨组员代配饰。 |
行为型模式 | 描述类与对象怎样交互、怎样分配职责 | 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。共十一种。口诀:观摩对策,责令解放,戒忘台。 |
- Factory Method工厂方法模式
- 定义一个用于创建对象的接口,让子类决定哪一个类实例化。其实就是定义一个抽象类,所有的子类都实现实现接口,用户直接调用子类的方法。
- Abstract Factory抽象工厂模式
- 提供一个或一系列相关或相互依赖对象的接口,而无需指定它们具体的类。如:沙发、茶几有不同的风格,如中式,欧式等等。客户端使用时,经过挑选得到一个欧式的工厂,第一次买了沙发(调用new sofa),一段时间后,再次购买茶几(调用new table)。保证了风格的一致性,不用关心其他的风格,也不受影响。
- Builder 建造者模式
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。强调构建过程相同,即步骤相同,把差异封装的创建者类里面。
- Prototype原型模式
- 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。系统中存在大量相同、相似的对象。存在clone的方法,直接生成一个对象。如你在很多张照片上添加相同文字,在第一张照片添加后,后续的只需要复制粘贴即可。
- Singleton单例模式
- 保证一个类仅有一个实例,并提供一个访问它的全局访问点。如线程池、各种管理器等。
- adapter适配器模式
- 将一个类的接口转换成客户希望的另一个接口。adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。如实时操作系统移植第三方库时,常常需要有一个适配层。
- Bridge桥接模式
- 将抽象部分与它的实现部分分离,使他们都可以独立的变化。如不同图形和不同的颜色,将图形的实现和颜色的实现分离,再进行组合得到所需要的图形。
- Composite组合模式
- 将对象组合成树形结构以表示”部分-整体“的层次结构。如文件夹和文件的关系。
- Decorator装饰模式
- 动态的给一个对象添加一些额外的职责,比生成子类的方式更加灵活。动态即可运行时添加。如你有茉莉花茶,增加一个柠檬,就成了柠檬茉莉花茶。
- Facade外观模式
- 为子系统中的一组接口提供一个一致的界面,隔离外部系统与子系统复杂的交互过程。如网关给服务分发消息。
- Flyweight Pattern享元模式
- 运用共享技术有效的支持大量细粒度的对象。如围棋游戏中的棋子,除了位置不同,其他都相同,所以可以共享一个对象。
- Proxy Pattern代理模式
- 为其他对象提供一种代理以控制对这个对象的访问。如代理人,代理服务器。
- Chain Of Responsibility Pattern责任链模式
- 避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。类似于 PjSip 库的实现方式。
- Interpreter Pattern解释器模式
- 给定一个语言,定义它文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如在实时操作系统中实现python
- Template Pattern模板方法
- 定义一个操作的算法骨架,将一些步骤延迟到子类中。在子类中重定义该算法的特定步骤。如ISP算法。
- Command Pattern命令模式
- 将一个请求封装成一个对象,从而使得不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作。如命令行参数
- Iterator Pattern迭代器模式
- 提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。如电视频道的切换。
- Meditor Pattern中介者模式
- 用一个中介对象来封装一系列的对象交互,中介者使对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的修改它们之间的交互。如系统和各硬件之间的关系。
- Memerto Pattern备忘录模式
- 不破坏封装性的前提下,捕获对象的内部状态,保存状态,这样可以将对象恢复到原先的保存状态。如word文档的撤销
- ObServer Pattern观察者模式
- 观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。如系统事件监听。
- State Pattern状态模式
- 对于对象内部的状态,允许其在不同的状态下,拥有不同的行为,对状态单独封装成类。如登陆成功可显示退出,登陆失败显示账号密码输入框。
- Strategy Pattern策略模式
- 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换。如摄像头的环境策略,夜晚,户外,雨天等。
- Visitor Pattern访问者模式
- 表示一个作用于某对象结构中的各元素的操作。可以在不改变各元素的类的前提下定义作用与这些元素的新操作,即对于某个对象或一组对象,不同的访问者,产生的结果不同,执行操作也不同。如处方单,收银员看到算账,药房看到拿药。