Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组合对象的设计模式_Python_Design Patterns_Refactoring - Fatal编程技术网

Python 组合对象的设计模式

Python 组合对象的设计模式,python,design-patterns,refactoring,Python,Design Patterns,Refactoring,我有一个非常丑陋的函数,我想重构它。 从示意图上看,该函数接受2个对象,访问多个 这些对象上的属性和方法,组合它们并使用它们和 组合结果以实例化结果对象 看起来是这样的: def ugly(obj_a, obj_b): a_1 = obj_a.a_1 sub_a_1 = obj_a.get_sub() r_1 = obj_b.combine(a_1) if r_1 < 0: raise ValueError if not sub_a_1

我有一个非常丑陋的函数,我想重构它。 从示意图上看,该函数接受2个对象,访问多个 这些对象上的属性和方法,组合它们并使用它们和 组合结果以实例化结果对象

看起来是这样的:

def ugly(obj_a, obj_b):
    a_1 = obj_a.a_1
    sub_a_1 = obj_a.get_sub()
    r_1 = obj_b.combine(a_1)
    if r_1 < 0:
       raise ValueError
    if not sub_a_1.validate():
       raise Exception
    return ResultObj(a_1, r_1, sub_a_1.get_matrix(), obj_b.some_other_attribute)
def丑陋(obj_a,obj_b):
a_1=对象a.a_1
sub_a_1=obj_a.get_sub()
r_1=目标联合收割机(a_1)
如果r_1<0:
升值误差
如果不是sub_a_1.validate():
引发异常
返回ResultObj(a_1,r_1,sub_a_1.get_matrix(),obj_b.some_other_属性)
除了在这两个服务器上都可以访问许多属性和方法之外 对象和许多传递给ResultObj的构造函数值

此功能对于单元/集成测试来说是一场噩梦。就目前而言,我 必须模仿obj_a和obj_b及其所有方法和 属性

对于重构这类代码,您有什么建议?理想的我 不必改变obj_a和obj_b的实现方式

这是在Python中实现的,因此OO和函数式ish设计都可以工作。

谢谢

使此类过程代码更易于测试的一种方法是添加“接缝”,即将代码拆分为可以单独运行的单元。抽象地回答您的问题很难,因为没有实际的代码,很难看到逻辑接缝

您可以返回ResultObj的参数列表,而不是直接创建一个。这允许您测试流程,而不是测试ResultObj。而且事后做
ResultObj(*args)
也很容易。但是,您仍然要处理很多价值观

可能您可以使用单独的函数分别访问和验证来自A和B的数据,然后返回由第三个函数组合的简单“平面”数据结构(例如namedtuple)

除此之外,重构类本身对我来说最有意义,尽管你说你宁愿避免。如果创建A和B对象没有副作用或太多其他依赖项,这会有所帮助,但这取决于您的特定代码

也认为“两个对象合并为一个巨型对象”本质上是一个集成测试用例而不是单元测试用例。