控制引數個數的幾種方式

2021-09-05 22:41:05 字數 2595 閱讀 1683

最近整理了一下公司規範,其中「函式的引數個數不宜超過

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 傳遞可變參數列 你可能很熟悉在函式中使用可變參數...