1. 程式人生 > 其它 >程式設計基礎知識:函式簽名學習

程式設計基礎知識:函式簽名學習

程式設計功能的基本單位。你建立你的程式一個函式(或方法)。最小的東西您可以測試在單元測試是一個函式。也是最小的一個函式的程式碼名稱,因此可以建立一個新的抽象。函式的目的是封裝一些程式碼並使其可用於其他程式或其他程式庫。

什麼是函式簽名?

函式簽名包含函式名,引數,並在一些語言中,返回型別。有幾個等其他元素,這些元素可能存在異常規範和各種限定符(尤其是對類方法)。不是所有的程式語言都支援所有元素。

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引用。如果你接受多個引數有一定的依賴關係,可以考慮建立一個專門的物件,可以驗證本身(呼叫者不能通過無效的組合引數)。

結論

設計和構建軟體是很困難的。函式簽名通常被認為是什麼一個函式的描述,但這遠不是準確的,即使你把合同和文件中。但是,你還沒有失去一切。通過關注你的函式簽名,儘可能利用語言特性和使用不可變的資料結構純函式可以得到相當遠。精心設計的功能也更容易測試,提供拼圖的最後一塊構建軟體,按預期的方式工作。