python - 重构两个几乎相同的方法来改变不同的属性
问题描述
所以我刚开始在一个新的代码库中工作,我正在尝试帮助重构一些东西。有些东西应该被分割成块等巨大的方法。有一种方法 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 时,每个方法使用不同的属性。这让我不知道是否正确的做法是保留这两种方法并只提取相似的东西。我一直在努力以某种方式将其变成可以同时做到但不能完全做到的方法。
解决方案
您可以结合使用这两种方法,但您需要传递一个变量(如标志)来识别流程 - 与 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)
推荐阅读
- android - Android:静默更新应用程序的所有方式
- java - 使用 NetSuite SOAP API 以编程方式编辑供应商账单的批准状态
- javascript - 过滤映射后如何在对象中创建数组?
- asp.net-core - 使用 MEL ILogger 时如何解构动态
作为门面? - jquery - 如何在jquery中编写泛型方法
- angular - 使用 FormArray 动态添加 FormControl 也会提交我的表单
- python - 查找数据框中每一行的出现次数
- node.js - Prisma createCart 函数无法在查询字段上返回 userId
- regex - 如何拆分日文字符的字符串?
- python - 尝试使用 pip 下载 flask-ask 但由于不兼容而收到一些错误?这个问题有替代方案吗?