可能重复:
一个好的设计哪一个更好
还是有什么区别?还是仅仅由开发者来决定?
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;
}
}发布于 2009-07-27 06:27:57
第一种和第三种选择都是好的--选择哪一种取决于你的意图。我不会使用第二种选择--这并不表明它的意图。
当您使用第一个方法时,您会清楚地声明,添加将修改对象。当程序员看到:
Foo f1, f2;
f1.add(&f2);他/她已经知道,这个调用可以/将修改f1。
当您使用第三种方法时,您会声明,所有传递的对象都不会被修改,所以当程序员看到:
Foo f1, f2;
Foo *result;
result = Foo.add(&f1, &f2);他/她知道,f1和f2不会被修改(您应该使用语言为您提供的选项来执行此操作)。
正如我所写的,在第一和第三种方法之间的选择取决于你的意图。如果您想将Foo视为值对象--这意味着您可以相信,一旦设置了Foo的字段,不管在哪里传递对象,它们都将保持不变,请使用第三种方法。如果您想将Foo作为对象来对待,那么哪个状态可以并且将要改变,并且您同意将Foo对象传递给一个方法可以改变它的状态--使用第一个选项。
但是,当您使用第二个选项时,程序员将不知道您是修改第一个、第二个、两个还是两个参数都不修改。不要使用这个选项。
发布于 2009-07-27 06:29:16
对于程序员来说,方法的静态性和非静态性的区别主要在于你希望完成什么样的设计和行为。对此,没有绝对的真理,也没有永远正确的答案。
直接的区别是静态方法是无状态的,而非静态方法是有状态的。例如,如果这是实例化的问题,那么有许多设计倾向于静态方法。
但是,只有通过彻底检查设计中的类的责任,才能为您的设计找到正确的答案。
发布于 2009-07-27 06:36:32
如果您可以仅使用类的公共特性来实现函数/方法,那么应该将它变成非会员函数/方法(在某些语言中是单独类中的静态方法,或者是C#或VB.NET中的扩展方法)。
与实例方法混合到同一个类中的静态方法往往非常模糊和混乱。他们只能看到静态数据,所以这就像将单例的定义与其他事物的定义混合在一起一样。把它们分开要清楚得多。
https://stackoverflow.com/questions/1186678
复制相似问题