Статический и нестатический метод 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;
    }
}

4 ответа

Первый и третий варианты хороши - какой из них выбрать, зависит от ваших намерений. Я бы не стал использовать второй вариант - он не раскрывает его намерения.

Когда вы используете первый метод, вы четко заявляете, что дополнение изменит объект. Когда программист видит:

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

Он / она уже знает, что f1 может / будет изменен этим вызовом.

Когда вы используете третий метод, вы заявляете, что ни один из переданных объектов не будет изменен, поэтому, когда программист видит:

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

Он / она знает, что f1 и f2 НЕ будут изменены (и вы должны использовать опции, которые язык дает вам для обеспечения этого).

Как я уже писал - выбор между первым и третьим методом зависит от ваших намерений. Если вы хотите относиться к Foo как к объекту-значению - это значит, что вы можете верить, что после того, как вы установите его поля, они останутся такими, независимо от того, куда вы передадите свой объект, используйте третий метод. Если вы хотите рассматривать Foo как объект, состояние которого может и будет меняться, и вы соглашаетесь с тем, что передача объекта Foo методу может изменить его состояние - используйте опцию first.

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

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

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

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

С точки зрения ОО, я думаю, что лучший способ это:

класс фу
{
    int x;

    void add (Foo * f1) // Метод 1
    {
        х += f1-> х;
    }
}

метод должен быть связан с объектом, а не с классом.

C++ является объектно-ориентированным, а не класс-ориентированным.

На мой взгляд, использование слишком большого количества статических методов нарушает преимущества объектов (полиморфизм, наследование...)

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

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

Другие вопросы по тегам