学习笔记---UML(二)

1 OOAD详解

1.1 uml工具

staruml,小巧,用的比较多,还有一款类似的软件,叫jude,用的也比较多。

1.2 面向对象

  • 面向对象是一种系统建模技术,Object-Orientation,简称OO。
  • 面向对象编程是一种使用OO的方法学来开发程序的过程,Object-Orientation Programming,简称OOP。
  • 通过分析系统内对象的交互来描述或建模一个系统。
  • 交互的对象最终以类的形式组织。
  • OO的方法由三部分组成:过程,标识,规则。

1.3 对象

  • 是一个客观存在的、唯一的实体。
  • 是OOP过程中分析与解决问题的出发点和基础。
  • 拥有自己的标识、数据与 行为。
  • 可以简单或复杂。
  • 可以抽象或具体。
  • 在OOP中是一个类的动态实例。

1.4 类

  • 类是对象的模板。
  • 对象通过类实例化产生。
  • 一个类可以创建多个对象。

1.5 OOAD

  • Object-Orientation Analysis and Design,是根据OO的方法学,对软件进行分析和设计的过程。
  • OOA,分析阶段。
  • OOD,设计阶段。
  • 理想的,实际中往往需要反复去做。

1.5.1 OOA阶段

  • 分析阶段主要解决一下问题:

    ① 建立针对业务问题域的清晰视图。

    ② 列出系统必须要完成的核心任务。

    ③ 针对问题域建立公共词汇表。

    ④ 列出针对此问题域的最佳解决方案。

  • 此阶段要解决的核心问题是:What to do?

1.5.2 OOD阶段

  • 设计阶段主要解决一下问题:

    ① 如何解决具体的业务问题。

    ② 引入系统工作所需的支持元素。

    ③ 定义系统的实现策略。

  • 此阶段解决的核心问题是:How to do?

1.6 OOP的主要特征

  • 抽象 abstract
  • 封装 encapsulation
  • 继承 inheritance
  • 多态 polymorphism
  • 关联 association
  • 聚合 aggregation
  • 组合 composition
  • 内聚与耦合 cohesion and coupling

1.6.1 抽象

  • 忽略掉一个对象或实体的细节而只关注其本质特征的过程。
  • 简化功能与格式。
  • 帮助用户与对象交互。

1.6.2 封装

  • 隐藏数据和实现。
  • 提供公共的方法供用户调用功能。
  • 对象的两种视图:

    外部视图:对象能做的工作。

    内部视图:对象如何完成工作。

1.6.3 继承

  • 通过存在的类型定义新类型的机制。
  • 通常在两个类型之间存在 is a 或 kind of 这样的关系。
  • 通过继承可以实现代码的重用,另外继承也是多态的基础。

1.6.4 多态

  • 一个名称,多种形式。
  • 基于继承的多态。
  • 调用方法时根据所给对象的不同选择不同的处理方式。

1.6.5 关联

  • 对象之间交互时的一种引用方式。
  • 当一个对象通过对另一个对象的引用去使用另一个对象的服务或操作时,两个对象之间就产生了关联。

1.6.6 聚合

  • 关联关系的一种,一个对象成为另一个对象的组成部分。
  • 是一种较强的关联。
  • 两个对象之间存在 has a 这样的关系,一个对象作为另一个对象的属性存在,在外部对象产生时,可由客户端指定与其关联的内部对象。

1.6.7 组合

  • 当一个对象包含另一个对象时,外部对象负责管理内部对象的生命周期的情况。
  • 关联关系中最为强烈的一种。
  • 内部对象的创建由外部对象自己控制。
  • 外部对象不存在时,内部对象也不能存在。

1.7 域模型

  • 域模型是面向对象的,在面向对象术语中域模型也可以成为设计模型。
  • 域模型由一下内容组成:

    ① 具有状态和行为的与对象。

    ② 域对象之间的关系:

  • 关联 Association,
  • 依赖 Dependency,
  • 聚集 Aggregation,
  • 一般化(泛化)Generalization

1.7.1 关联关系

  • 一对多和多对一本质是一样的,只是参照不一样。
  • 一对一,如人与身份证。
  • 多对多,如学生与课程。

1.7.2 依赖

  • 在BusinessService中访问Customer类的方法,并且构造Customer类的对象。

1.7.3 聚集

  • 聚集指的是整体与部分之间的关系,在实体域对象之间很常见。

1.7.4 泛化

  • 泛化指的是类之间的继承关系。

1.8 内聚与耦合

  • 内聚:度量一个类独立完成某项工作的能力。
  • 耦合:度量系统内或系统之间依赖关系的复杂度。
  • 设计原则:高内聚、低耦合

1.9 开发过程概述

  • 传统开发过程:瀑布模型
  • 统一软件开发过程(USDP)

1.10 OOAD开发过程

  • 大项目分解为一些子项目。
  • 使用UML工具。
  • 统一软件开发过程是一个迭代的、递增的开发过程。

1.10.1 迭代、递增项目生命周期

  • 项目是迭代、递增的。
  • 迭代指生命周期中的一个步骤。
  • 迭代导致“递增”或者整个项目的增长。
  • 大项目分解为子项目。
  • 在每一个迭代的阶段,应该做以下工作:

    ① 选择并分析相关用例

    ② 根据所选架构进行设计

    ③ 在组件层次实现设计

    ④ 验证组件满足用例的需要

  • 当一次迭代满足目标后,开发进入下一个迭代周期。
  • Inception --- start up
  • Elaboration --- refine
  • Construction --- implement
  • Transition --- promotion
  • 每一个周期包含一次或多次迭代。
  • 一个阶段的结束称之为里程碑(milestone)。

