BLOG

Record, summarize, and improve.

软件工程图

Image in a image block
Image in a image block

流程图

不论什么程序设计语言,程序设计都有3种基本结构:顺序结构、选择结构和循环结构。三种基本结构的特点: 一个入口,一个出口,不出现死循环和死语句。

Image in a image block

UML图

统一建模语言UML ) 软件工程领域中一种通用的、开发性的建模语言,旨在提供一种可视化系统设计的标准方法。UML的目标是以面向对象图的方式来描述任何类型的系统,具有很宽的应用领域。

UML2.0 有很多类型的图表,分为两类。一些类型代表结构信息,其余类型代表一般行为类型,包括一些代表交互不同方面的类型。这些图可以按层次分类,如下面的类图所示:

Image in a image block

结构 UML 图

  • 类图

    类图是面向对象系统建模中最常用的,也是定义其他图的基础。它主要是用来显示系统中的类,接口及他们之间的关系。类图中包含的主要元素有类、接口、和关系。其中的关系有关联关系、泛化关系、依赖关系、实现关系。在类图中也可以包含注释和约束。

    类是类中的主要组件,有3部分组成:类名、属性和方法。

    接口的表示法:在UML中接口用一个带有名称的圆圈表示。并且通过一条实践与它的模型相连。也可以使用普通的类表示,但是要在上面要做声明。

    泛化关系:表示类与类,接口与接口之间的继承关系。

    依赖关系:对于两个相对独立的系统。当一个系统负责构造另一个系统的事例,或者依赖另一个系统的服务时。这两个系统之间体现为依赖关系。

    关联关系:对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定的事例存在固定的对应关系时,这两个系统之间的关联关系。关联关系中的关系可以有一个名称。

    关联关系包括:聚合关系、组成关系

    聚合关系:是一种特殊的更强形式的关联,它在逻辑上是部分和整体的关系。但 是不强调生命周期。聚合关系描述了一中“has a”的关系。即整体拥有部分。整体不在,部分可以存在。聚合关系使用空心的菱形箭头

    组合关系:它是更强的一种聚合关系,它强调生命周期。只有在整体存在的条件下,部分才能存在,如果整体不在,部分不能单独存在。整体拥有部分的生命周期。组成关系用实心的菱形箭

  • 组件图

    组件图:组件图用来建立系统中各种组件之间的关系。各个组件通过功能组织在一起。JavaBean,ejb,jsp都是组件。在UML中,组件使用左侧有两个小矩形的矩形来表示。组件图用来设计系统的整个架构。

  • 包图

    包图用于描述系统的分层结构,由包或类组成,表示包与包之间的关系

  • 部署图

    部署图:部署图是用来帮助开发者了解软件中各种组件驻留在什么硬件位置,以及这些硬件之间的相互关系。

  • 对象图

    对象图:对象图是类图的实例,用于显示系统执行时的一个可能的快照。即在某一个时间系统上可能出现的样子,对象图用带有下滑线的对象名称表示对象

行为 UML 图

  • 活动图

    活动图本质上就是流程图。它用于描述系统的活动,判定点和分支等。活动中的动作状态,原子的、不可已中断的动作。并在此动作完成后向另一个动作转变。分支与合并。分支在软件系统中很常见:用于表示对象类具有的条件行为。用一个布尔型的表达式真假来判定动作的流向,合并有两个如转换一个出转换。分支有一个如转换两个出转换。分叉与汇合:分叉又来描述并发线程。每个分叉可以有一个输入的转换和两个或多个输出转换。汇合代表两个或多个并发控制流的同步发生。当所有流都到达汇合点后,程序才能继续前进。泳道:泳道将活动图中的活动划分为若干组。并将每一组指定给负责这组活动的业务组织。在活动图中,泳道使用垂直的实线绘制。

  • 协作图

    协作图:也叫做合作图,是一种交互图。时序图主要侧重于对象之间的消息传递在时间上的先后关系。而协作图表达对象之间的交互过程及对象之间的关联关系

  • 序列图

    序列图(顺序图)是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型,强调时间顺序

    顺序图可以用来展示对象之间是如何进行交互的。顺序图将显示的重点放在消息序列上,即强调消息是如何在对象之间被发送和接收的

    序列图的主要用途是把用例表达的需求,转化为进一步、更加正式层次的精细表达。用例常常被细化为一个或者更多的序列图。同时序列图更有效地描述如何分配各个类的职责以及各类具有相应职责的原因。

  • 状态图

    状态图包括状态、转换、初始状态、终止状态。

  • 时序图

    时序图:时序图用于描述对象之间的传递信息的时间顺序。即用例中的行为顺序。当执行一个用例时,时序图中的每一条消息对应了一个类中操作或者引起转换的触发事件。时序图是一个而微大关系图。纵轴表示时间时间轴向下延伸。横轴代表协作中的各个独立对象。对象存在时。消息用从一个对象的生命线到另个对象的生命线的箭头表示。箭头以时间的顺序在图中上下排列。

  • 用例图

    用例图:也被称为用户模型图,是从软件的需求分析的到最终实现的第一步,它是从客户角度来描述系统功能的。它包含三个基本组件:参与者(使用系统的人或事物)、用例(代表系统的某项完整的功能,在图形中使用椭圆型表示)、关系(泛化关系、扩展关系、包含关系)。

    扩展关系:如果一个功能在完成的时候,偶尔会执行另外一个功能,使用扩展关系表示。

    泛化关系:表示同一个业务的不同技术实现。其实就是继承关系的一种。

    包含关系:是指一个用例可以含有其他用例具有的行为。

