2009-07-27 210 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中)。

与实例方法混合到同一个类中的静态方法往往十分晦涩难懂。他们只能看到静态数据,所以就像将单例的定义混合到别的定义中一样。将它们分离出来要清楚得多。