Используете слишком много статики, плохо или хорошо? - PullRequest
12 голосов
/ 27 августа 2008

Мне нравится использовать статические функции в C ++ для классификации их, как в C #.

Console::WriteLine("hello")

Это хорошо или плохо? Если функции используются часто, я думаю, это не имеет значения, но если нет, то они оказывают давление на память?

А как насчет static const?

Ответы [ 10 ]

26 голосов
/ 28 августа 2008

но хорошо это или плохо

Первое прилагательное, которое приходит на ум, - «ненужное». C ++ имеет свободные функции и пространства имен, так зачем вам нужно делать их статическими функциями в классе?

Использование статических методов в неосуществимых классах в C # и Java - это обходной путь , потому что эти языки не имеют свободных функций (то есть функций, которые находятся непосредственно в пространстве имен, а не как часть класс). С ++ не имеет этого недостатка. Просто используйте пространство имен.

10 голосов
/ 27 августа 2008

Я за использование статических функций . Это просто имеет смысл, особенно когда они организованы в модули (static class в C #).

Однако, в тот момент, когда эти функции нуждаются в каких-то внешних (не зависящих от времени компиляции) данных, тогда эту функцию следует сделать методом экземпляра и инкапсулировать вместе со своими данными в классе. *

В двух словах: статические функции в порядке, статические данные плохие.

3 голосов
/ 18 мая 2012

Те, кто говорят, что статические функции могут быть заменены пространствами имен, неверны, вот простой пример:

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

Как видите, общедоступная статическая функция f1 вызывает другую статическую, но частную функцию f2.

Это не просто набор функций, а умная коллекция с собственными инкапсулированными методами. Пространства имен не дали бы нам эту функциональность.

Многие люди используют шаблон «синглтон» только потому, что это обычная практика, но во многих случаях вам нужен класс с несколькими статическими методами и только одним статическим членом данных. В этом случае нет необходимости в синглтоне вообще. Также вызов метода instance() медленнее, чем просто прямой доступ к статическим функциям / членам.

2 голосов
/ 28 августа 2008

Использование пространств имен для создания набора функций:

namespace Console {
    void WriteLine(...) // ...
}

Что касается памяти, функции используют то же количество вне функции, что и статическая функция-член или в пространстве имен. То есть: нет памяти, кроме самого кода.

1 голос
/ 28 августа 2008

Проблема со статическими функциями заключается в том, что они могут привести к созданию структуры, нарушающей инкапсуляцию. Например, если вы пишете что-то вроде:

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

... тогда вам может понадобиться переосмыслить свой дизайн. Статические функции часто требуют, чтобы вы использовали сеттеры и геттеры, которые загромождают API класса и в целом усложняют ситуацию. В моем примере было бы лучше удалить геттеры Гамбургера и просто переместить класс getTotal () в сам Гамбургер.

1 голос
/ 28 августа 2008

Я склонен делать классы, которые состоят из статических функций, но некоторые говорят, что «правильный способ» сделать это - вместо этого использовать пространства имен. (Я разработал свои привычки до того, как в C ++ появились пространства имен.)

Кстати, если у вас есть класс, который состоит только из статических данных и функций, вы должны объявить конструктор как закрытый, поэтому никто не пытается его создать. (Это одна из причин, по которой некоторые утверждают, что используют пространства имен, а не классы.)

1 голос
/ 27 августа 2008

Одна конкретная причина, по которой статические данные плохие, заключается в том, что C ++ не дает никаких гарантий относительно порядка инициализации статических объектов в разных единицах перевода. На практике это может вызвать проблемы, когда один объект зависит от другого в другой единице перевода. Скотт Майерс обсуждает это в пункте 26 своей книги «Более эффективный C ++».

1 голос
/ 27 августа 2008

Согласитесь с Фрэнком, что здесь нет проблем со статическими (глобальными) функциями (конечно, при условии, что они организованы). Проблемы только начинают проявляться, когда люди думают: «О, я просто укажу на это данных немного шире ".. Скользкий уклон:)

Чтобы по-настоящему взглянуть на это .. Функциональное программирование ;)

0 голосов
/ 26 июня 2010

Я обычно использую статику только в сочетании с системой друзей.

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

Это, конечно, увеличивает количество функций, которые имеет интерфейс класса. Чтобы избавиться от этого, я объявляю вспомогательный класс в исходном файле .cpp классов (и, следовательно, невидим для внешнего мира), делаю его другом исходного класса, а затем перемещаю старые вспомогательные функции в статический (встроенный) член функции вспомогательного класса, передавая старый класс по ссылке в дополнение к старым параметрам.

Это делает интерфейс тонким и не требует большого списка бесплатных функций друзей. Встраивание также работает хорошо, так что я не полностью против статики. (Я избегаю этого столько, сколько могу, но, пользуясь этим, я люблю это делать.)

0 голосов
/ 28 августа 2008

Для организации используйте пространства имен, как уже указано.

Для глобальных данных мне нравится использовать шаблон singleton , поскольку он помогает решить проблему неизвестного порядка инициализации статических объектов. Другими словами, если вы используете объект как одиночный объект, он гарантированно будет инициализирован при его использовании.

Также убедитесь, что ваши статические функции не сохраняют состояния, поэтому они безопасны для потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...