最近整理了一下公司規範,其中「函式的引數個數不宜超過
41、使用結構來封裝引數
例子:新增使用者
原函式體:adduser(string username,string password,string address,string phone,int age)
重構:新增乙個user類:
class
user
public
string
password
public
string
address
public
string
phone
public
intage }
將adduser改為:adduser(user user)
存在的問題:如果新增的這個類沒有其他地方用,常常會覺得這樣做並不值得,這時我們可以考慮使用匿名類封裝引數的方法。
2、使用屬性來替換引數
如果將1中的adduser方法置於user類中,那麼adduser方法中的user引數都可以省掉了,有的時候可能為了減少某些方法的引數個數而新增某些屬性。物件導向設計中,物件應該自己負責自己,而且應該清楚定義責任。某個方法引數太多的原因可能是這個方法寫在了他不該存在的地方,grasp原則中講的「資訊專家」模式很多情況下可以減少引數的個數。
例子:帳戶轉賬
原函式:transfer(account from,account to,decimal money)
重構:public
class
transferprocess
public
void
transfer(
decimal
money)
else}}
注:資訊專家模式是物件導向設計的最基本原則,我們設計物件(類)的時候,如果某個類擁有完成某個職責所需要的所有資訊,那麼這個職責就應該分配給這個類來實現。這時,這個類就是相對於這個職責的資訊專家。
3、使用私有函式
呼叫某個函式時往往並不需要很多的互動引數,但我們提供引數時則需要提供所有的情況,這時我們可以把函式分類,將最複雜的函式封裝成私有的,而暴露出來的簡單函式呼叫這些複雜函式完成功能。我們來看看mvc中的textbox方法的實現方式:
public
static
string
textbox(
this
htmlhelper htmlhelper,
string
name,
object
value, idictionary
<
string
, object
>
htmlattributes)
private
static
string
inputhelper(
this
htmlhelper htmlhelper, inputtype inputtype,
string
name,
object
value,
bool
useviewdata,
bool
ischecked,
bool
setid,
bool
i***plicitvalue, idictionary
<
string
, object
>
htmlattributes)
tagbuilder tagbuilder
=new
tagbuilder(
"input");
... ...
但有時我們為了給呼叫者最大的靈活性,可能也會把最複雜的那個函式過載暴露出來。
4、params 關鍵字
指定在引數數目可變處,採用引數的方法引數。
用法:static
void
main(
string
args)
public
static
void
useparams(
params
int list)
console.writeline();}
這種方法實際上並沒有減少引數的個數,只是簡化了函式體。
5、使用匿名類封裝引數
準備知識:我們先來看看routevaluedictionary
static
void
main(
string
args)
);foreach
(var item
inr):"
, item.key, item.value);}//
console.writeline();}
結果:id:1
name:lfm
routevaluedictionary可以將例項的屬性名及屬性值存入到字典中。
mvc中很多地方使用這種方式傳遞引數。
比如:
actionlink方法體中就是使用routevaluedictionary將匿名物件進行了分解,然後將其拼裝到鏈結上。
引數個數可變的函式
今天突然想起引數個數可變的函式,然後想了下,覺得自己還真不太了解它,遂決定弄清楚。1.如何取得可變引數 比如 void f int fixpara1,char p char fixpara1 取得固定引數位址 cout int p 為什麼p 4可以取到第乙個可變引數呢?因為引數在函式被呼叫前,會逐個...
可變引數個數的函式
type vafunction type arg1,type arg2,引數可以分為兩部分 個數確定的固定引數和個數可變的可選引數。函式至少需要乙個固定引數,固定引數的宣告和普通函式一樣 可選引數由於個數不確定,宣告時用 表示。固定引數和可選引數公同構成乙個函式的引數列表。標準c c 包含標頭檔案s...
引數個數可變的巨集
出處 乙個介紹 macros很好的 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數...