C++、Java這類語言提供的 overloading
是讓開發者可以寫兩個以上的同名函式 (方法,method)
前提函式/方法識別 (signature,參數與回傳型別) 是不同的
但是這建立在變數必須有明確的型別
即 strongly-typed程式語言 (變數與屬性有強連結,使用前須先宣告)
而 loosely-typed程式語言
變數不需有特定屬性,通常也不需先宣告即可使用)
由於變數並無特定屬性,函式/方法也無從辨別同名函式是否不同
唯一可辨別的只有參數數量
此類語言之函式參數傳遞通常皆屬於可變長度參數 (variable-length arugment)
函式呼叫時可以傳遞任意數量的參數
函式實作則可自由定義須使用到之參數
此功能便取代正規 overloading使用
一般根據不同的參數傳遞數量
再決定應該將第幾項參數賦予變數名
jQuery則是預先定義函式參數列表
再根據參數傳入的型態再決定是否做參數位移
例如 jQuery.get/post 函式撰寫
function( url, data, callback, type ) { // shift arguments if data argument was omitted if ( jQuery.isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } ... };
這產生了問題
每個函式的開頭
都必須要有一段 if...else if ...else先做參數賦予的判斷
函式可能會因此被拉很長,這並不是好現象
就自身經驗
一個函式超過 70行其實已經會產生些許閱讀和撰寫困難
尤其是區域變數越多
便越容易閱讀後段忘前段,變數名稱混淆、難以決定等
近日重新編整自己建立的PHP模組函式庫
再次注意這個現象
思考是否可有一規則化設定
將程式碼稍微簡化?
判斷個別參數型態再做參數位移目前尚未思考到規則性
目前僅針對參數數量判斷
故建立 X 函式
函式之所需參數為
參數 1:map資料結構 ( PHP中即 array,JavaScript則為 object )
key為參數數量,可以設定為 「n」、「n+」、「n-」或「_」
n為正整數,分別代表 n個、n以上、n以下,或未定義數量之解析
value則是對應之名稱設定,亦為 map資料結構
key為參數之名稱、value則是詳細設定
包含預設值、預設值取代條件 (可再加型別判斷)
參數 2:傳入之參數陣列
參數 1範例 (以 JSON格式為範例)
{ '2+': { 'arg1': { 'default': 0 }, 'arg2': { 'default': -1, 'empty': false } }, '3+': { ... } '_': { ... } }
此例中定義當傳入 2個以上之參數時
將第一項參數名稱定為 arg1,預設值為 0 (若傳入 undefined)
將第二項參數名稱定為 arg2,預設值為 -1 (若傳入 false)
需注意的是參數定義的尋找,乃依定義之先後順序
此例中若傳入 3個參數,即使「3+」符合條件
仍會使用「2+」之定義
由於每次呼叫皆必須要傳入設定值
若開發人員的程式撰寫習慣很好
設定一多仍然會產生非常長的程式碼
且每次呼叫皆會建立一個 map資料群也不太好
當然,開發人員也可以利用
全域或者靜態變數將設定值先行存好
但這樣容易造成管控不便
故再設計了定義的註冊與反註冊函式
將設定值先行註冊,統一管控
如此再函式內呼叫時,只需要放入函式名稱
X函式便可自行取得設定並且解析參數
理想上X函式是可以不需要任何參數
僅需判斷 X函式之呼叫者為何
以及取得傳遞給 X函式呼叫者之參數集便可
PHP實作版中,便利用 debug_backtrace直接取得此二項資訊
JavaScript目前還未實作,可再研究可行作法
留言列表