Сегодня мне пришлось решить проблему, которая заставила меня написать какой-то ужасный код. Я ищу способы реструктурировать структуру классов в моем коде, чтобы подобные «функции» не добавляли кучу ужасного кода.
Эта часть кода является средством обновления конфигурации, которое отправляет некоторые 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
, который работает, но выглядит очень плохо. Есть ли более подходящее решение для такого рода проблем? Я искал общие структурные шаблоны, но не смог найти ни одного, который был бы хорошим решением (хотя я думаю, что это недостаток знаний, и я просто не могу понять, как применять указанные шаблоны)