一般程序设计语言包含两种基本的抽象:过程抽象数据抽象。过程抽象有时也称控制抽象子程序是最主要过程抽象机制。

面向对象语言中的方法与子程序的概念十分相似,不同在于它们的调用以及它们与类或对象关联的方式。

一、子程序的特征

1,每个子程序只有一个入口。

2,在执行期间,调用程序单位被停止执行,即任意时刻只有一个子程序在执行。

3,子程序执行完毕后,总是将控制返回给调用程序。

注:协同程序并发程序 的特征与子程序不同。

二、两种类型的子程序

子程序分为两种类型:过程 和 函数。

过程 是定义参数化技术的语句系列,通过单个调用语句来启动这些计算。过程实际上是定义了新的语句。在Ada中将过程称为procedures,但在Fortran中则将过程称为subroutines

函数 在结构上模仿了过程,但在语义上却模仿了数学中的函数。如果它是一个纯函数,就不会有副作用

注:某些编程语义同时提供了过程和函数,如Fortain和Ada;某些如基于C的语言则只有函数。但C中函数的行为却与过程相似,也可以定义这些函数不返回任何值,只要将它们的返回类型定义为void。Java/C++/C#类似。

三、子程序的首部定义

1,说明它是关于某个特殊类型子程序的定义(部分语言同时包括过程和函数)。子程序的类型通常由特殊字指定。

2,首部给子程序提供了一个名字

3,首部可以说明一系列参数(可选)

例如定义一个sum的子程序

Fortran

Subroutine sum(parameters)

Ada

procedure sum(parameters)

Python

def sum(parameters)

C/C++/Java

int sum(parameters)

JavaScript

function sum(parameters)

Ruby/JavaScript的函数与以上存在着一些有趣的不同之处。既可以在类定义时定义,也可以在类外定义。在类外定义的被认为是调用对象或根对象的方法。Ruby中如果return语句后没有表达式则返回nil,JavaScript中如果没有return则返回undefined。

四、参数

子程序通常描述的是计算,它通过两种方式来处理数据:

1、通过对非局部变量的直接访问

2、通过参数传递

前面已经提到过,纯函数只通过参数传递来计算。非纯函数是有 副作用 的。参数又分为形参和实参。

形参:子程序首部中定义的参数称为形参,又被称为 虚变量。因为它不是平常意义的变量,只有当子程序调用时它们才与存储空间 绑定

实参:子程序调用语句包括子程序的名称及一组将子程序的形参绑定的参数,这些参数称为实参。

多数语言的实参与形参的绑定(关联) 是按位置进行的。即第一个实参对应于第一个形参,第二个实参对应于第二个形参。依次类推。如JavaScript代码

function sum(a, b) {
	return a + b;
}
sum(3, 5);

函数sum定义了两个形参a, b。调用时对应的实参是3, 5。

使用位置将实参与形参关联起来是是十分有效且安全的方式。但当参数很多时(形参列表很长比如有10个以上参数),程序员很容易在调用子程序时在实参的次序上犯错。因此,有些语言中推出了解决方法称为关键字参数。

关键字参数 的意义是将形参名称与实参在一起声明。即在声明时就与实参一一对应了,它的好处是能以任何顺序出现在实参表中。如Python代码

def sum(len = myLen,
	list = myList,
	result = myResult)

在函数定义时就将参数与变量一一对应。使用关键字参数的缺点是子程序的必须知道形参的名称。

参数默认值 在Python、Ruby、C++、Fortran 95、Ada和PHP中,形参可以有默认值。如果没有将实参传递给子程序的形参,那么将使用默认值。如Python

def show(a = 5):
    print (a)

show()

定义函数show时形参a具有默认值5,调用show时如果没有传实参,那么默认打印出5。

:Javascript之父Brendan Eich准备给该语言添加该项特性。Javascript中函数的定义有可能是如下形式:

function fun(x=5,y=10){
                       
}

在多数语言中形参不具备默认值,调用时实参个数必须和形参匹配一致。但在C、C++、Perl和JavaScript中,则没有该项要求。虽然允许参数数目不同的设计容易引起错误,但有时也是很灵活方便的。例如C的printf函数就以打印任何数目的项。JavaScript也可以根据参数数目不同模拟函数的重载。

相关:

javascript-ecmascript-harmony-spidermonkey-spidernode-v8-v8monkey-nodejs-nodeconf/

javascript-ecmascript-harmony-coffeescript/

作者: snandy 发表于 2011-08-29 14:58 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"