常用的UML图规则

结构图

组件图

类图

每个类由一个框表示,每个框具有三个部分,这些部分彼此堆叠,格式如下。只有班级名称是必填项

  • 班级名称
  • 属性–名称:类型
  • 操作–方法名称(参数列表):返回值类型

    属性或方法名称前面的符号表示其可见性-公共(+),受保护(#),私有(-),派生(/)或程序包(〜)

  • 关联关系是用一条直线表示的
  • 泛化关系用一条带空心箭头的直线表示
  • 实现关系用一条带空心箭头的虚线表示
  • 聚合关系用一条带空心菱形箭头的直线表示
  • 组合关系用一条带实心菱形箭头直线表示
  • 依赖关系是用一套带箭头的虚线表示的

1. 关联(Association)

  • 含义:表示一个类与另一个类之间存在联系,可以是一对一、一对多或多对多。
  • 例子:学生(Student)与课程(Course)之间的关系:一个学生可以选多门课程,一门课程也可以被多个学生选。
  • 表示方法:类之间用一条实线连接,在两端写上基数(Multiplicity),比如 1..*
Student 1..* -------- *..1 Course
class Course:
    def __init__(self, name):
        self.name = name

class Student:
    def __init__(self, name):
        self.name = name
        self.courses = []  # 学生可以有多个课程(1..*)

    def add_course(self, course):
        self.courses.append(course)

# 示例
math = Course("Math")
alice = Student("Alice")
alice.add_course(math)
print([c.name for c in alice.courses])  # ['Math']

2. 聚合(Aggregation)

  • 含义:整体与部分的关系,部分可以独立存在,生命周期不依赖整体。
  • 例子:班级(Class)和学生(Student):班级由学生组成,但学生可以独立存在于其他班级之外。
  • 表示方法:在整体一端使用空心菱形连接部分。
Class ◇------ Student
class Student:
    def __init__(self, name):
        self.name = name

class Classroom:
    def __init__(self, name):
        self.name = name
        self.students = []  # 聚合关系:学生可以属于多个班级

    def add_student(self, student):
        self.students.append(student)

# 示例
bob = Student("Bob")
class1 = Classroom("Class 1")
class1.add_student(bob)
print([s.name for s in class1.students])  # ['Bob']

👉 学生独立存在,即使班级删除,学生仍然存在。


3. 组合(Composition)

  • 含义:has-A关系,整体与部分的关系,但部分的生命周期依赖整体,整体消亡,部分也随之消亡,可以在class包含另一个对象或private继承实现。
  • 例子:公司(Company)和部门(Department):部门属于某个公司,公司不存在,部门也不存在。
  • 表示方法:在整体一端使用实心菱形连接部分。
Company ◆------ Department
class Department:
    def __init__(self, name):
        self.name = name

class Company:
    def __init__(self, name):
        self.name = name
        self.departments = []  # 组合:部门依赖公司存在

    def add_department(self, dept_name):
        dept = Department(dept_name)
        self.departments.append(dept)

# 示例
company = Company("TechCorp")
company.add_department("R&D")
print([d.name for d in company.departments])  # ['R&D']

👉 DepartmentCompany 内部创建,生命周期依赖 Company


4. 继承 / 泛化(Generalization / Inheritance)

  • 含义:is-A关系,表示父类与子类之间的继承关系。子类继承父类的属性和方法,一般通过public继承实现。
  • 例子:动物(Animal)是父类,狗(Dog)和猫(Cat)是子类。
  • 表示方法:子类指向父类,用空心三角形箭头表示。
    Dog ----▷ Animal ◁---- Cat
class Animal:
    def speak(self):
        raise NotImplementedError

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

# 示例
dog = Dog()
cat = Cat()
print(dog.speak(), cat.speak())  # Woof! Meow!

5. 实现(Realization)

  • 含义:类实现接口的关系。
  • 例子:支付接口(PaymentInterface)被支付宝支付(AlipayPayment)类实现。
  • 表示方法:类指向接口,用虚线+空心三角形箭头表示。
    AlipayPayment - - -▷ PaymentInterface
from abc import ABC, abstractmethod

class PaymentInterface(ABC):  # 抽象基类模拟接口
    @abstractmethod
    def pay(self, amount):
        pass

class AlipayPayment(PaymentInterface):
    def pay(self, amount):
        return f"Paid {amount} using Alipay"

# 示例
alipay = AlipayPayment()
print(alipay.pay(100))  # Paid 100 using Alipay

6. 依赖(Dependency)

  • 含义:一个类在实现某个方法时依赖另一个类,但不是强耦合关系。
  • 例子:订单服务(OrderService)依赖于支付类(Payment)来完成下单流程。
  • 表示方法:用虚线箭头,从依赖类指向被依赖类。
    OrderService - - - > Payment
class OrderService:
    def __init__(self, payment: PaymentInterface):
        self.payment = payment

    def create_order(self, amount):
        return self.payment.pay(amount)  # 依赖外部传入的支付方式

# 示例
alipay = AlipayPayment()
order_service = OrderService(alipay)
print(order_service.create_order(200))  # Paid 200 using Alipay

行为图

活动图

用例图

交互图

序列图

通讯图

Image in a image block