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目前還未實作,可再研究可行作法

arrow
arrow

    wylokgo101 發表在 痞客邦 留言(0) 人氣()