2011-01-07 31 views
4

我是一個新的開發人員,我想在你知道的體驗到什麼是更好的方法,當你的建築類的方法,如果沒有更好的方法,如何相對於平衡你的決定:有多少個參數是一個合理的數字,大對象vs原子參數。 OOP

  • 作爲參數傳遞一個包含該方法所需大部分變量的大對象。
  • 傳遞更多原子個體變量的可能性,併產生具有大簽名的方法的後果。

對於正在發展的代碼有什麼好處?你認爲什麼是合理數量的論據?

回答

1

如果set pf參數中的通用性允許,我會強烈支持傳遞一個對象。

爲什麼?

因爲X%的努力去維護現有的代碼,並且很難添加新的參數 - 特別是在鏈式調用和傳遞這些新參數的方法中 - 而不是將屬性添加到對象。

請注意,從方法的角度來看,這不必是CLASS本身。僅僅是一個存儲容器(一個異構的映射/字典,或者爲了類型安全,一個支持它的C型語言中的結構)。

示例(我將使用僞代碼,隨意的語言(S)它是基於):


首先,我們使用的參數列表看到新老代碼

舊代碼:

function f1(arg1, arg2, arg3, arg4, arg5) { 
    res = f2(arg1, arg2, arg3, arg4); 
} 
function f2(arg1, arg2, arg3, arg4) { 
    res = f3(arg1, arg2, arg4); 
} 
function f3(arg1, arg2, arg4) { 
    res = f4(arg1, arg4); 
} 
function f4(arg1, arg4) { 
    return arg1 + arg4; 
} 

新的代碼(需要在F4添加arg6()):

function f1(arg1, arg2, arg3, arg4, arg5, arg6) {  // changed line 
    res = f2(arg1, arg2, arg3, arg4, arg6);    // changed line 
} 
function f2(arg1, arg2, arg3, arg4, arg6) {    // changed line 
    res = f3(arg1, arg2, arg4, arg6);     // changed line 
} 
function f3(arg1, arg2, arg4, arg6) {     // changed line 
    res = f4(arg1, arg4, arg6);       // changed line 
} 
function f4(arg1, arg4, arg6) {       // changed line 
    return arg1 + arg4 + arg6;       // changed line 
} 

如您所見,對於4級嵌套調用,我們更改了所有4個函數,每個函數至少2行。 YIKES。因此,對於10級嵌套調用,添加1個參數會更改所有TEN功能和20行。


現在,同樣的變化,除了ARG列表的例子現在是一個對象(或者,對動態語言的,異構的地圖會做:)

class args_class { 
    public: 
     int arg1, arg2, arg3, arg4, arg5; 
    } 
} 
args_class arg_object; 

function f1(arg_object) {  
    res = f2(arg_object);    
} 
function f2(arg_object) {  
    res = f3(arg_object);     
} 
function f3(arg_object) {     
    res = f4(arg_object);       
} 
function f4(arg_object) {       
    return arg_object.arg1 + arg_object.arg4;       
} 

而且我們怎麼改添加arg6?

class args_class { 
    public: 
     int arg1, arg2, arg3, arg4, arg5, arg6;     // line changed 
    } 
} 
// f1..f3 are unchanged 
function f4(arg_object) {       
    return arg_object.arg1 + arg_object.arg4 + arg_object.arg6; // line changed 
} 

就是這樣。對於4級嵌套方法或10級嵌套方法,只能更改2行。

哪一個維護工作少?

+0

很好的例子。這讓我想起了典型的* EventArgs對象,它在某些情況下包含了很多可以使用的內部信息 – mjsr 2011-01-11 19:04:52

0

我認爲這一切都取決於函數參數本身的上下文。如果你依靠的某些元素,那麼我會通過該參考某件事作爲參數(不管它是引用/指向該對象的接口還是指向該對象的引用/指針定義本身就是一個實現細節)。

如果參數不是直接從一個對象中派生出來的,而且有少量參數(五個或更少,或許真的如此),那麼我會傳遞原子參數。

如果可能有大量參數,那麼我會創建一些init結構作爲參數,其中調用代碼實例化並填充結構,然後將引用作爲參數傳遞給參數。