Рефакторинг структуры классов, в которой один класс перебирает коллекцию классов и выполняет их методы - PullRequest
0 голосов
/ 18 февраля 2020

Сегодня мне пришлось решить проблему, которая заставила меня написать какой-то ужасный код. Я ищу способы реструктурировать структуру классов в моем коде, чтобы подобные «функции» не добавляли кучу ужасного кода.

Эта часть кода является средством обновления конфигурации, которое отправляет некоторые HTTP-запросы к конечным точкам API для получения обновлений, после чего на основе указанных обновлений обновляйте связанные объекты.

Я использую python, поэтому упрощенный код, описывающий проблему, находится в python

У меня есть структура класса для объектов, которые необходимо обновить:

class AbstractObject:

    def create():
        ...

    def update():
        ...

    def delete():
        ...


class Object1(AbstractObject):
    ...

class Object2(AbstractObject):
    ...

И структура класса для средств обновления:

class Updater:

    api_method = None
    object = None

    def __init__(self):
        self.last_record = None


    def get_updates(self):
        """Receive updates over HTTP and call appropriate methods on self.object
        Save last record id to self.last_record attribute.
        """
        # updates related code and such.



class Object1Updater(Updater)

    api_method = '/object1/'
    object = Object1


class Object2Updater(Updater)

    api_method = '/object2/'
    object = Object2

Также есть класс средства обновления конфигурации, который используется для получать обновления для каждого объекта каждые 30 секунд:

class ConfigUpdater:


    def __init__(self):
        self.updaters = (Object1Updater, Object2Updater)


    def get_updates(self):
        for updater in self.updaters:
            updater.get_updates()

Сегодня мне пришлось реализовать решение, которое установило бы атрибут last_record для Object2Updater, и все последующие средства обновления в цепочке self.updaters, равные None, если по крайней мере 1 create обновление было получено в Object1Updater. И для этого я изменил класс Object1Updater следующим образом:

class Object1Updater(Updater)

    api_method = '/object1/'
    object = Object1
    reset_record = False

    def create(self, *args, **kwargs):
        super().create(*args, **kwargs)  # call Updater.create()
        reset_record = True

И мой класс ConfigUpdater вот так:

class ConfigUpdater:

    ...

    def get_updates(self):
        reset_record = False
        for updater in self.updaters:
            if reset_record:
                updater.last_record = None
            updater.get_updates()
            if getattr(updater, 'reset_record', False):
                reset_record = True

, который работает, но выглядит очень плохо. Есть ли более подходящее решение для такого рода проблем? Я искал общие структурные шаблоны, но не смог найти ни одного, который был бы хорошим решением (хотя я думаю, что это недостаток знаний, и я просто не могу понять, как применять указанные шаблоны)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...