所以我刚开始在新的代码库中工作,我正在尝试帮助重构某些东西。诸如巨大的方法之类的东西应该分解为大块等等。这种方法A与方法B完全相同,只是差别很小。
让我们说方法A是:
def func_a(data):
# Do some stuff...
obj = get_obj_from(data)
value = 0
# Somewhere inside a loop
for item in items:
value += item.value_a
obj.attribute_a = value
# Do some other stuff...
方法B为:
def func_b(data):
# Do same stuff as func_a()...
obj = get_obj_from(data)
value = 0
count = 0
# Somewhere inside a loop that does the same as in func_a()
for item in items:
value += item.value_b
count += 1
obj.attribute_b = value
avg = value / count
# Do some other stuff just as in func_a()...
请注意,分配给obj时,每种方法如何使用不同的属性。这使我不知道是否正确的方法是保留这两种方法并仅提取相似的事物。我一直在努力尝试以某种方式使其成为既可以做到又不能做到的方法。
答案 0 :(得分:1)
您可以组合使用这两种方法,但是您需要传递一个变量(如标志)来标识流-与a或b一起使用。像下面一样
def func_ab(data, is_a=True):
obj = get_obj_from(data)
value = 0
count = 0
for item in items:
if is_a:
value += item.value_a
else:
value += item.value_b
count += 1
if is_a:
obj.attribute_a = value
else:
obj.attribute_b = value
avg = value / count
is_a
的默认值为True,因此,在为a调用此函数时,可以以func_ab(data)
的形式调用,而在为b func_ab(data, False)
的情况下
希望这会有所帮助!
您可以进一步重构:
def func_ab(data, is_a=True):
obj = get_obj_from(data)
if is_a:
obj.attribute_a = sum([item.value_a for item in items])
else:
obj.attribute_b = sum([item.value_b for item in items])
avg = obj.attribute_b / len(items)
答案 1 :(得分:0)
您可以使用getattr
和setattr
之类的一些内置函数。
def func(data, att_key='a'):
obj = get_obj_from(data)
att_name = f'attribute_{att_key}'
value_name = f'value_{att_key}'
# sets the obj.{att_name} to the sum of the item.{value_name}
setattr(obj, att_name, sum([getattr(item, value_name) for item in items]) )
if att_key == 'b':
avg = obj.attribute_b / len(items)
如果您不仅需要担心'a'
和'b'
,还可以灵活地处理其他情况。