重构两种几乎相同的更改属性的方法

时间:2019-09-27 18:05:46

标签: python refactoring

所以我刚开始在新的代码库中工作,我正在尝试帮助重构某些东西。诸如巨大的方法之类的东西应该分解为大块等等。这种方法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时,每种方法如何使用不同的属性。这使我不知道是否正确的方法是保留这两种方法并仅提取相似的事物。我一直在努力尝试以某种方式使其成为既可以做到又不能做到的方法。

2 个答案:

答案 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)

您可以使用getattrsetattr之类的一些内置函数。

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',还可以灵活地处理其他情况。

相关问题