编程功能的基本单位。你建立你的程序一个函数(或方法)。最小的东西您可以测试在单元测试是一个函数。也是最小的一个函数的代码名称,因此可以创建一个新的抽象。函数的目的是封装一些代码并使其可用于其他程序或其他程序库。
函数签名包含函数名,参数,并在一些语言中,返回类型。有几个等其他元素,这些元素可能存在异常规范和各种限定符(尤其是对类方法)。不是所有的编程语言都支持所有元素。
Python总是从每个函数返回一个对象,所以没有指定返回类型的签名:
def add(a, b):
pass
C指定返回类型和每个参数的类型:
int add(int a, int b);
Java没有独立的功能,但其方法可以指定异常可能会抛出什么:
public class A
{
public int add(int a, int b) throws Exception
{
...
}
}
签名的c#泛型类型可能包括:
public class A
{
public T add<T> (T number1, T number2)
}
一个函数签名可以告诉你很多关于这个函数的行为,但没有一切。图,例如,你可能一个add()函数,它接受两个整数,并返回一个整数对其两个参数并返回的总和。你甚至可能是正确的,但是你仍然不知道一切。这个函数使用多少内存?有多快吗?使用其他资源是什么?如果你通过了错误类型的论点吗?有一个有效的参数范围?
例如,对于动态类型语言,如Python不指定参数或返回值的类型,你可以通过任何形式的数字:int,浮点小数,字符串。在整数溢出的情况下,Python可以让内部异常传播或处理并将结果转换为浮动或小数。在所有语言的函数可以使用内存缓存查找之前调用的结果或日志每个调用数据库或远程日志服务。它甚至可以调用一些Web服务来做这个工作。
要真正了解什么功能需要一个合同。合同指定所有这些细节。一个完整的合同不能被指定在任何编程语言中,尽管一些语言比别人走得更远。埃菲尔铁塔已经创造了这个词“契约式设计”,并内置支持前置条件的概念,不变量和后置条件,但成熟的联系比这更。文档可能对人类很好,但不能自动验证。
纯函数是函数,不分配或使用任何资源和给定相同的参数将始终返回相同的结果。如果你主要使用纯函数就可以消除整个类别的行为,但它仍然是在一般情况下不是万灵药。
函数签名的主要门户功能程序的其余部分。许多潜在的调用者主要关心他们传递的参数,因为他们可能继续函数返回时使用它们。例如,如果一个函数修改一个参数调用者需要知道。考虑下面的签名在C:
void mystery(int * x);
“神秘”功能可以修改其“x”的论点。为了避免意外,试图限制的能力“伤害”你的函数。在支持它的语言,使用不可变说明符像“常量。“避免指针和non-const引用。如果你接受多个参数有一定的依赖关系,可以考虑创建一个专门的对象,可以验证本身(调用者不能通过无效的组合参数)。
设计和构建软件是很困难的。函数签名通常被认为是什么一个函数的描述,但这远不是准确的,即使你把合同和文档中。但是,你还没有失去一切。通过关注你的函数签名,尽可能利用语言特性和使用不可变的数据结构纯函数可以得到相当远。精心设计的功能也更容易测试,提供拼图的最后一块构建软件,按预期的方式工作。