过程图:

1.10.2 初始化阶段

  • 该阶段的增量集中于:

    ① 项目启动

    ② 建立业务模型

    ③ 定义业务问题域

    ④ 找出主要风险因素

    ⑤ 定义项目需求的外延

    ⑥ 创建业务问题域的相关说明文档

1.10.3 细化阶段

  • 本阶段的增量集中于:

    ① 高层的分析与设计

    ② 建立项目的基础框架

    ③ 监督主要的风险因素

    ④ 制定达成项目目标的创建计划

1.10.4 构建阶段

  • 本阶段的主要增量集中于:代码及功能的实现

1.10.5 移交阶段

  • 本阶段的增量主要集中于:

    ① 向用户发布产品

    ② beta测试(alpha测试是内部测试,beta测试是用户测试)

    ③ 执行性能调优,用户培训和接受测试(对于性能问题,我们开发项目时经常会遇到一个性能瓶颈,但是,项目开始时没有必要就一直挂念性能问题,性能应该是在后阶段考虑的,如果一开始就把性能当做一个重要指标,会影响开发进度,也许一开始考虑的性能问题根本不存在,性能的调优是一个很深的学问,应该是根据大量测试和数据说话,只根据经验或者是查看代码是不靠谱的)

1.10.6 迭代工作流

  • 每一次递增都由5部分工作流组成:

    ① 需求与初始分析

    ② 分析

    ③ 设计

    ④ 实现

    ⑤ 测试

  • 每一次迭代执行工作流的深度不同
  • 早期的迭代在深度上覆盖初始工作流,后期迭代在深度上覆盖后期工作流。
  • 80/20原则

迭代工作流:

1.10.7 迭代、递增优势

  • 降低成本
  • 便于更好的维护项目进度
  • 便于团队的协作开发
  • 便于适应用户需求的动态变化
时间: 2024-12-19 15:04:16

学习笔记---UML(二)的相关文章

Thinking in UML 学习笔记(二)——UML核心视图之用例图

在UML中,需求模型又称为用例模型,它主要用于描述系统的功能性需求,即软件可以实现的功能,如登录.注册.入库.出库.查看库存报表.增加员工信息等.常规的用例建模一般包括两个组成部分:绘制用例图和编写用例文档. 用例图采用参与者和用例作为基本元素,以不同的视角展现系统的功能性需求. 一.业务用例视图 说明:使用业务主角和业务用例展现业务建模. 1.业务主角视角 作用:从业务的角度展示业务主角在业务中使用用例达成业务目标. 借阅人在借书管理系统中有借阅图书和办理借阅证两个业务目标. 2.业务模块视角

安卓学习笔记(二)基本构件

1.Activity 一个Activity,通常是用户在某一个时刻,在设备上看到的单独的界面.一个应用程序通常含有多个Activity,用户可在期间进行切换.对用户而言,这就是程序的外观部分. Activity的生命周期:启动一个Activity可能会消耗大量资源.他可能会涉及到新建一个Linux进程.为UI对象申请内存空间.从UML布局填充所有对象,以及创建整个界面.为了避免这种浪费,Android通过ActivityManager来管理活动的生命周期. ActivityManager负责创建

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con

C++primer学习笔记(二)——Chapter 4

4.1  Fundamentals 1.Basic Concepts (1)操作符分为一元,二元或者三元操作符: (2)复杂的表达式中含有很多操作符时: 规则一:分为不同的级别,级别高的先运行: 规则二:相同级别的操作符有执行顺序的确定: (3)操作符可以改变操作数的类型 一般将级别低的转化成级别高的 (4)重载运算符 相同的运算符在对不同类型的对象进行操作的时候,会有不同的功能: (5)Lvalue和Rvalue 显而易见:Lvalue指的是Left value,Rvalue指的是Right

struts2学习笔记(二)—— 获取登录信息及计算在线人数

实现目的: 1.点击"Login"的超链接,进入登录页面 2.填写登录信息,提交表单,将用户信息保存进Session 3.显示用户名,并计算在线人数 4.点击"Logout"的超链接,在线人数减一,并使Session失效 Struts2实现: 1.配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:/

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s

《iOS应用逆向工程》学习笔记(二)iOS系统目录结构(部分)

首先下载个iFile,可以用来直观地查看iOS系统的目录结构. 下面记录一些关键的iOS目录结构: /var:"variable"的简写,存放一些经常更改的文件,例如日志.用户数据.临时文件等.其中/var/mobile/Applications下存放了所有App Store App. /Applications:存放所有的系统App和来自Cydia的App,不包括App Store App.越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/App

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

HTML5学习笔记(二)——表单1

表单一直是网页必不可少的一部分,一直以来,表单的作用被无限扩展,发展出了诸多新奇的用法,老版的HTML只支持很少的一部分常用表单,许多的新表单都需要借助CSS与JavaScript语言来进行构建,现在HTML5来了,她带来了新的表单,这些强大的表单项,可以省去一大块复杂的JavaScript代码,很值得去学习. 而且在新的表单里面,不再像以前每个表单都必须位于<form></form>之内,只要在<form></form>内定义一个id,然后在网页任何位置都

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];