Как я должен рефакторинг / редизайн моего кода - PullRequest
1 голос
/ 10 сентября 2011

Я пишу игру на Python и ищу несколько советов о том, как изменить мой код. Ниже приведено определение компонента движения для игрового объекта.

Функция загрузки принимает объект PropertyTree и устанавливает атрибуты self соответственно. Функция сохранения работает наоборот: на основе атрибутов self генерируется и возвращается PropertyTree.

class Movement(EntityComponent):
    def __init__(self):
        # Default values
        self.speed = 0
        self.acceleration = 0

    def load(self, properties):
        self.speed = int(properties['Speed'])
        self.acceleration = int(properties['Acceleration'])

    def save(self):
        pt = PropertyTree()
        pt['Speed'] = str(self.speed)
        pt['Acceleration'] = str(self.acceleration)
        return pt

Проблема с кодом в том, что происходит много дублирования информации. Сначала я дублирую информацию, которая связывает ключи в PropertyTree с атрибутами self, а также дублирую сами ключи (строки 'Speed' и 'Acceleration' появляются дважды). Очевидно, есть много места для ошибок.

Как я могу сделать рефакторинг?

1 Ответ

1 голос
/ 10 сентября 2011

В качестве отправной точки:

class Movement(EntityComponent):
    def __init__(self):
        # Default values
        self.speed = 0
        self.acceleration = 0

    serializable_fields = [
        ('speed', int),
        ('acceleration', int)
    ]

def load(object, source):
    for name, field_type in object.serialiable_fields: 
        settarr(object, name, field_type(source[name]))

def save(object):
    target = PropertyTree()
    for name, field_type in object.serializable_fields:
         target[name] = str(getattr(object, name))
    return target

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

Если вы не знакомы с ним, вы также можете проверить, как работает модуль Python для pickle.Я не рекомендую использовать его для чего-то кроме тривиальных случаев, но это может дать вам некоторые идеи.

...