11月 25, 2008

【語言】函式是什麼 - What is Function?

@
  開發程式時,或許在程式很小的情況,把所有功能通通寫在一個同區塊(block)中是一個可行的方法。但是,一旦程式的規模越變越大,若仍舊將所有內容都寫在一個區塊中,將會導致程式變得難以除錯與閱讀。



  讓我們舉個例來說明,假設在某個程式中,你需要將幾個變數(variable)做初始化的動作。如以下所示:

score = 0;
life = 3;
item = 50;
win = false;
pause = false;

  而且,或許你在整個程式中不只要作一次類似的動作:

......
......
score = 0;
life = 3;
item = 50;
win = false;
pause = false;
......
......
score = 0;
life = 3;
item = 50;
win = false;
pause = false;
......
......
score = 0;
life = 3;
item = 50;
win = false;
pause = false;
......
......

  如此一來,程式不但看起來相當冗長,而且一旦程式有任何錯誤或是更動(例如,我們現在要將 "life = 3" 改成 "life = 5"),就需要一一將每個相同的部分做修改。萬一在修改時又有疏失,對於程式的維護與除錯來說,都是相當不方便的。

  為了解決這種問題,我們可以將重複性高,或是邏輯概念類似的部分分離成一個函式(function),並在需要的地方呼叫(call)函式以執行函式內容。




  函式又稱為副程式(subroutine),概念有點類似於數學上的「函數」,代表的是一串程式區段的集合。例如上面我們所提到的例子,就可以利用函式改寫成這樣:

function initialize()
{
    score = 0;
    life = 3;
    item = 50;
    win = false;
    pause = false;
}

......
......
initialize();
......
......
initialize();
......
......
initialize();
......
......

  首先,我們可以看到,一個基本的函式包含兩個部份:函式的名稱主體。其中,"initialize"是這個函式的名稱。由上面的例子我們可以知道:當我們要執行一個函式時,是需要透過其名稱來做呼叫的。而函式主體,理所當然就是函式所包含的程式區段了。


  除此之外,我們也可以傳入一些資料到函式裡。

  例如現在有一個方程式 f(x) = 3x2 - 6x + 1,則利用函式可以這麼寫:

function f(x)
{
    return 3 * x * x - 6 * x + 1;
}

print f(5);

  在這裡,x 稱之一個為參數(parameter),在意義上有點類似數學中代入函數的數值:我們可以在呼叫函式的同時,傳入適當的參數(變數或是常數),來得到代入之後的結果。

  當然,在得出運算的結果之後,我們還必須把這個結果傳回去。而這個傳回的結果,我們稱之為返回(return)。而在這個例子中,f() 函式的返回值就是 x 代入 3x2 - 6x + 1 之後得出的結果。


  經過以上這些說明,我們可以知道:善加利用函式的方式,程式也會因此變得比較好維護。因為一旦程式有錯誤或是更動,我們不需要再一一更改所有相同的部份,只需要修改函式中的程式碼就可以了。

  與之前提過的變數相同,函式的使用與規範也隨著程式語言而有所不同。因此大部分的細節這裡並不多提,讓我們留待之後再做解釋。

2 回覆:

匿名 提到...

888

summer 提到...

函式不等於副程式?

張貼留言