哪个是“更好”的做法?在Python中传递对象引用或对象方法引用

时间:2011-01-09 19:25:15

标签: python oop functional-programming loose-coupling cohesion

我正在用Python编写一小段代码,很好奇其他人对此的看法。

我有几个类,每个类都有一些方法,我试图确定什么是“更好”:通过方法调用传递对象,或者当只需要一个对象的方法时通过方法调用传递方法。基本上,我应该这样做:

def do_something(self, x, y, manipulator):
    self.my_value = manipulator.process(x, y)

或者

def do_the_same_thing_but_differently(self, x, y, manipulation):
    self.my_value = manipulation(x, y)

我看到它的方式,第二个可以说是“更好”,因为它促进了操纵和其他类之间更松散的耦合/更强的凝聚力。我很想看到一些支持和反对这种方法的论据,因为当一个对象只需要一个方法时。

编辑:我删除了OOP措辞,因为它显然令人沮丧。我主要指的是松耦合和高凝聚力。

3 个答案:

答案 0 :(得分:4)

第二种解决方案可能提供更松散的耦合,因为它更“功能”,而不是更多“OOP”。第一个解决方案的优点是它可以在没有闭包的C ++这样的语言中工作(尽管可以使用模板和指向成员函数的指针获得类似的效果);但在像Python这样的语言中,恕我直言,第二种选择似乎更“自然”。

编辑:您可以在免费书籍“Higher order Perl”中找到关于“功能与面向对象”技术的非常好的讨论,可在此处获取:

http://hop.perl.plover.com/

(参见第1章第6部分)。虽然它是一本Perl(而不是Python)书,但这里的讨论完全符合这里提出的问题,并且那里描述的功能技术可以类似的方式应用于Python。

答案 1 :(得分:1)

我会说第二种方法;因为它看起来像callback,它们在使用Hollywood principle时非常常用(不要打电话给我们,我们会打电话给你),这是一个有助于开发具有高内聚力的代码的范例。低耦合[参考2]。

答案 2 :(得分:0)

我肯定会采用第二种方法。

还要考虑您可以更改任何Manipulator类的接口,以便process拼写为__call__,然后它将与第二种方法透明地工作。