2009-07-27 4 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 среди многих других ... –

+0

Не обман: здесь он * делает * имеет смысл рассмотреть метод экземпляра, поскольку он будет работать с данными в экземпляре. –

+0

@Jon: Есть много статических вопросов и вопросов. Я думаю, что все уже охвачено. –

ответ

3

С точки зрения ОО, я думаю, что может быть лучше:

 
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 методу может изменить его вариант использования с использованием состояния.

Однако при использовании второго варианта программист не будет знать, изменяете ли вы первый, второй, оба или ни один из аргументов. Не используйте эту опцию.

3

Разница в статичности или нестационарности метода для программиста в основном связана с тем, какой дизайн и поведение вы хотите выполнить. Для этого нет абсолютной истины или всегда правильного ответа.

Простое отличие состоит в том, что статические методы являются безстоящими, тогда как нестатические методы являются состояниями. Если речь идет о создании экземпляра, существует множество проектов, которые, например, способствуют использованию статических методов.

Но правильный ответ на ваш дизайн, который вы можете получить, только тщательно изучив обязанности классов в вашем дизайне.

1

Если вы можете реализовать функцию/метод, используя только общедоступные функции класса, то вы должны сделать его нечленом function/method (статический метод в отдельном классе на некоторых языках или метод расширения в C# или VB.NET).

Статические методы, смешанные с тем же классом, что и методы экземпляров, как правило, являются довольно неясными и запутанными. Они могут видеть только статические данные, поэтому это как смешивание определения одноэлементности в определении чего-то еще. Гораздо яснее их разделить.

Смежные вопросы