it-swarm.cn

方法vs功能vs程序

这是一个简单的问题,但是我经常听到这三个术语定义得如此残酷,但多年来我知道这些术语的含义有所不同。

“过程”,“方法”,“函数”,“子例程”等的“正确”定义是什么?

113
Django Reinhardt

我在这里有一个不同的答案:实际上,实际上没有区别,除了“方法”通常以OO=)语言引用与对象关联的子例程。

术语“过程,函数,子例程,子程序和方法”实际上都具有相同的含义:较大程序中的可调用子程序。但是很难提出一个定义来捕获这些术语的所有变体用法,因为它们在各种编程语言或范式中使用的不一致。

您可能会说一个函数返回一个值。好吧,以下C函数不会返回值:

void f() { return; }

...但是我怀疑您会发现有人将其称为过程。

当然,在Pascal中,过程不返回值,而函数返回值,但这仅是Pascal设计方式的反映。在Fortran中,一个函数返回一个值,而子例程返回多个值。然而,这些都没有真正允许我们为这些术语提供一个“通用”定义。

实际上,术语“过程编程”是指一类完整的语言,包括C,Fortran和Pascal,其中只有一种实际上使用术语“过程”来表示任何东西。

因此,这些都不是真正一致的。唯一的例外可能是“方法”,它似乎几乎完全用于OO)语言,指的是与对象关联的函数。尽管如此,但这并不总是一致的。 ,例如,通常使用术语“成员函数”而不是方法,(即使术语“方法”已在程序员中逐渐渗透到C++语言中。)

关键是,这些都不是真正一致的。它只是反映了当时流行的任何语言所使用的术语。

109
Charles Salvia

一个function返回一个值,但是procedure不返回值。

method类似于函数,但是 内部的 课程的一部分。术语方法几乎专门用于面向对象的编程中。

69
Bruce Alderman

function是需要一堆输入并返回一个或多个值的东西。如果返回的值完全由输入确定,并且该函数没有任何副作用(可能记录日志,或者导致其自身外部发生状态更改),则该函数称为纯函数。

过程是不返回值的函数。特别是,这意味着一个过程只能引起副作用。 (这可能包括更改输入参数!)

方法是关闭一组变量的函数,即closure。它接受零个或多个输入参数,可以访问此变量集,并返回零个或多个值。在OO)语言中,这些方法附加到对象或类。

在大多数主流OO)语言中,那些封闭的变量称为对象的成员字段或实例变量。方法可以是纯函数,不纯函数或过程。

后一个定义导致object = struct + closures对应关系。

53
Frank Shearar

布鲁斯有一个 好答案 。我会在语义上添加:

  • 过程应该对参数“做某事”或引起其他副作用(例如printf
  • 函数应(a)回答有关参数的问题,或(b)根据参数计算新值
  • 函数方法应回答有关对象状态的问题
  • 过程方法应更改对象的状态
14
Scott Whitlock

上面有很好的详细答案;简短的故事是,它们将具有所有子程序风格;每个术语的含义将根据编程语言的上下文而变化

通常,函数返回一个值,但是它们不必

方法是通用的OOP条款目前

在SQL中,存储过程具有输出,但通常仅返回错误代码,而用户定义的函数必须返回值(可能是结果集)

同样,这些术语之间的确切区别取决于您正在和谁说话!

4
Steven A. Lowe

80%的熟练程度与对术语的熟悉程度直接相关,

95%的生产力是能够识别当前有用的东西的能力,尽管用术语来形容它

我非常喜欢用c#来调用它们的所有方法,除了使用MSSQL时我们使用sproc的时候,但是当然现在我们使用Postgres,它们被称为函数。

2
MvcCmsJon