diff --git a/机器学习/机器学习分类.md b/机器学习/机器学习分类.md new file mode 100644 index 00000000..4a0fab73 --- /dev/null +++ b/机器学习/机器学习分类.md @@ -0,0 +1,43 @@ +# 机器学习分类 + +## 1 机器学习基本分类 +### 基于学科的分类 +* 统计学方法:收集、分析、统计数据。描述数据的集中和离散程度,模型化数据资料。 +* 人工智能:一种积极地学习方法,利用已有的线程的数据对问题进行计算。从而提高机器本身计算和解决问题的能力 +* 信息论:信息的度量和熵的度量。 +* 控制理论:对象之间的联系和通信。 +### 基于学习模式的分类 +* 归纳学习:通过实例数据和结果分析,使得机器能够归纳获得该数据的一种一半模型,从而对更多未知的数据进行预测。 +* 解释学习:根据已有的数据对一半的模型进行解释,从而获得一个较为泛型的学习模型。 +* 反馈学习:通过学习已有的数据,根据不断获取数据的反馈进行模型的更新。从而直接获得一个新的,可以对已有数据进行归纳总结的机器学习方法。 +### 基于应用领域的分类 +* 专家系统:通过数据学习,获得某个方面的经验和认识能力。 +* 数据挖掘:通过对既有知识和数据的学习,挖掘出隐藏在数据之中的行为模式和类型。 +* 图形识别:通过学习已有的数据,从而获得对不同的图像或同一类图像中特定目标的认识。 +* 人工智能:对已有的模式的认识和学习。 +* 自然语言处理:实现人与对象之间通过某种语言进行有效通信。 +* 模式识别,计算机视觉,语音识别。 + +> 机器学习是一种技术,能够在很多领域应用,完成很多事情。 机器学习这门技术有很多实现方法(算法) + +## 2 机器学习的基本算法 +### 算法流程 +* 输入数据 +* 特征提取 +* 模型设计 +* 数据预测 +### 基本算法分类 +* 无监督学习:黑盒训练、输入数据无区别标识、分析过程无指导、结果不可控。 +* 有监督学习:输入数据被分类标记识别。 +* 半监督学习:混合有标识数据和无标识数据。 +* 强化学习:输入不同的数据,使用已有的数据模型。 + +> 机器学习包括深度学习算法,深度神经网络是一种深度学习算法,但神经网络与机器学习没有直接从属关系。 + +### 具体算法 +* 构造间隔理论分布:聚类分析和模式识别:人工神经网络 决策树 感知器 支持向量机 集成学习AdaBoost 降维与度量学习 聚类 贝叶斯分类器 +* 构造条件概率:回归分析和统计分类:高斯过程回归 线性判别分析(线性回归) 最近邻居法 径向基函数核 +* 通过再生模型构造概率密度函数:最大期望算法 +* 概率图模型:包括贝叶斯网和Markov随机场,Generative Topographic Mapping +* 近似推断技术:马尔可夫链 蒙特卡罗方法 变分法 +> 不要过度理解一个名词。机器学习,能够通过数据集,修改自身的算法模型。达到某种要求,本质上是一种函数逼近。 \ No newline at end of file diff --git a/软件体系结构/软件体系结构质量特征.md b/架构模式/01 软件体系结构质量特征.md similarity index 100% rename from 软件体系结构/软件体系结构质量特征.md rename to 架构模式/01 软件体系结构质量特征.md diff --git a/架构模式/1. 软件建模与软件架构.md b/架构模式/1. 软件建模与软件架构.md new file mode 100644 index 00000000..8e603bfb --- /dev/null +++ b/架构模式/1. 软件建模与软件架构.md @@ -0,0 +1,111 @@ +## 课程内容介绍 + +* 基于用例的需求建模 +* 基于类图的静态建模 +* 基于对象交互分析的动态建模 +* 状态机建模 + +### 目录 +1. 软件模型和建模 +2. 软件架构 +3. 模型驱动的架构MDA +4. 软件架构的视图 +5. 发展史 +6. UML知识补充 + +## 1 软件模型和建模 + +### 1.1 模型作用 + +* 在某一精度和细节层次提供系统的抽象。分析模型获得对所开发的系统的更好的理解。 +* 是一种设计,用来指导后续过程。建模驱动架构。 + +### 1.2 建模过程 + +##### 面向对象的建模方法:封装、继承、多态。 + +**封装**,把客观事物封装成抽象的类。将实物的属性和对属性的操作抽象为类的属性和类的操作。将实物不必要的信息进行隐蔽。 + +**继承**,让某一个类型的对象获取另一种对象的属性和方法,实现代码的重用,而不需要重新写这些方法。 + +**多态**,类实例的相同方法在不同的情况下会有不同的表现形式。使得不同结构的类的对象可以共享外部接口。 + +##### 统一建模语言UML + +为面向对象建模提供了一套标准的图形语言和表示法。 + +四中建模基本方法: +* 用例建模——需求 +* 静态建模——结构 +* 动态建模——行为 +* 状态建模——状态 + +## 2 软件架构 + +* 将系统的总体结构与系统的各个构件的内部细节进行==分离==。 +* 在==不同层次==上描述实现 +* 强调(子系统、构件)的==外部视图==。即子系统构件提供的和需求的==外部接口==,以及他们之间的==连接==。 +* 是高层属性,包括功能性和质量属性设计(即性能、安全性和可移植性) +* 服务于==详细设计== + +## 3 模型驱动的架构MDA + +### 3.1 基本模型视图 +CIM:computer independent model与计算机无关、描述需求。 + +PIM:platform independent model与平台无关、抽象出技术细节。 + +PSM:platform specific model 平台视图、与特定的平台进行关联。 + +### 3.2 模型转换 +将一个系统模型转化为另一个系统模型。 + +``` +graph LR +CIM-->PIM +PIM-->PSM +``` + +### 3.3 MDA 过程 + +![image](https://note.youdao.com/yws/public/resource/7500a3fc2481ddedcb13a2fb32f1096e/xmlnote/F8101042B7254F7BA90C08365036455C/11919) + +### 3.4 作用 + +* 保护知识产权 +* 加快开发速度 +* 提高软件质量 +* 方便维护 + +## 4 软件架构视图 + +* 用例视图 +* 静态视图 +* 动态视图 +* 状态转换视图 +* 结构构件视图 +* 动态并发视图 +* 部署视图 + + +## 5 发展史 + + + + + + + + + + + + + + + + + + + + diff --git a/架构模式/2. 软件架构设计方法.md b/架构模式/2. 软件架构设计方法.md new file mode 100644 index 00000000..1d896fee --- /dev/null +++ b/架构模式/2. 软件架构设计方法.md @@ -0,0 +1,149 @@ +## 软件架构设计方法 + +### 目录 +1 面向对象 +2 信息隐藏 +3 继承和泛化 +4 并发处理 +5 设计模式 +6 软件架构和构件 +7 软件质量属性 +8 基于用例的软件生命周期 +9 需求、分析和设计建模活动 + +## 1 面向对象 +> 这一部分请参考面线对象的课程笔记。 + +1.1 关键概念 + +##### 对象 +##### 类 +##### 属性 +##### 操作 +##### 接口 +对象的接口是他提供的操作的集合。 + +## 2 信息隐蔽 + +### 2.1 信息隐蔽基础 + +接口是对象可见的部分,其他对象通过接口来调用操作 + +* 对象的数据结构发生变化时,不会对其他对象产生影响,只对拥有这个数据结构的对象(同一个类)有影响,并且,由于借口不变,对这个对象的操作调用不变。 +* 基本模块是对象,信息隐藏的内容有栈对象。必须通过栈对象来访问操作。 + +### 2.2 信息隐蔽的实现 + +##### 数组实现的信息隐蔽策略 + +##### 链表实现的信息隐蔽策略 + +### 2.3 信息隐藏对象的设计 + +* 首先设计信息隐蔽对象的外部接口 +* 其次设计信息隐蔽对象的内部实现细节 + +## 3 继承和泛化 + +### 3.1 作用 + +* 实现了代码的复用,是一种扩展机制 + +## 4 并发处理 + +### 4.1 主动对象 +* 主动对象=并发对象=并发过程=并发任务 +* 拥有自己的空值线程,并且独立于其他对象进行执行 +* 每个主动对象处理一个顺序执行的线程 +* 通过多个主动对象实现并发,不能通过主动对象内部实现并发过程。 +* 相互之间可以异步执行、通信,也可以同步执行、通信。 + +### 4.2 被动对象 +* 没有控制线程,被主动对象调用。 +* 可以调用其他被动对象。 +* 一旦被调用就会占据主动对象的线程进行执行。 + +### 4.3 主动对象间的协作 +> 这一部分请参考操作系统部分的笔记 + +##### 互斥问题 +##### 同步问题 +* 事件同步。源任务执行信号操作,目标任务执行等待操作。 +* 主动对象之间通过信号通信实现了线程任务的同步。 + +##### 生产者消费者问题 + +* 生产者主动对象产生信息 +* 消费者主动对象消费信息 +* 由于每个主动对象拥有他自己的控制线程,独立执行。所以每个对象操作时必须进行同步。 + +## 5 设计模式 + +反复使用、多人知晓、经过分类编目的设计经验总结。避免重复发明轮子。 + +设计模式涉及多个类和对象之间的关系,提供了一种比类的力度更大的方式。 + +* 软件架构:描述的是各个阶段各个力度各个等级的模型和视图。 +* 设计模式:表示类的组织方式。 +* 类:属性和操作的集合。 + + +## 6 软件架构和构件 + +定义构件以及构件之间的连接关系。 + +1. 定义构件需要描述其接口。 +2. 定义构件连接的连接器(多个构件之间的互联协议) + +## 7 软件质量属性 + +1. 性能 +3. 安全性 +3. 可用性 +4. 可伸缩性 +5. 可复用性 +6. 可维护性 +7. 可修改性 +8. 可测试性 +9. 可追踪性 + +## 8 基于用例的软件生存周期 + +![image](https://note.youdao.com/yws/public/resource/7500a3fc2481ddedcb13a2fb32f1096e/xmlnote/C73B191506604634ABD3679CA1FA29D1/12050) + +## 9 需求、分析、建模过程 + +### 9.1 需求建模 + +* 系统的功能需求采用用例和参与者来描述。 +* 用例定义了一个或多个参与者与系统之间的交互序列。 +* 用例描述是一个行为视图。用例关系是一个结构视图。 + +### 9.2 分析建模 +* 考虑对问题域的理解。 +* 静态建模:提供信息的结构视图。 +* 对象组织:确定参与每个用例的对象。包括实体对象、边界对象、控制对象、应用逻辑对象。 +* 动态交互建模:参与用例的对象之间的交互。使用用例图和通信图,来表示用例执行过程。 +* 状态机建模:对状态相关的对象进行建模——状态图。 + +### 9.3 设计建模 + +* 考虑问题的解决方案。 +* 考虑很多细节:接口设计、架构模式和设计模式决策、类接口决策、应用分布决策、对象特性决策、消息特性决策。 + + + + + + + + + + + + + + + + + diff --git a/架构模式/3.用例建模.md b/架构模式/3.用例建模.md new file mode 100644 index 00000000..97478b14 --- /dev/null +++ b/架构模式/3.用例建模.md @@ -0,0 +1,114 @@ +## 用例建模 + +### 目录 +1. 需求建模 +2. 用例 +3. 参与者 +4. 确定用例 +5. 用例图 +6. 用例描述 +7. 用例关系 + +## 1 需求建模 + +### 1.1 需求和需求建模 + +* 描述了用户对系统的期望,主要涉及系统的外部特性 +* 类型: 包括功能需求和非功能需求 +* 目的: 代替手工系统或者替代旧系统 +* 建模: 包含需求分析和需求规约 + +### 1.2 相关问题 + +* 需求分析需要考虑的问题:涉众扮演的角色、系统使用、特性、优势和局限性。 +* 需求规约:与用户达成共识的文档。也就是需求分析说明书。需求规约的质量属性:正确、完整、无二义性;一致、可验证、易理解特性;可修改、可追踪。 +* 非公能需求:性能、可用性、安全。 + +## 2 用例 + +### 2.1 用例作用 +用例建模是用来描述系统功能的一种方法。用例定义了一个或多个参与者与系统交互的序列。用例不关心具体实现,总是从参与者的输入开始。 + +### 2.2 用例表示 + +* 用例名称 +* 概述 +* 依赖:是否依赖、包含、扩展了其他用例。 +* 参与者 +* 前置条件:用例启动的条件 +* 主序列:主场景 +* 备选序列:在某些决策点上进入的场景 +* 非公能需求:性能和安全性的需求 +* 后置条件:用例执行完后总是为真的结果 +* 未解决的问题:需要讨论的问题 + +## 3 参与者 + +### 3.1 参与者作用 + +描述了一个与系统交互的外部用户。是一类外部用户,单个用户是参与者的实例。 + +### 3.2 参与者分类 + +* 人类参与者 +* 外部系统参与者 +* 设备参与者 +* 计时器参与者 + +## 4 确定用例 + +## 5 用例关系 + +### 5.1 包含关系 + +* 包含用例和基用例 +* 多个包含用例构成了一个交互序列,包含用例是抽象的,不能独立执行。 +* 包含用例反映了多个用例之间的共同功能。 +* 基用例包含并执行包含用例。 +* 包含用例用来组织冗长交互序列的用例(将大量交互序列进行分成多个用例中的交互序列)。是一种层层细分的建模思路。基用例提供了用户与系统之间高层抽象交互序列,包含用例提供了用户与系统底层细分的交互序列。 + +### 5.2 扩展关系 + +* 将可替换的、备选的、异常的分支作为新的用例。基用例,扩展用例。 +* 根据条件确定基用例以不同的方式扩展。扩展用例依赖于基用例,需要基用例在满足一定条件时执行。 +* 扩展点,用来扩展基用例的位置。可以根据条件分成多个扩展用例。扩展条件,是在基用例运行时确定的。 + + +## 6 用例组织 + +* 用例包:描述系统主要功能的集合,表示更高层的集合。 +* 可以基于用例的主要参与者,组织成用例包 +* 可以根据具有相同非公能需求的用例,组织成用例包。 + +## 7 活动图 + +描述控制流和活动序列的UML图。(就像平时说的流程图)显示了活动序列、决策点、循环、并发活动。用例模型可以使用活动图来描述主序列和备选序列。 +> 这里很明显说明了建模过程中的需求建模包含了建模方法:用例建模(表示功能需求)和静态建模(表示数据需求)其中用例建模可以使用UML图形工具中的用例图(表示用例关系)和活动图(表示用例执行序列)来实现。 +对建模过程、建模方法、建模工具进行了很好的区分。 + + + + +> 对软件生存周期中的建模过程和这里的建模方法的关系进行说明:一个是描述具体实践是建模的过程,另个一描述的是建模的方法。需求建模、分析建模、设计建模分别是生存周期当中,三个不同的建模阶段,每个建模阶段可能采取的方法也不止,比如需求建模可能包括:用例建模方法表示功能,静态建模方法表示数据。 + +> 对软件的建模方法和UML图的关系进行说明。UML图是一种图形工具,用来更好的表示方法,而不是方法不慎。所以UML画的图可以更好的描述建模的过程。用例建模用到了用例图,静态建模用到了类图、对象图、包图、构件图等。所以要区分过程、方法和工具。 + +> 我觉得现在的知识体系有点乱,首先应该把所有的基础内容都了解一下,至少看一遍。然后,花费大量时间,对学到的知识进行总结,构件知识体系。此时应该可以使用头脑风暴的图,来整理相关领域的知识。 + + + + + + + + + + + + + + + + + + diff --git a/架构模式/4. 静态建模.md b/架构模式/4. 静态建模.md new file mode 100644 index 00000000..201ca797 --- /dev/null +++ b/架构模式/4. 静态建模.md @@ -0,0 +1,128 @@ +## 静态建模 + +* 描述了被建模系统的静态结构,不随时间变化而变化。 +* 问题域静态建模:分析阶段对系统的主要概念进行建模。 + +### 目录 + +1. 类间关系 +2. 约束 +3. UML表示 +4. 系统上下文的静态建模 +5. 外部类静态建模 +6. 实体类的静态建模 + +## 1 类间关系 +### 1.1 关联关系 + +* 定义了两个类之间静态的、结构化的关系。 +* 关联称为链接。类之间有链接关系的对象之间才会有链接。关联的方向取决于动作的方向。 + +* 自反关联(一元关联):一个类的一个对象和这个类的另一个对象之间的关联。 +* 三元关联:三个类间的关联(两个类之间的关联关系也转化为一个类) +* 关联类:对两个或多个类之间的关系进行建模的类。 +* 关联的多重性:一对一关联、一对多关联、规定数值的关联、可选关联(0...1表示可能存在)、多对多关联。 + +### 1.2 整体和部分的关系(组合聚合关系) + +* 关系强弱:组合>聚合>关联 +* 组合涉及整体和部分之间的物理关系。 +* 聚合概念上的整体和部分关系,可以分开可以合并。 + +### 1.3 泛化特化关系 + +* 相同属性抽象为泛化类 +* 不同属性表示了特化的性质 + +## 2 约束 + +对关联、对象属性进行约束。 + +## 3 问题域静态建模——上下文类 + +* 通过分析用例模型来对问题域建模。 +* 分析建模:重点在于标识 问题域对象中的 对象 以及 对象之间传递的信息。主要用到静态建模方法、对象的组织、动态交互建模、动态状态机建模等建模方法。 +* 设计建模:将概念模型、逻辑模型映射到一个具体的并发设计模型。各个部分都要确定下来(决策)。 +* 上下文类即内部系统和外部环境之间负责交互的类。对应的三种类分别为:外部类、内部类、上下文类(交互类、接口类)。 + + +## 4 外部类 + +* 外部环境被描述为外部类。外部环境包括:人类、外部系统、计时器、输入输出设备。(这也是参与者的四种类型) + + +## 5 对象和类的组织 + +### 5.1 对象和类的分类 + +* 边界类:连接到外部环境并与之通信的软件类。 +* 实体类:信息密集的持久化类 +* 控制类:对对象的集合提供全局协调的类。 +* 应用逻辑类:包含应用逻辑细节的软件类。 + +### 5.2 实体类和对象 + +* 是概念性的和数据密集型的类。存储持久化数据,并提供对数据的访问。 +* 类似于数据库的逻辑模型,强调类的属性和类之间的关系。 + +### 5.3 边界类和对象 + +* 外部类与软件边界类对应。边界类是内部类,通过接口连接到外部类并与之通信。 +* 每一个外部类都与系统中的一个边界类进行通信。参与者-外部类-边界类(内部类)分别对应。其中参与者是在需求建模阶段通过用例建模方法获得的。外部类是在分析阶段建模过程中,对问题域静态建模的方法中得到的外部类建模。内部类是在对象和类的组织一节课中得到。 + +``` +graph LR +人类参与者-->外部用户类 +外部用户类-->用户交互类 +外部系统参与者-->外部系统类 +外部系统类-->代理类 +输入输出设备参与者-->外部设别类 +外部设别类-->设备IO边界类 +计时器参与者-->外部计时器类 +外部计时器类-->软件计时器类 +``` + +* 对四中边界类对象进行解释: + * 用户交互类:依赖用户接口技术,包括图形界面和命令行窗口 + * 代理类:外部系统的本地代表 + * 设备IO边界类:接受输入提供输出。 + + +### 5.4 控制类和对象 + +* 用来对实现用例的对象进行协调。(一个用例有一个控制类,控制相关的实现对象。) +* 控制对象可能是状态相关的。 +* 分为协调者对象、状态相关的对象、计时器对象。 +* 状态相关的控制对象产生的事件,不仅仅与输入有关,也与对象当前的状态有关。 + +### 5.5 应用逻辑类和对象 + +* 业务逻辑对象 +* 算法对象 +* 服务对象 +* 目的:将相互独立变化的业务规则分离封装到不同的应用逻辑类种。 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/架构模式/5. 动态交互建模.md b/架构模式/5. 动态交互建模.md new file mode 100644 index 00000000..089e48f0 --- /dev/null +++ b/架构模式/5. 动态交互建模.md @@ -0,0 +1,155 @@ +## 动态交互建模 + +### 目录 + + +## 1概念 +### 1.1 动态模型概念 +* 描述了被建模系统的控制行为以及构件的交互顺序。对象内部的动态模型——有限状态机模型。对象之间的动态模型——交互图或通信图。 +* 基于用例建模和问题域的静态建模。 + + +## 2对象交互建模 + +### 2.1 通信图 +* 描述了一组对象如何通过对象间的消息传递来实现交互。 +* 每一个用例对应一个通信图。通信图中的对象都是用例包含的对象,对象之间的消息发送序列由编号来描述。通信图中的消息序列与用例描述中参与者与系统的交互序列相对应。 + +### 2.2 序列图 +* 按照时间顺序展现了对象之间的交互。可以描述循环和迭代的过程。 +* 不需要编号,从上到下,表示了消息的先后顺序。 +* 序列图的优缺点 + * 优: 清楚地显示对象间的消息传递序列 + * 优: 对设计对象操作的执行逻辑有益 + * 缺: 不易表述对象的关联 + * 缺: 涉及多个对象的复杂序列图及使用了循环和判定逻辑的序列图不易阅读 +* 通信图的优缺点 + * 优: 清楚地展现了对象的布局及其关联关系 + * 优: 易于平滑过渡到软件架构的设计 + * 缺: 表示消息序列直观性差(用编号) + * 缺: 对设计对象操作的执行逻辑帮助有限 + +### 2.3 消息序列 + +* 交互图上的交互序列描述了用例中的一个场景。 +* 消息标签:序列表达式:消息名称(消息参数) +* 消息序列的编号:用例ID+整数(外部事件)+小数(内部事件)+第二个字母(并发分支情况) +``` +A1, A1.1, A1.2, A1.3, A1.4, …… +A2, A2.1, A2.2, A2.3, A2.4, …… +A2.1a, A2.1a.1, A2.1a.2, …… +表示用例A被参与者两次发起交互序列,在消息A2处发 +起了并发消息序列分支。 + +A1, A1.1, A1.2, A1.3, A1.4, …… +A2, A2.1[Normal], A2.2, A2.3, A2.4, …… +A2.1a[Error], A2.1a.1, A2.1a.2, …… +表示用例A被参与者两次发起交互序列,在消息A2处发 +起了条件分支的消息序列,标记为A2.1[Normal]的消息 +序列是正常序列,标记为A2.1a[Error]的消息序列是可 +替换的消息序列。 +``` + + +## 3 动态交互建模——无状态交互建模 + +### 3.1 目的 +* 分析对象之间如何通过交互来实现用例 + +### 3.2 步骤 +* 开发用例模型 +* 确定在实现时,所需要的用例对象。 + * 确定边界对象。 + * 确定内部软件对象。 +* 确定消息通信序列。主序列通信图 +* 确定可替换序列。备选序列通信图。合成通用通信图。 + + +### 3.3 实例 + +## 4 动态交互建模——有限状态机 + +### 4.1 概念 +包含有限个状态的概念化机器。对系统或者对象的控制视图进行建模。有限状态机的行为既与当前输入有关,也与之前执行的事件有关。可能导致输出,事件具有原子性不持续。状态是一种可以识别的、存在于一段时间内的情况,转化时间忽略不计。 + + + +### 4.2 ECA机制 + + +``` +graph LR +E(event)-->|触发| C(Condition) +C(Condition)-->|执行| A(Action) +``` + + +### 4.3 状态图 + +##### 事件和条件 + +* 通过使用警戒条件,能够使状态转换具有条件性。 +* 表示格式 ==*事件[条件]*== 条件是布尔表达式,条件为真时,发生状态转变。 +* 事件可以不必立即导致状态变化,而是作为以后事件(状态转化)的警戒条件。 + +##### 动作 + +* 表示格式 ==*事件/动作*== +* 状态转换的结果是动作的执行,动作执行后,状态转化完毕。动作持续时间忽略不计。三类动作(状态转换动作、进入动作、退出动作) +* 进入动作: Entry/Start Cooking 进入此状态后执行的动作,但上一模块退出不一定执行。 +* 退出动作: Exit/Stop Cooking 退出此状态时执行的动作,但下一模块进入不定执行。 + + +### 4.4 层次化状态图 + +* 用来简化状态图,增强建模能力。 +* 层次关系:分解和聚合。 +* 层次化状态分解:引入符合状态,被分解为多个子状态。 + + +##### 顺序华状态分解 +* 子状态相互关联,且有先后顺序,顺序化状态分解。 +* 当复合状态被分解为多个子状态时,必须保留进入和离开该复合状态的状态转换。 + +##### 正交状态图 +* 用来从不同视角对同一对象状态进行建模。 +* 高层次的状态可以分解为两个或者多个正交状态图。 +* 当进入复合状态时,同时进入正交的多个状态图。 +* 可以表示并发。 + +### 4.5 开发状态图的指导原则 + +* 状态名称必须反映可识别的情况或一段时间间隔。 +* 必须能从某个状态退出,可以没有终止状态。 +* 任何时刻只能处于一个状态(并发的状态可以处于多个状态把) +* 不能混淆事件和动作。事件是状态转变的原因,动作是状态转变的结果。 +* 事件表示一个时刻,表示事情或者动作的结果。是由外部操作引起的。 +* 动作是一个命令,瞬间执行,由系统执行。 +* 条件是布尔值。 + + +### 4.6 用例图到状态图 +##### 转化步骤: +* 从用例中的一个场景出发,最好是主序列 +* 考虑给定场景下外部事件的顺序,通过系统对事件的响应确定状态转换和状态 +* 若一个动作与状态转换关联,则从一个状态转换为另一状态时触发该动作 +* 动作靠系统对输入事件的响应来决定 +* 考虑用例中的所有备选序列,获得所有可能的 +外部事件 +* 通过分析这些事件对系统的影响,添加新的状 +态、状态转换和动作 +* 一个状态图可能参与多个用例,此时每个用例 +对应一个部分状态图,将部分状态图整合形成 +完整状态图 +* 对得到的扁平状态图进行层次化处理 +* 也可以采用自顶向下的方法先开发高层状态图,然后分解 + +## 5 状态相关的动态交互建模 + +### 5.1 建模步骤 +* 确定边界对象:负责发送事件,引起内部状态转换。 +* 确定状态相关的控制对象。 +* 确定其他软件对象。 +* 确定主序列中的对象交互。 +* 确定状态图的执行。 +* 考虑备选序列的场景。 \ No newline at end of file diff --git a/架构模式/6. 软件架构模式.md b/架构模式/6. 软件架构模式.md new file mode 100644 index 00000000..75a879a0 --- /dev/null +++ b/架构模式/6. 软件架构模式.md @@ -0,0 +1,95 @@ +# 软件机构模式 + +## 1 基于构件的软件架构模式 + +## 2 软件架构的多视图 + +## 3 软件架构模式 + +## 4 接口设计 + +## 1 软件架构 + +### 1.1 定义 + +* 一个程序或计算机系统的软件架构是包含了该系统的**软件元素**、这些元素的**外部可见的属性**以及这些**元素之间关系的结构**或一组系统结构 +* 描述角度:静态和动态;动能和非功能的。 + +### 1.2 基于构件的软件架构 + +* 软件由构件组成,每个组件相对独立的封装了一些信息。 +* 构件可以由简单对象或由其他对象组成的复合对象。 +* 构件通过接口与其他对象通信。(接口描述了通信所需要的信息,接口与实现分离,接口约定了通信模式) + +### 1.3 设计方式 + +* 顺序式设计:没有控制线程的被动类。把构件单独编译存储在构件库中,通过调用-返回的方式进行通信。(只有一个主动类) +* 并发或分布式设计:构件是主动地,可以被部署到一个分布式环境的不同节点上,并发构件可以通过几种不同的通信模式进行通信:同步模式、异步模式、代理模式,群组通信模式。 + +## 2 软件架构的多视图 + +### 2.1 视图角度 +* 结构视图:是一种静态视图,使用类图来描述。 +* 动态视图:是一种行为视图,使用通信图来描述。 +* 部署视图:软件架构的物理配置,子系统如何在一个分布的配置中,分配到不同的节点。 + +## 3 软件架构模式 + +> 软件架构模式可以从两个角度来描述,一个是软件的结构模式:主要是静态结构。另一个是通信模式:主要是软件构件之间的动态通信。 + +### 3.1 软件结构模式 + +* 集中控制模式 +* 分布式控制模式 +* 层次化控制模式 +* 抽象分层模式: + + * 分层可以提高软件的伸缩性,通过添加删除上层提供伸缩性。 + * 从软件架构的功能和角色角度分层。 + * 从部署方法考虑。 +* 多客户端/单服务模式 +* 多客户端/多服务模式 +* 多层次客户端/服务模式 + +### 3.2 通信模式 + +* 异步消息通信模式:生产者向消费者构件发送一条消息,不必等待返回消息,继续执行。消息到达消费者后可能接收消息并处理,或者通过先进先出的消息队列进行异步通信。提高系统的灵活性。 +* 带回调的消息通信模式 +* 双向异步消息通信模式 +* 广播模式 +* 代理者转发模式。 +* 代理者句柄模式。 +* 调用返回模式:顺序设计的通信方式。主动对象调用被动对象上的方法,控制主动对象传递到被动对象,然后传递回主动对象,期间伴随着参数的传递。 +* 协商模式 +* 服务发现模式 +* 服务注册模式 +* 订阅/通知模式 +* 带回复的同步消息通信模式:客户端构件向服务端构件发送一条消息,并等待服务构件的回复。消息到达服务器端,进行处理。生成回复返送给客户端。当服务端未收到任何消息,服务端挂起,一半包含多个客户端和一个服务端。 +* 不带回复的消息通信模式 + +### 3.3 特殊模式 + +* 复合事物模式 +* 长事物模式 +* 两阶段提交协议模式 + +### 3.4 软件架构模式编档 +> 关键定义 +* 上下文:指生产问题的环境。 +* 问题:指上下文中可能重复出现的问题。 +* 解决方案:指一种解决问题的可行的方法。 + +## 4 接口设计 + +### 4.1 接口设计的作用 + +* 接口明确了一个类、构件或服务的外部可见操作,不需要提供内部关于该操作的实现。 +* 是类的外部视图的设计者和类的内部视图的实现者之间的一种约定。 +* 接口是使用该类所提供的操作的类和实现了这些操作的类之间的约定。 +* 接口可以以不同的方式实现。 +* 一个接口可以独立于实现他的构件进行建模。 + + + + +> 为了装逼而存在的架构模式。应该专业术语为“过设计”过于强调通过复杂的设计来避免简单的问题。 \ No newline at end of file diff --git a/架构模式/7. 软件子系统架构设计.md b/架构模式/7. 软件子系统架构设计.md new file mode 100644 index 00000000..6302959b --- /dev/null +++ b/架构模式/7. 软件子系统架构设计.md @@ -0,0 +1,80 @@ +## 软件子系统架构设计 + +### 目录 + +* 相关问题 +* 集成通信图 +* 关注点分离 +* 组织原则 +* 消息通信决策 + +## 1相关问题 + +### 1.1 子系统设计建模概述 + +* 分析建模是基于需求建模(用例建模)的结果 +* 设计建模定义了软件的结构和行为属性的软件架构 +* 将系统分解为子系统,对子系统进行独立设计。 + +### 1.2 如何子系统设计建模 + +* 子系统是一个与其他子系统功能相对独立。 +* 定义子系统的接口,然后就可以具体设计了。 +* 子系统和模块的定义是等价的。 + +### 1.3 子系统化分方面考虑的问题 + +* 地理位置上的分布情况 +* 服务器职责区分 +* 将功能相关、耦合度高的对象划分为同一子系统。 + +## 2集成通信图 + +### 2.1 通信图作用 + +* 生成初始的软件设计 +* 通信图比序列图更能形象地描述对象之间的联结以及传递的信息。 +* 集成通信图是泛化的UML图,描述了对象之间所有可能的交互。通信图上用不编号的简单消息表示。 +* 可以通过高层的子系统通信图进行简化。 + +### 2.2 通信图的开发方法 + +* 合成顺序与用例执行顺序一致。 +* 各个用例的通信图进行一次叠加。从后向前添加 + + + +## 3关注点分离 + +### 3.1 分离关注点的方法 + +* 复合对象:复合对象属于同一个子系统。 +* 地理位置:地理位置不同应该属于不同的子系统 +* 客户端和服务 +* 用户交互:用户交互对象可能位于不同的独立操作系统当中。 +* 外部对象接口:用一个子系统处理用例模型的一部分参与者。和上下文图中的一部分真实对象。 +* 控制范围:一个控制对象控制的所有实体和IO对象都应该位于同一个子系统当中。 + + +## 4组织原则 + +### 4.1 子系统组织原则 + +* 客户端子系统:一个或多个服务的请求者,可以包括用户交互子系统、控制子系统和IO子系统。 +* 用户子系统:提供用户访问系统服务。软件系统中的用户交互系统可能有多个,对应不同类型的用户。支持多种用户界面、多窗口多线程控制。 +* 服务子系统:对来自客户端的请求进行响应。通常有两个或者多个对象组成的复合对象,包括实体对象、协调者对象、业务逻辑对象。 +* 控制子系统:接受外部环境的输入,产生面向外部环境的输出,这里的外部环境可以使其他子系统。 +* 协调者子系统:协调其他子系统的执行。监管和协调各个控制子系统。用来决定多个服务子系统的执行顺序。 +* 输入输出子系统:可能包含多个设备接口对象,和存储数据的数据对象。 + + + + +## 5消息通信的决策 + +### 5.1 分析模型和设计模型通信决策对比 + +* 分析模型中不关心消息通信的类型和消息本身的内容。设计建模,子系统结构被确定后,需要明白消息的准确语义(同步还是异步、单向还是双向) +* 具体表示:分析模型用箭头表示方向。设计模型中,确定消息的通信模式和消息细节, + * 并发的生产者和消费者之间,异步的消息通信(并发代表独立执行,通信,实现独立运行的线程之间的交流,异步,代表互不影响) + * 并发的客户端和并发的服务端,同步的消息通信(客户端一般会等待服务器端进行响应) diff --git a/架构模式/8.面向对象的软件架构设计.md b/架构模式/8.面向对象的软件架构设计.md new file mode 100644 index 00000000..eabb076e --- /dev/null +++ b/架构模式/8.面向对象的软件架构设计.md @@ -0,0 +1,97 @@ +# 面向对象的软件架构设计 +##### 1 概述 +##### 2 设计类的接口和操作 +##### 3 设计信息隐藏类 +##### 4 设计继承 +##### 5 类接口规约 +##### 6 类的详细设计 + +## 1 概述 +* 信息隐藏 +* 接口的实现与分离 +* 顺序性面线对象软件设计,拥有一个控制线程。对象之间通信采用调用返回模式。 + +## 2 设计类的接口和操作 + +* 类的接口由每个类提供的操作组成。包括输入参数、输出参数、返回值。 +* 类的操作可以根据静态模型或动态模型确定。 +* 类的操作可以基于交互模型设计。当两个对象交互时,发送消息的对象调用接受消息的对象的操作。消息传递映射为操作调用。(消息名=操作名,消息参数=操作参数) +* 分析模型,捕获对象间传递的消息,而不是操作的准确语法。设计模型,必须提供操作的准确语法,包括名称和结构。 +* 调用操作=通信图中的同步消息。返回值=返回消息。 + + +## 3 设计信息隐藏类 +### 3.1 实体类设计 +* 实体类是封装数据的类,其实例用来存储信息的持久化对象。 +* 实体类分为数据抽象类和包装器类。数据抽象类:封装数据结构。包装器类:隐藏了数据,提供了接口。 +* 分析模型中的实体类被设计为数据抽象类。封装了数据结构,并隐藏了数据结构的内部细节。属性静态建模时确定,操作动态建模时确定。 + +### 3.2 控制类设计 + +* 为一组对象提供总体调用。 +* 被动控制类:状态机类。主动控制类:协调者类和计时器类。 +* 状态机类封装了一个状态图中的信息,状态机对应的状态图可以用状态表来描述。状态机提供了访问访问状态转化表和改变对象状态的操作 +* 可复用的状态机类:processEvent(in event, out action) 通过这个方法,来接受所有的事件,输出不同的动作。 + +### 3.3 边界类 + +* 与外部环境通信 +* 通常是主动类:IO类或者代理类。也可以使被动类,图形用户交互类。 +* 图形用户交互类,捕获用户的输入信息,以及向用户显示信息。 + +### 3.4 应用逻辑类 + +* 封装特定应用的逻辑和算法。 +* 主动类,算法通常都是主动的。被动类:业务逻辑类和服务类。 +* 业务逻辑类的设计:定义了处理客户端请求的决策以及特定业务的应用逻辑。 + +## 4 设计继承关系 + +### 4.1 设计方法 + +##### 自顶向下的设计方法 + +* 先设计一组类的总体特征的超类,然后设计具有差异性的子类 + +##### 自底向上的设计方法 + +* 设计一组包含共同特征和不同特征的类。 +* 再将共同特征泛化为一组超类。 + +##### 混合方法 + +### 4.2 具体设计 + +##### 抽象类 + +* 抽象类是一种通过继承来共享特征和行为的机制。 +* 不能实例化,用来创作子类,作为超类,为子类提供接口。 +* 抽象操作:没有实现,只有声明,一个抽象类至少包含一个抽象操作。具体类继承抽象类,必须实现抽象操作。 +* 非抽象操作:抽象类中给出实现的动作,被所有子类共享,子类可以复写。 + + +##### 5 类的接口规约 + +### 5.1 信息隐藏类的接口: +### 5.2 操作的定义 +* 所执行的功能 +* 前置条件 +* 后置条件 +* 不变量 +* 输入参数 +* 输出参数 +* 所使用的其他类的操作。 + +## 6 类的详细设计 + +### 6.1 详细设计的工作 + +* 确定每个操作的内部算法(使用伪代码,要独立与特定的编程语言) + + + + + +> 说实话,我现在在学习的应该是一种建模架构的方法,当你拿到一个项目的时候,首先要知道开展工作的步骤是哪些。每一步是从什么样的角度展开研究。每一个研究可以借助什么样的工具方法以及这样的研究的目的。通过一步步的实践,可以让你熟练这个过程,所以你在这里学习的是一种解决问题的思路,而不是简简单单的建模建模!!! 建模是干啥的,能解决什么问题,有什么意义,这才是关键,所以,你要从头看一遍书,认认真真的看一遍,了解其中的关键内容。 + + diff --git a/架构模式/MDA开发生命周期流程.png b/架构模式/MDA开发生命周期流程.png new file mode 100644 index 00000000..d411175e Binary files /dev/null and b/架构模式/MDA开发生命周期流程.png differ diff --git a/架构模式/基于用例的软件生命周期.png b/架构模式/基于用例的软件生命周期.png new file mode 100644 index 00000000..a65de2c8 Binary files /dev/null and b/架构模式/基于用例的软件生命周期.png differ