OOP中有这些术语的官方定义吗?还是它们只是随着时间的推移而演变,根据你以前受过的计算机科学教育(甚至你的年龄),你会使用其中一种?
到目前为止,我发现了方法与函数的良好定义:
方法和函数之间的区别
函数是一段按名称调用的代码。…传递给函数的所有数据都是显式传递的。
方法是由关联的名称调用的一段代码使用对象。
函数与程序:
";函数";和一个";程序";?
函数返回一个值,过程只执行命令。
过程是一组可以按顺序执行的命令。
在大多数编程语言中,即使函数也可以有一组命令。因此,区别仅在于返回值部分。
即使作者的定义有细微的差异,主要方面似乎是:方法总是对对象进行操作,而函数则通过其参数将所有数据传递给它。如果函数没有返回值,则称为过程。
但是子程序,尤其是操作是如何与这些术语联系在一起的?
编辑:由于这似乎太宽泛了,这里有一个缩小范围的尝试:方法、程序和功能从我以前的研究中非常清楚。子程序也不再那么含糊了。
所以问题是:在计算机科学领域,什么是操作?
以下是我的理解。请注意,这些都是"软"定义——其中任何一个都没有官方定义,因此确切含义可能因语言而异。(例如,Java和C#中的"静态方法"不符合我对"方法"的定义,除非你认为类是对象)
-
子例程是"可以随时调用的一些代码"。它实际上是一个被其他例程调用的例程(因此是一个子例程)。"子程序"one_answers"例程"似乎是相当古老的术语。
想想BASIC的GOSUB指令:(别介意BASIC是一种糟糕的语言)
10 PRINT "Hello" 20 GOSUB 100 30 PRINT "Goodbye" 40 GOSUB 100 50 END 100 PRINT "World" 110 RETURN
此打印:
Hello World Goodbye World
在Visual Basic中,子程序或
Sub
是一个不返回任何内容的函数。 -
过程与子程序是一样的,但不那么过时。
过程也可以指不返回任何内容的函数。
-
函数类似于一个过程,但它可以接受参数并返回值,而不仅仅是一个命令列表。您应该熟悉许多语言中的函数,但这里有一个C++示例:
#include <iostream> using namespace std; int calculate(int a, int b) { return a + b - 2; } int main() { cout << calculate(5, 2) << endl; cout << calculate(100, 20) << endl; int i = calculate(5, 1); for(int k = 0; k < i; k++) // repeat the next line i times cout << "Hello" << endl; }
此打印:
5 118 Hello Hello Hello Hello
请注意,函数
calculate
本身并不进行打印,而是返回一个数字,main
可以选择打印该数字或使用该数字进行其他操作。对calculate
的第三次调用返回2,但2没有打印出来——相反,它决定了打印"Hello"的次数。一个没有参数、不返回任何结果的函数相当于一个过程(或子例程)。
-
方法是一个可以在对象上调用的函数。您可能熟悉Java或C#中的非静态方法。方法可以访问其调用对象的状态(称为接收器)。
与函数不同,方法在接收器的类型上通常是多态的-在进行方法调用时,无法直接查看将运行哪个命令序列。
Java中方法的一个简单示例,演示多态性:
class Car { int getNumberOfWheels() {return 4;} void printNumberOfWheels() { System.out.println(getNumberOfWheels()); } } class HondaCivic extends Car { // no code here } class ReliantRobin extends Car { int getNumberOfWheels() {return 3;} } class Main { public static void main(String[] args) { Car h = new HondaCivic(); Car r = new ReliantRobin(); h.printNumberOfWheels(); r.printNumberOfWheels(); } }
此打印:
4 3
即使您可能认为
printNumberOfWheels
总是打印4-子类可以"拦截"getNumberOfWheels
方法调用。