李衛公在他的 blog 中討論了乙個
有關函式返回值的問題。其在文章中的初始問題,大致可以描述為:
需要編寫乙個函式,從 hmlt 源**中提取某個節點的文字,在提取失敗的情況下,應當返回乙個空字串還是 null 值。
李衛公在文中說明了,如果在失敗的情況下返回乙個空字串的話,對於該函式的呼叫者而言,是無法區分出該函式是從目標節點中提取到乙個空字串,還是實際上什麼也沒有提取到。
通常來說,乙個函式所要返回的值,要麼是乙個資料(例如乙個員工),要麼是一組資料(例如所有女性員工)。
1. 對於第一種情況而言,函式的返回值型別應當是值(value)型別或者實體(entity)型別。例如,需要根據員工編號得到乙個員工物件,我們可以編寫乙個這樣的函式:
public
employee getemployee(
intid);
如果能找到具有該編號的員工,該函式返回乙個
employee 物件。否則返回 null 值,表示未找到指定 id 對應的員工;或者丟擲乙個 checked exception,函式的識別標誌因此需要修改為:
public
employee getemployee(
intid)
throws
employeenotfoundexception;
由函式的呼叫者來捕獲該異常,並根據需要進行處理。
2. 對於第二種情況而言,函式的返回值型別應當是
collection 型別(包括
map 型別)。例如,需要根據查詢某月某部門遲到員工的列表,我們可以編寫乙個這樣的函式:
public
set<
employee
>
getlateemployees(month month, department department);
如果查詢結果是,在八月份技術部沒有一位同學遲到,太好了,這個函式只需要簡單地返回乙個空
set 物件即可。
對於第一種情況,假設我們選擇的是讓函式返回 null 值,如果在程式中有相當多的地方需要呼叫該函式,那麼我們有可能會在**中發現很多像
if(employee
==null
) ...
這樣的**,這些**通常並不是用來處理業務邏輯,編寫它們的最主要目的可能僅僅只是為了防止出現
nullpointerexception。倘若這種情況降低了程式的可讀性或者可維護性,我們可以採用
null object 模式來消除這些遍處滋生的防禦**。
函式返回值的問題
執行結果 1 您輸入的是23456 2 function text val 3 您輸入的是中國北京 text 23456 var s text window.alert s s 中國北京 function text val var s text 23456 window.alert s functi...
C 函式返回值型別
c 語言的函式返回值型別可以分為內部型別和自定義型別兩大類。在函式返回內部型別中不能返回陣列型別但可以返回指向陣列的指標,同樣也可以返回指向函式的函式指標。如果希望返回值可以作為左值 即可以放在賦值操作符左邊的 那就必須返回引用型別。而在函式返回自定義型別 即返回類型別 中根據是否可作為左值,返回值...
關於函式的返回值與返回型別
返回型別只是決定分一塊什麼型別的記憶體來儲存該返回值。返回值不管是不是外部傳入還是內部定義,只要不是返回引用,在函式執行到 時會拷貝生成乙份匿名物件到外部函式棧。同樣的,形參只要不是引用型別,傳入引數也會執行一次拷貝,該拷貝從外部函式棧,拷貝到被呼叫函式棧。vs編譯器會做一些優化,減少拷貝次數。直接...