首页 > 解决方案 > 重构两个几乎相同的方法来改变不同的属性

问题描述

所以我刚开始在一个新的代码库中工作,我正在尝试帮助重构一些东西。有些东西应该被分割成块等巨大的方法。有一种方法 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 时,每个方法使用不同的属性。这让我不知道是否正确的做法是保留这两种方法并只提取相似的东西。我一直在努力以某种方式将其变成可以同时做到但不能完全做到的方法。

标签: pythonrefactoring

解决方案


您可以结合使用这两种方法,但您需要传递一个变量(如标志)来识别流程 - 与 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 调用此函数时,您可以调用 asfunc_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)


推荐阅读