我正在用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措辞,因为它显然令人沮丧。我主要指的是松耦合和高凝聚力。
答案 0 :(得分:4)
第二种解决方案可能提供更松散的耦合,因为它更“功能”,而不是更多“OOP”。第一个解决方案的优点是它可以在没有闭包的C ++这样的语言中工作(尽管可以使用模板和指向成员函数的指针获得类似的效果);但在像Python这样的语言中,恕我直言,第二种选择似乎更“自然”。
编辑:您可以在免费书籍“Higher order Perl”中找到关于“功能与面向对象”技术的非常好的讨论,可在此处获取:(参见第1章第6部分)。虽然它是一本Perl(而不是Python)书,但这里的讨论完全符合这里提出的问题,并且那里描述的功能技术可以类似的方式应用于Python。
答案 1 :(得分:1)
我会说第二种方法;因为它看起来像callback,它们在使用Hollywood principle时非常常用(不要打电话给我们,我们会打电话给你),这是一个有助于开发具有高内聚力的代码的范例。低耦合[参考2]。
答案 2 :(得分:0)
我肯定会采用第二种方法。
还要考虑您可以更改任何Manipulator类的接口,以便process
拼写为__call__
,然后它将与第二种方法透明地工作。