【问题标题】:Static vs. non-static method 2 [duplicate]静态与非静态方法2 [重复]
【发布时间】:2009-07-27 06:19:51
【问题描述】:

可能重复:
Static vs. non-static method

哪个更适合一个好的设计

或者有什么不同吗?还是只取决于开发人员?

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

【问题讨论】:

  • 不是骗子:这里确实考虑一个实例方法是有意义的,因为它将处理实例中的数据。
  • @Jon:有很多静态与问题。我想一切都已经涵盖了。
  • 它不是实例,这就是为什么我在问题末尾写了 2.. 它相似但不同..
  • 添加 const 来注释输入/输出变量

标签: static non-static


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    当你使用第三种方法时,你声明,传递的对象都不会被修改,所以当程序员看到时:

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

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

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

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

    【讨论】:

      【解决方案3】:

      对于程序员而言,方法的静态或非静态的区别主要在于您希望完成什么样的设计和行为。对此没有绝对的真理或永远正确的答案。

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

      但只有彻底检查设计中类的职责才能为您的设计找到正确答案。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 2016-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多