LINUX.ORG.RU

Есть ли смысл в private static методах?


0

1

Здравствуйте!

Возник вопрос по поводу того имеет ли смысл объявлять метод как static, если он является приватным и вызывается только из публичного не статичного метода?

Вот пример на РНР:

class Foo {
    
    public function doRightThing() {
        $smth = self::getSomething();
        ...
    }

    private static function getSomething() {
        return array(/* ... */);
    }

}

Здесь getSomething() объявлен как static, но его можно убрать ведь метод никогда не будет вызван без создания экземпляра класса.

Есть мнение, что static здесь только мешает восприятию кода.

Что скажите?

★★★★★

А я вот думаю, что static - это не усложнение, а упрощение. Ну и надо называть вещи своими именами, а не экономить на байтах.

const86 ★★★★★ ()

Зависит от семантики - если нужно подчеркнуть, что метод работает без экземпляра, то лучше поставить static. А вообще, зависит от конкретной ситуации. В случае с++, например, ещё стоит учитывать, нужна ли виртуальность метода.

hunt ()

В С++ static в таких случаях лишний. Как заметил hunt, нужно учитывать нужна ли виртуальность метода, а это источник потенциальных ошибок.

struct Base
{
  virtual void foo()
  {
    cout << "Base::foo" << endl;
  }
};

struct Derived: public Base
{
  static void derived()
  {
    cout << "Derived::foo" << endl;
  }
};

int main()
{
  Base *pBase = new Derived();
  /* 
   * Ищи-свищи, почему здесь "Base::foo",
   * компилятор даже предупреждения не выдаст!
   */
  pBase->foo();
  delete pBase;
}

К тому же что ты хочешь сказать словом static? Что метод работает без экземпляра? Тогда зачем он вообще в этом классе? ИМХО это указывает на плохой дизайн.

Думаю к PHP это тоже относится.

ama1185 ()
Ответ на: комментарий от ama1185

Ох! Что я наделал! =) Ай, ай, ай.. В производном классе метод неправильно назвал! Компилятор С++ очень даже выдаст предупрежедение!

main.cpp:26: error: ‘static void Derived::foo()’ cannot be declared
main.cpp:18: error:   since ‘virtual void Base::foo()’ declared in base class

Он тоже думает, что это плохой дизайн. :)

ama1185 ()
Ответ на: комментарий от ama1185

К тому же что ты хочешь сказать словом static? Что метод работает без экземпляра? Тогда зачем он вообще в этом классе? ИМХО это указывает на плохой дизайн.

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

private static как минимум помогает не засорять неймспейс.

hunt ()

Например, private static может использоваться как callback для C-библиотек.

Deleted ()
Ответ на: комментарий от ama1185

>В С++ static в таких случаях лишний.

Не факт. private static может лучше оптимизироваться компилятором (см. Agner)

annulen ★★★★★ ()
Ответ на: комментарий от hunt

> private static может лучше оптимизироваться компилятором

private static больше засоряет код, чем помогает в нем разобраться. Нужно понимать, что для тебя здесь важнее. И помнить, что «ранняя оптимизация - корень всех зол».

ama1185 ()

>Есть мнение, что static здесь только мешает восприятию кода.

Есть мнение, что когда программисту нечего делать он код лижет.

У тебя какраз частный случай описанного выше процесса.

//wfrr

anonymous ()
Ответ на: комментарий от ama1185

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


Для начала, нужно понимать, что такое 'static', чтобы не нести ахинеи.

LamerOk ★★★★★ ()
Ответ на: комментарий от LamerOk

> когда программисту нечего делать он код лижет [...] У тебя какраз частный случай

Согласен.

нужно понимать, что такое 'static'

Я понимаю, в чем смысл static. Где ахинея то?

ama1185 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.