从良好的代码设计角度来看,算法和数据对象应该如何交互?

时间:2017-04-23 21:05:15

标签: python oop procedural-programming

我在Python中为我的数据创建了一些数据对象。现在,我需要编写一些处理这些数据的算法。我正在讨论将算法编写为:

(1)Data对象的方法。 (2)在单独的模块中的功能。 (3)算法对象。

我注意到在numpy中,一些算法(例如min,max,sum等)被实现为numpy数组对象的方法,而其他更复杂的算法(例如svd)被实现为函数(在单独的模块中)叫做numpy.linalg)。我还注意到有些人将算法实现为对象,它们对数据对象起作用(在前面的例子中,linalg很可能是一个带有svd方法的类)。

我在这里有一个例子来澄清我的问题。假设我的数据对象名为 sample ,我的算法名为 rasam

我可以将 rasam 作为示例对象的一种方法来实现,然后将其作为

进行访问
this_sample = sample()
this_sample.rasam(rasam_args)

this_sample = sample()
rasam(this_sample,rasam_args)

this_sample = sample()
this_rasam  = rasam(rasam_args)
this_rasam.run(this_sample)

以上哪个选项被视为代码优秀设计? 作为后续,为什么SVD算法实现为一个函数,其中SUM实现为numpy数组对象的方法?

我发现这个链接在一般的"函数与方法"中解决了这个问题。观点,但我对数据对象和算法的特定上下文更感兴趣。

In Python, when should I use a function instead of a method?

1 个答案:

答案 0 :(得分:0)

这些问题没有真正的正确答案,答案始终是"它取决于。"就个人而言,在这种情况下,我会同时使用选项1或2.不确切知道您的数据确实很难说,但基本上您要考虑的主要问题是代码重用。

数据对象彼此有何不同?你的算法可以是一个适合所有解决方案吗?如果是这样,那么您可能希望在单独的模块中使它们成为函数。

Numpy实际上遵循选项1和2(据我所知)。虽然numpy数组对象确实有一个sum函数,但还有一个顶级numpy.sum函数,它在其他numpy数据结构(如矩阵)的轴上运行。

我不是一个笨拙的开发者,但我猜他们给numpy数组提供自己sum的实现的原因只是为最终用户创建一个更好的api。

话虽这么说,我认为只要在单独的模块中将算法创建为自己的功能,就不会出错。如果您的数据结构确实需要自己实现相同的算法,那么您可以将该方法添加到该数据结构的类中。