vldmrmlkv
@vldmrmlkv
experienced internet user

Python ООП. Как правильно реализовать хранение сообщений в мессенджере?

Это учебная задача, не реальное приложение, но хочется думать шире и понимать как всё-таки должно быть правильно в реальном приложении. Прошу с этим помочь.

Допустим есть мессенджер, есть два класса - для сообщений( каждое сообщение это объект класса) и для обработки сообщений. Где, как и почему должны храниться сообщения? Или в данном случае это очень упрощённый вариант и хранение должно быть только в базе данных на сервере? Но, допустим, может же быть какой-то кэш для локального хранения на стороне клиента...как это должно быть реализовано?

Код:
import time

class Messenger:
    def __init__(self):
        self.msg_list = {} #хранения сообщений, {timestamp: Message()}

    def add_message(self, msg):
        self.msg_list[msg.msg_timestamp] = msg

    def remove_message(self, msg):
        self.msg_list.pop(msg.msg_timestamp)

    def set_like(self, msg):
        obj = self.msg_list[msg.msg_timestamp]
        if obj:
            obj.fl_like = True
        else:
            raise ValueError('This message does not exist')

    def set_dislike(self, msg):
        obj = self.msg_list[msg.msg_timestamp]
        if obj:
            obj.fl_like = False
        else:
            raise ValueError('This message does not exist')

    def show_last_message(self, num):
        print(list(list(self.msg_list.values())[-num:]))

    def total_messages(self):
        print(len(self.msg_list))

# объект сообщения
class Message:
    def __init__(self, text):
        self.text = text
        self.fl_like = False
        self.msg_timestamp = time.time()

#пример использования
message = Message("Всем привет!")
tg = Messenger()
tg.add_message(message)
tg.add_message(Message("Как дела?"))
tg.set_like(message)
tg.remove_message(message)


Вариант кода 2(сократил). Самый не понятный для меня вариант - хранить в самом классе, предполагается, что это и есть верный вариант, но это как то странно - хранить внутри класса, а не в объекте класса какие-то данные...

class Messenger:
    msg_list = {} #????

    @classmethod
    def add_message(cls, msg):
        cls.msg_list[msg.msg_timestamp] = msg

#здесь был остальной код

#пример использования
message = Message("Всем привет!")
Messenger.add_message(message)
  • Вопрос задан
  • 350 просмотров
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Если вы хотите построить хорошую архитектуру, то должны проектировать ПО исходя из best practice (классика по типу SOLID, DRY и т.д.) В данном случае мне не очень понятно за что отвечает класс Messager. Если это обобщенный класс одной беседы, то тогда логичным было бы хранить данные о собеседниках и сообщениях в объекте данного класса (если вы предполагаете наличие больше, чем одной беседы).
Также, если вы хотите усложнить приложение, то логичным выглядит создание классов-интерфейсов (для обмена сообщениями, т.е. отправкой, сохранением, работой с базой данных). Вот паттерны, которые могут быть полезны в случае задачи именно с кешированием базы данных (proxy, chain of responsibility).

В самом простом случае, вы действительно можете создать основной класс меседжера и хранить лист из объектов класса беседы, в которых есть листы объектов класса сообщения.

Вариант сохранения данных в классе (вместо объекта класса) заставляет задать вопрос (особенно, если задачка учебная) о возможности создания двух объектов данного класса и целесообразности этого. В случае же, если объект данного класса будет лишь 1 (aka паттерн singleton), то нет необходимости хранить данные в классе, это будет даже вредно, поскольку без самого объекта эти данные не имеют смысла.
P.S. Я никакой не эксперт в архитектуре, это лишь мое видение и чуточка опыта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы