我正在用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'
字符串出现两次)。显然,存在很多错误的余地。
我该如何重构这个?
答案 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模块的工作原理。我不建议将它用于任何超出微不足道的情况,但它可能会给你一些想法。