2009-07-27 254 views
1

可能重複:
Static vs. non-static method靜態與非靜態方法2

哪一個是一個很好的設計

好還是有什麼區別?還是僅僅取決於開發者?

class Foo 
{ 
    int x; 

    void add(Foo* f1) //Method 1 
    { 
     x += f1->x; 
    } 

    static void add(Foo* f1, Foo* 2) //Method 2 
    { 
     f1->x = f1->x + f2->x; 
    } 

    static Foo* add(Foo* f1, Foo* 2) //Method 3 
    { 
     Foo* foo = new Foo(); 
     foo->x = f1->x + f2->x; 
     return foo; 
    } 
} 
+0

Dupe:http://stackoverflow.com/questions/1184701/static-vs-non-static-method其中很多其他... – 2009-07-27 06:21:29

回答

3

從一個角度OO點,我認爲更好的辦法是:

 
class Foo 
{ 
    int x; 

    void add(Foo* f1) //Method 1 
    { 
     x += f1->x; 
    } 
} 

的方法應該連接到一個對象而不是一個類。

C++是面向對象而不是面向類的。

在我看來,使用過多的靜態方法打破對象的利益(polymorphsim,繼承...)

3

第一和第三個選項是好的 - 選擇哪一個取決於你的意圖。我不會使用第二種選擇 - 它沒有透露它的意圖。

當你使用第一種方法時,你清楚地表明,添加會修改對象。當程序員看到時:

Foo f1, f2; 
f1.add(&f2); 

他/她已經知道,f1可以/將會被這個調用修改。

當您使用第三種方法,你的狀態,即沒有傳遞的對象將被修改,所以當程序員看到:

Foo f1, f2; 
Foo *result; 
result = Foo.add(&f1, &f2); 

他/她知道,那f1和f2不會被修改(與你應該使用語言給你的選項來執行此操作)。

正如我寫的 - 第一種和第三種方法之間的選擇取決於你的意圖。如果你想把Foo當作值對象 - 這意味着你可以相信,一旦你設置了它的字段,他們將保持這種方式,無論你傳遞對象的位置,使用第三種方法。如果你想把Foo當作一個狀態可以改變的對象,並且你同意將一個Foo對象傳遞給一個方法可以改變它的狀態 - 使用第一個選項。

但是,當您使用第二個選項時 - 程序員將不知道您是修改第一個,第2個,還是兩個參數都不是。不要使用這個選項。

3

程序員的方法的靜態性或非靜態性的差異主要是您希望完成什麼設計和行爲的問題。對此沒有絕對的真理或總是正確的答案。

簡單的區別是靜態方法是無狀態的,而非靜態方法是有狀態的。例如,如果這是實例化的問題,則有許多設計偏好靜態方法。

但是,只有通過徹底檢查設計中類的職責才能實現設計的正確答案。

1

如果您可以通過僅使用該類的公共特性來實現該函數/方法,那麼您應該使其成爲非成員函數/方法(在某些語言中的單獨類中的靜態方法或擴展方法在C#或VB.NET中)。

與實例方法混合到同一個類中的靜態方法往往十分晦澀難懂。他們只能看到靜態數據,所以就像將單例的定義混合到別的定義中一樣。將它們分離出來要清楚得多。