菜单

在线聊天

相关源文件

目的与范围

本文档描述了一个在线聊天系统的面向对象设计,重点关注其核心组件和功能。该系统支持用户之间的文本聊天,包括私聊和群聊。它还处理用户管理和好友关系。

本设计旨在实现初始功能,暂不考虑扩展性,重点关注支持基本聊天功能所需的基础架构和类。

来源: solutions/object_oriented_design/online_chat/online_chat.ipynb21-40

系统概览

在线聊天系统围绕几个关键组件设计,这些组件协同工作以提供消息传递功能

  1. 用户管理: 处理用户账户和关系
  2. 聊天系统: 管理不同类型的聊天会话
  3. 消息传递: 处理和存储消息
  4. 好友请求系统: 处理用户之间连接的创建和管理

系统架构图

来源: solutions/object_oriented_design/online_chat/online_chat.py5-105

核心组件

用户管理

用户管理组件由 UserServiceUser 类组成

UserService

UserService 类作为系统中所有用户的中心注册表,提供管理用户及其关系的方法。

主要职责

  • 存储和检索用户信息
  • 处理用户创建和删除
  • 处理用户之间的好友请求

来源: solutions/object_oriented_design/online_chat/online_chat.py5-24

用户

User 类代表系统中的单个用户,维护其个人资料信息以及与其他用户和聊天的关系。

关键属性

  • 基本用户信息(ID、名称、密码哈希)
  • 好友关系
  • 私聊和群聊成员资格
  • 好友请求(已发送和已接收)

关键方法

  • 向用户和群组发送消息
  • 管理好友请求

来源: solutions/object_oriented_design/online_chat/online_chat.py26-55

聊天系统

聊天系统围绕一个抽象基类 Chat 和两个具体实现:PrivateChatGroupChat 构建。

Chat(抽象基类)

Chat 类作为所有类型聊天会话的基础,定义了共同属性

  • 聊天ID
  • 参与用户列表
  • 聊天记录(消息)

来源: solutions/object_oriented_design/online_chat/online_chat.py57-63

PrivateChat

PrivateChat 类代表两个用户之间的点对点对话。

主要功能

  • 仅由两个用户初始化
  • 继承自基础 Chat 类的消息传递功能

来源: solutions/object_oriented_design/online_chat/online_chat.py65-71

GroupChat

GroupChat 类代表可以有任意数量参与者的多用户对话。

主要功能

  • 支持添加和删除用户
  • 继承自基础 Chat 类的消息传递功能

来源: solutions/object_oriented_design/online_chat/online_chat.py73-80

消息传递

Message 类代表聊天中的单个文本消息。

关键属性

  • 消息ID
  • 消息内容
  • 时间戳

来源: solutions/object_oriented_design/online_chat/online_chat.py82-88

好友请求系统

好友请求系统管理用户之间好友连接的创建和处理。

AddRequest

AddRequest 类代表一个用户向另一个用户发送的好友请求。

关键属性

  • 发送者和接收者用户ID
  • 请求状态
  • 时间戳

来源: solutions/object_oriented_design/online_chat/online_chat.py90-97

RequestStatus

RequestStatus 枚举定义了好友请求的可能状态

  • UNREAD (0): 请求已发送但尚未被查看
  • READ (1): 请求已被查看但尚未处理
  • ACCEPTED (2): 请求已被批准
  • REJECTED (3): 请求已被拒绝

来源: solutions/object_oriented_design/online_chat/online_chat.py99-104

关键工作流程

好友请求工作流程

此工作流程说明了好友请求从创建到批准/拒绝的生命周期。

此工作流程的实现分布在 UserServiceUser 类中的方法中

  1. 用户通过 User.send_friend_request() 发起好友请求
  2. 接收者通过 User.receive_friend_request() 接收请求
  3. 接收者可以通过 User.approve_friend_request()User.reject_friend_request() 批准或拒绝
  4. UserService 通过其自身的好友请求方法维护用户之间的一致性

来源: solutions/object_oriented_design/online_chat/online_chat.py16-23 solutions/object_oriented_design/online_chat/online_chat.py44-54

消息传递工作流程

此序列图显示了在私聊中发送消息的过程。

消息传递功能通过以下方式实现

  • 用于私聊消息的 User.message_user()
  • 用于群组消息的 User.message_group()
  • 用于存储和管理消息的 Chat 类层次结构

来源: solutions/object_oriented_design/online_chat/online_chat.py38-42 solutions/object_oriented_design/online_chat/online_chat.py57-80

数据结构

系统使用各种数据结构来维护实体之间的关系

用户服务数据结构

UserService 使用字典来跟踪所有用户

  • users_by_id: 将用户ID映射到 User 对象
UserService
└── users_by_id (dict)
    ├── user_id_1 → User object 1
    ├── user_id_2 → User object 2
    └── ...

来源: solutions/object_oriented_design/online_chat/online_chat.py7-8

用户数据结构

每个 User 对象维护多个字典以跟踪关系

User
├── user_id
├── name
├── pass_hash
├── friends_by_id (dict): Maps friend IDs to User objects
├── friend_ids_to_private_chats (dict): Maps friend IDs to PrivateChat objects
├── group_chats_by_id (dict): Maps group chat IDs to GroupChat objects
├── received_friend_requests_by_friend_id (dict): Maps IDs to AddRequest objects
└── sent_friend_requests_by_friend_id (dict): Maps IDs to AddRequest objects

来源: solutions/object_oriented_design/online_chat/online_chat.py28-36

聊天数据结构

聊天对象(包括私聊和群聊)存储参与者和消息的信息

Chat (abstract)
├── chat_id
├── users (list): Contains User objects
└── messages (list): Contains Message objects

来源: solutions/object_oriented_design/online_chat/online_chat.py59-62

设计考量和限制

当前设计侧重于在线聊天系统的核心功能,不涉及扩展性问题。一些关键设计考量包括

  1. 以用户为中心的设计: 系统以用户为主要实体进行设计,其他实体(聊天、消息)与用户关联。

  2. 灵活的聊天类型: 抽象的 Chat 类允许不同类型的对话,同时共享共同的功能。

  3. 好友请求工作流程: 系统包含一个完整的好友请求生命周期,具有多种状态。

  4. 基于内存的存储: 当前实现使用 Python 字典和列表将所有数据存储在内存中,这适用于小规模使用,但需要针对生产系统进行调整。

  5. 有限的范围: 该设计仅侧重于文本消息传递,不包括媒体共享、已读回执或打字指示器等功能。

来源: solutions/object_oriented_design/online_chat/online_chat.ipynb21-40

未来增强

虽然当前设计为基本的聊天系统提供了坚实的基础,但未来迭代可以考虑进行多项增强

  1. 持久化: 添加数据库集成以持久存储用户、聊天和消息。

  2. 实时通信: 实现发布/订阅机制以实现实时消息传递。

  3. 通知: 添加对新消息或好友请求通知用户的支持。

  4. 媒体支持: 扩展 Message 类以支持除文本之外的不同类型内容。

  5. 扩展性考量: 解决处理大量用户和消息的扩展性问题。

  6. 安全性: 增强安全功能,包括消息的正确加密和身份验证机制。