logo
OOD Interview Questions

设计 Online Chat

Online Chat 的面向对象设计示例

这份 notebook 由 Donne Martin 准备。Source 和 license info 在 GitHub

设计 Online Chat

Constraints & assumptions

  • 只聚焦以下 workflows:
    • Text conversations only
    • 用户:
      • Add / Remove / Update user
      • Add friend request → approve / reject
      • Remove friend
    • Group chat:create / invite / post message
    • Private 1-1 chat:invite / post message
  • 暂时不考虑 scaling

Solution

设计目标是把用户关系聊天房间消息拆清楚,便于扩展到 group / private chat。

核心对象

  • UserService:用户管理、好友请求处理
  • User:包含 friend list、private chats、group chats
  • Chat(abstract):chat_id + users + messages
  • PrivateChat:1-1 chat
  • GroupChat:多人 chat,可 add/remove users
  • Message:消息体 + timestamp
  • AddRequest:好友请求 + status
  • RequestStatus:UNREAD / READ / ACCEPTED / REJECTED

主要流程

  • Add user:写入 users_by_id
  • Friend request:创建 AddRequest,写入 sender/receiver 的 request map
  • Approve:把双方加入 friend list,并创建/绑定 private chat
  • Group chat:创建 GroupChat,邀请朋友加入,发消息追加到 messages list

Class 设计(示例)

class UserService(object):
    def __init__(self):
        self.users_by_id = {}

    def add_user(self, user_id, name, pass_hash):
        pass

    def add_friend_request(self, from_user_id, to_user_id):
        pass

    def approve_friend_request(self, from_user_id, to_user_id):
        pass

class User(object):
    def __init__(self, user_id, name, pass_hash):
        self.user_id = user_id
        self.name = name
        self.pass_hash = pass_hash
        self.friends_by_id = {}
        self.friend_ids_to_private_chats = {}
        self.group_chats_by_id = {}
        self.received_friend_requests_by_friend_id = {}
        self.sent_friend_requests_by_friend_id = {}

    def message_user(self, friend_id, message):
        pass

    def message_group(self, group_id, message):
        pass

class Chat(metaclass=ABCMeta):
    def __init__(self, chat_id):
        self.chat_id = chat_id
        self.users = []
        self.messages = []

class PrivateChat(Chat):
    def __init__(self, first_user, second_user):
        super(PrivateChat, self).__init__()
        self.users.append(first_user)
        self.users.append(second_user)

class GroupChat(Chat):
    def add_user(self, user):
        pass

    def remove_user(self, user):
        pass

class Message(object):
    def __init__(self, message_id, message, timestamp):
        self.message_id = message_id
        self.message = message
        self.timestamp = timestamp

class AddRequest(object):
    def __init__(self, from_user_id, to_user_id, request_status, timestamp):
        self.from_user_id = from_user_id
        self.to_user_id = to_user_id
        self.request_status = request_status
        self.timestamp = timestamp

可以扩展的点

  • Message delivery:ack / retry / offline queue
  • Presence:online/offline 状态
  • Typing indicator:临时状态更新
  • Search:message search + indexing
  • Moderation:content filtering

参考与下载

Python 下载 Python 源码

相关练习题

设计 Online Chat

暂无相关练习题