1

可能重复:
静态与非静态方法

哪个更适合一个好的设计

还是有什么区别?还是仅取决于开发人员?

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;
    }
}
4

4 回答 4

3

从OO的角度来看,我认为更好的方法是:

Foo 类
{
    诠释 x;

    void add(Foo* f1) //方法一
    {
        x += f1->x;
    }
}

方法应该链接到对象而不是类。

C++ 是面向对象而不是面向类。

在我看来,使用过多的静态方法会破坏对象的好处(多态模拟、继承......)

于 2009-07-27T06:27:39.390 回答
3

第一个和第三个选项都不错 - 选择哪个取决于您的意图。我不会使用第二个选项 - 它没有透露它的意图。

当您使用第一种方法时,您明确指出,该添加将修改对象。当程序员看到:

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

他/她已经知道, f1 可以/将被此调用修改。

当您使用第三种方法时,您声明不会修改任何传递的对象,因此当程序员看到:

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

他/她知道 f1 和 f2 不会被修改(并且您应该使用语言为您提供的选项来强制执行此操作)。

正如我所写 - 第一种和第三种方法之间的选择取决于您的意图。如果您想将 Foo 视为值对象 - 这意味着您可以相信,一旦您设置了它的字段,无论您将对象传递到何处,它们都会保持这种状态,请使用第三种方法。如果您想将 Foo 视为状态可以并且将会改变的对象,并且您同意将 Foo 对象传递给方法可以改变它的状态 - 使用第一个选项。

但是,当您使用第二个选项时 - 程序员将不知道您是否修改了第一个、第二个、两个或两个参数。不要使用此选项。

于 2009-07-27T06:27:57.907 回答
3

对于程序员来说,方法的静态或非静态的区别主要是您希望完成的设计和行为的问题。对此没有绝对的真理或永远正确的答案。

直接的区别是静态方法是无状态的,而非静态方法是有状态的。例如,如果是实例化问题,那么有许多设计支持静态方法。

但是只有通过彻底检查设计中类的职责才能获得设计的正确答案。

于 2009-07-27T06:29:16.343 回答
1

如果您可以仅使用类的公共特性来实现函数/方法,那么您应该将其设为非成员函数/方法(某些语言中的单独类中的静态方法,或 C# 或 VB 中的扩展方法。网)。

静态方法与实例方法混合到同一个类中往往非常晦涩难懂。他们只能看到静态数据,所以这就像将单例的定义混合到其他东西的定义中一样。将它们分开会更清楚。

于 2009-07-27T06:36:32.710 回答