提示
主要是记载学习面向对象分析与设计课程的笔记总结
一、介绍
1.1 介绍面向对象技术
(1) 面向过程编程
- 这种编程范式本质上是机器/汇编语言的抽象;
- 编程是围绕过程进行的;
- 专注于数据结构、算法和步骤的排序。
面向过程程序的主要内容就是算法和数据结构
算法:一组用于解决问题的指令。
数据结构:用于以特定方式组织数据的构造。
缺点:
- 将程序与数据分割过于清晰
;
- 分析与编程设计之间存在代沟
;
- 分析结果与具体落实需要进行转化;
- 设计的模型需要很多的步骤实现;
- 一个完成的程序很难二次利用;
- 面向过程编程的项目很难进行拓展和维护。
(2) 面向对象编程(OOP)
OOP:Object-Oriented Programming
面向对象编程:编程是围绕对象进行的,是指导软件构建的一组原则,以及支持这些原则的语言、数据库和其他工具。
1)对象 Object
- 对象是在软件运行时才会存在的概念,软件运行时等价于生成了一个世界,世界里的万物都可为对象。一个对象可以是一个人、地方、事件;
- 对象包括数据和方法;
- 相同类的对象具有相同的数据和方法;
- 对象之间通过互相调用实现信息的接受和发送。
2)方法 method
由一个对象执行的操作,即方法。
3)type 或 class
- type 是型,相对于class,型的外延更加宽泛,型是来约束对象的行为的,比如 int 类型对象,只可进行 int 类型的操作;
- class,个人理解就是类,是生成对象的模型,由同一个模型生成对象,具有相同的方法和数据。
4)优点
- 单一模式:用户、分析人员、设计人员和实现者使用的编程语言单一;
- 体系结构和代码便于重用;
- 编程模型更加接近于现实世界:更加准确的描述了现实世界的实体、基于自然区分而切分体系、易于理解和维护;
- 稳定性更好:需求中的一个小变化并不意味着开发中的系统的巨大变化;
- 对于变化的自适应能力强。
(3) 基本概念
1)Object 对象
定义: 对象是具有定义良好的边界和标识的实体,它封装了状态和行为。
- 状态:由属性和关系表示,是对象可能存在的条件之一,通常会随着时间而改变;
- 行为:行为由操作、方法和状态机表示,决定一个对象如何行动和反应,对象的可见行为由它可以执行的操作而定义;
- 每个对象都有唯一的标识,即使状态与另一个对象相同;
- 一个对象不会独自承担所有任务,也不会没有存在的意义;
- 对象之间通过消息进行交互。
2)Class 类
定义: 类是一组具有相同属性和行为的对象的描述。
个人理解: 就是一类对象的模型,对象就是类的具体实现,就比如,我们都对神仙有个基本而模糊的认知比如会飞有仙法等等,观影菩萨就是一个具体的神仙,会飞会仙法,神仙是一个类,观影菩萨就是对象。
- 类是对象的抽象定义,类中定义了对象的结构和行为,是创建对象的模板;
- 对于一堆(1~n个)相同对象可以抽象为一个类;
- 对象是类的实例。
- 类的属性(attribute):是命名属性(不赋值),主要作用就是描述类的实例(即对象)的对应属性应当具有的规范(大小范围、可进行操作等等),一个类可以有0~n个属性;
- Operation:操作是服务的实现,可以从类的任何对象请求该服务来影响行为,一个类可以有任意数量的操作,也可以没有操作(所谓操作即对类中的属性进行增删改查等等行为,与对象中的method不是一回事)。
注意: Object的属性为property,Class的属性为attribute,这是不一样的,attribute指命名属性。
4)Message 消息
定义: 一种对象之间通信的规范,该规范传递信息,并期望活动随之发生(一个对象请求另一个对象执行操作)。
5)Abstraction 抽象
个人理解: 所谓抽象,就是将一个实体中的属性、操作提取出来。
6)Encapsulation 封装
定义: 封装意味着设计、生产和描述软件,以便在不了解其工作细节的情况下轻松使用软件,也被称为信息隐藏。
解释: 封装的一个具体实例就是编程中使用的函数接口,我们编写好接口后,只需要向外界提供接口即可,外界不清楚我们内部的属性和方法。而万物都是接口,手机就是接口,我们解锁手机,只需输入密码即可解锁,而不清楚里面是如何运作的。
7)Inheritance 继承
相关定义:
- 继承是一种组织类的方法;
- 与遗传含义类似,子类继承父类,可以使用父类的公共属性、方法;
- 具有公共属性的类可以分组,统一定义成一个父类,当需要父类的属性、方法时,可以直接继承父类,以便它们的公共属性只定义一次。
继承分类:
- 单继承 Single Inheritance
定义: 一个类只继承一个父类
- 多继承 Multiple Inheritance
定义: 一个类可以继承多个父类
P.S. : 编程语言中,如果一个类,没有声名继承的父类,则默认继承的Object类。
8)Polymorphism 多态
定义: 多态——同一个词或短语在不同的上下文中可能有不同的意思,描述的是一种可变性,对于同一个事物,在不同的场合有不同的含义。
举例: 在Java中我们定义不同的类,都会定义Output()函数,但是每个类的Output()输出的内容都各不一样,可能是字符串,可能是整型,这就是编程中的多态性,同名但在不同上下文环境发挥作用不一样。
9)Interface 接口
定义: 接口是指定类或组件的服务的操作集合。
- 接口约束多态性;
- 接口支持“即插即用”体系结构;
- 接口的约束是相互的。
个人理解:
- 约束多态性:接口就是封装类的作用,而编程中多态性往往体现在不同的类中同名方法有不同作用,如果类不封装,系统调用方法肯定因多个方法同名出错,只有封装了类才能让统名方法共存;
- 即插即用:调用对应接口的方法,只要调用方法正确、输入参数匹配,无需人工再干预,系统自动执行对应方法,即只要按着插口的插槽正确插入,就可直接使用;
- 约束是相互的:接口不仅约束了类的属性和方法,还会约束用户调用方法时输入的参数。
接口表示:
- 缩略图方法 Elided/lconic Representation
- 正则表达式 Canonical(Class/Stereotype)Representation
10)Abstract Class 抽象类
定义: 抽象类是没有任何直接实例的类。
- 在UML中,您可以通过用斜体书写一个类的名称来指定它是抽象的。
- 抽象操作是不完整的操作,需要子操作提供该操作的实现。
个人理解: 抽象类是一个无法直接实例化的类,是一个只能被继承的类,其中的方法也是抽象、不完整的,需要继承该类的子类进行完善
1.2 介绍UML
面向对象: 是以对象为核心、以类和继承为构造机制、以接口和多态提供灵活性的方法
(1) modeling 模型
定义: 模型是对现实的简化,是一个事物的抽象
- 模型总是强调相关特征,而抑制其他无关特征。
个人理解:
- 当我们只使用箱子来装东西时,我们就在乎箱子的重量、容量,它的打开操作、关闭操作、装入操作,所以也抽象出对应的属性、方法,对于取出操作我们就不管了。
建模的好处:
- 我们建立模型以更好地理解我们正在开发的系统;
- 帮助我们把一个系统形象化;
- 允许我们指定系统的结构或行为;
- 给我们一个模板,指导我们构建一个系统;
- 记录我们所做的决定;
- 我们建立复杂系统的模型,是因为我们不能完全理解这样一个系统。
(2) visual modeling 可视化模型
定义: 可视化建模是使用标准图形符号进行建模。
优点:
- 避免传统建模时会产生的歧义
- 便于从架构的角度了解系统
- 促进系统的重用性
(3) UML
定义: UML是统一建模语言,用于可视化、指定、构建、记录软件密集型系统的产物,主要由面向对象和可视化建模构成。
四层元模型架构:
解释:
层次 | 描述 |
---|---|
元-元模型 | 元建模体系结构的基础设施。定义用于指定元模型的语言。(元类、元属性、元方法) |
元模型 | 元-元模型的实例。定义用于指定模型的语言。(类属性、方法、元件) |
模型 | 元模型的实例。定义描述信息域的语言。 |
用户对象 | 一个模型的实例。定义特定的信息域。 |
1.3 Software Process 和OOA&D
Software Process: Iterative Development and the Unified Process,迭代开发和统一过程,即软件生命周期模型
OOA&D: Object-Oriented Analysis and Design Overview,面向对象分析和设计概述
(1) Software Process
1)Process 定义
过程定义了谁在做什么,何时以及如何达到某个目标。
2)Agile Process 敏捷过程
定义: 敏捷过程意味着轻量级和适应性过程,能够灵活地响应不断变化的需求,特点是简单、快速。(示例:XP(eXtreme Programming) 极限编程模式)
敏捷过程的预测性与适应性:
- 预测过程是试图在相对较长的时间段内详细规划和预测活动和资源(人员)分配的过程,例如项目的大多数。
- 预测过程通常首先有"瀑布"或顺序生命周期,定义所有要求:第二,定义详细的设计:第三,实施。
- 相比之下,适应性过程是接受变革作为必然驱动因素并鼓励灵活适应的过程:他们通常有一个迭次的生命周期。
繁杂过程: 指过程严格来规范、提高软件的质量,从而有所繁杂。
繁杂过程特点:
- 许多在官僚主义氛围中创造的文物
- 刚性和控制
- 详细、长期、详细的规划
- 预测性而不是自适应性
3)瀑布开发模型 和 迭代开发模型
瀑布开发模型的特点:
- 延迟确认关键风险解决方案;
- 通过评估不能很好地预测完成时间的工作产品来度量进度;
- 延迟并聚合集成和测试;
- 排除了早期部署;
- 经常导致主要的计划外迭代。
迭代开发模型:
二者风险比较:
4)UP(Unified Process) 统一过程
- Best Practices 最佳方案
- Key concepts 关键概念
Worker: 个人或团队所扮演的角色
Artifact: 一种由过程产生、修改或使用的信息
Activity: 活动,工作单元
Workflow(Discipline): 工作流,工作流是产生可观察值的结果的一系列活动
- UP Structure 统一过程结构
过程阶段、生命周期阶段:
(1) Inception 初始阶段——定义项目的范围
(2) Elaboration 细化-计划项目,指定特性,基线架构
(3) Construction 构建——构建产品
(4) Transition 产品化——产品化到最终用户社区
迭代阶段:
迭代是基于已建立的计划和评估标准的不同的活动序列,结果是可执行的发布(内部或外部)。
- core workflow 核心工作流
- 在统一过程中使用UML
- 统一过程是一个过程框架
没有普遍的过程!统一流程是为灵活性和可扩展性而设计的,允许多种生命周期策略、选择要生成的工件、定义活动和工作者模型的概念。
1.4 组件和CBSD
(1) COmponent 组件
一个独立的软件部分,在上下文中相对独立的存在。
定义:
- 系统中重要的、几乎独立的、可替换的部分,在定义良好的体系结构上下文中实现明确的功能;
- 组件遵循并提供一组接口的物理实现;
- 一个物理的、可替换的系统部分,它封装了一组接口的实现,并提供了一组接口的实现;
- 组件代表系统实现的一个物理部分,包括软件代码(源、二进制或可执行文件)或等价的东西,如脚本或命令文件。
目的:
- 提高软件的复用性;
- 提高软件的质量。
(2) CBSD
Component-Based Software Development 基于构件的软件开发
1)弹性
- 满足当前和未来的要求;
- 提高可扩展性;
- 允许重用;
- 封装系统依赖关系。
2)基于组件
- 重用或自定义组件(只有统一标准化,才可进行大规模的复用);
- 从商业可用的组件中选择(而不是一个软件的所有部分都由自己开发);
- 递增地发展现有的软件。
3)CBSD的目标
重用的基础: 组件重用、架构复用
项目管理基础: 计划性、人员调动性、交付性(Delivery)
智能控制器: 控制复杂性、保持完整性
1.5 模式和体系结构
(1) 模式的基本概念
1) 什么是模式
什么是模式?
- 一个常见的问题,以及再某种情况下的一个经过验证的解决方案
- 以文学形式组织、包装的问题解决方案;
- 记录经验的方式,“最佳方案”:—个使用的标准格式、知识的宝库
- 新鲜的是,这里没有什么新鲜的东西。
个人理解:
- 模式就是大量经验累积、综合、整理的结果;
- 模式就是对于一个已经解决的问题的框架式解决方案。
2)模式的各部分
- 名称:一个好的名称是必不可少的,因为模式名称有助于设计师进行沟通;
- 上下文:环境,模式可以应用的地方;
- 动机:描述相关的动机和约束;
- 问题:通常用动机来描述;
- 解决方案:一种行之有效的描述得到所需结果的方法。
3)模式样例
4)使用UML建模的模式
(2) 软件架构的基本概念
1)软件体系结构包含关于软件系统组织的一组重要决策:
- 选择组成系统的结构元素及其界面;
- 在这些元素之间的协作中指定的行为;
- 将这些结构和行为元素组成更大的子系统;
- 指导该组织的架构风格。
2)软件体系结构涉及:
使用、功能、性能、弹性、重用、可理解性、经济和技术限制、美学考虑
3)架构限制了设计和实现:
体系结构涉及一组约束设计和构造的战略设计决策、规则或模式,架构决策是最基本的决策,更改它们将产生重大的连锁反应。
4)所有软件架构定义中的共同主题:
不管定义是什么(有很多),所有软件体系结构定义的共同主题都与大规模有关
- 动机中的强大思想;
- 组织;
- 风格;
- 模式;
- 责任;
- 协作;
- 联系;
- 动机;
- 主要子系统
5)架构的元模型(Booch):
6)构架视图:
架构视图是从特定的角度或有利位置对系统进行简化的描述(抽象),涵盖特定的关注点,并省略与此角度不相关的实体
软件架构:“4+1视图”模型:
用例代表的是功能,功能代表的是功能性需求,(软件需求分为功能性需求、非功能性需求,功能性需求用功能解决,非功能性需求通过文档层实现)
7)需要视图的个数:
- 简化模型以适应环境;
- 不是所有的系统都需要所有的视图:单处理器:删除部署视图;单进程:删除进程视图;非常小的程序:删除实现视图;
- 添加视图:数据视图,安全视图。
实际上,具体问题具体分析,哪些问题需要交流沟通,那就需要构建多少视图(视图是一个待解决问题的预解决方案)
8)框架风格:
- 体系结构风格根据结构组织的模式定义了一系列系统;
- 架构风格定义了:组件和连接器类型的词汇表;一组关于如何组合它们的约束;一个或多个语义模型,指定如何从系统各部分的属性确定系统的总体属性。
9)架构上重要的模型元素:
- 并非所有的设计都是框架;
- 主要的“业务”类;
- 重要的机制;
- 处理器和流程;
- 层和子系统;
- 架构视图=对模型进行切片
10)框架的专注点:
虽然上面的视图可以代表一个系统的整个设计,但架构只关注自己的一些具体方面:
- 模型的结构——组织模式,例如,分层;
- 基本元素——关键用例、主类、通用机制,等等,与模型中存在的所有元素相反;
- 一些关键场景显示了整个系统的主要控制流;
- 服务,以获取模块化、可选特性、产品线方面。
11)良好框架的特点:
- 有弹性的;
- 简单的,便于别人使用;
- 更容易被理解、接受;
- 有清晰的关注点;
- 框架中各个部分的责任分配清晰;
- 平衡经济和技术限制。