2

我正在用 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 措辞,因为它显然令人不安。我主要指的是松散耦合和高内聚。

4

3 回答 3

4

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

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

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

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

于 2011-01-09T19:36:05.007 回答
1

我会说第二种方法;因为它看起来像一个回调,它们在使用好莱坞原则时非常常用(不要打电话给我们,我们会打电话给你),这是一种有助于开发高内聚和低耦合代码的范式 [参考2 ]。

于 2011-01-09T19:43:45.063 回答
0

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

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

于 2011-01-09T21:09:28.710 回答