我应该如何重构/重新设计我的代码

时间:2011-09-10 19:38:40

标签: python refactoring duplicate-removal

我正在用Python编写游戏,我正在寻找有关如何重新设计代码的一些建议。以下是游戏实体的运动组件的定义。

load函数接受PropertyTree对象并相应地设置self的属性。 save函数则相反:根据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 个答案:

答案 0 :(得分:1)

作为一个起点:

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模块的工作原理。我不建议将它用于任何超出微不足道的情况,但它可能会给你一些想法。