класс без данных экземпляра или пространство имен + глобалы в подпространстве имен?

У меня есть несколько связанных методов, каждый из которых использует некоторые глобальные данные (*), и все они должны быть реализованы в заголовке. Нужно ли мне…

  • разместить методы в классе как статические методы, без элементов данных экземпляра, а глобальные переменные в качестве членов статического класса?
  • поместить методы в пространство имен, а глобальные переменные в подпространстве имен :: detail?

Оба эти варианта кажутся мне немного безобразными, но мне интересно, есть ли у одного из них методические преимущества, которые я упускаю, что должно заставить меня предпочесть его. Я мог бы попытаться наклониться назад и переместить мьютекс в файл .cpp, так что это может быть третий вариант, но он не будет красивым …


(*) — в моем конкретном случае это мьютекс.

0

Решение

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

Но в обоих случаях вы можете только объявить данные в заголовке, и вы все равно должны определить их только один раз в некоторой единице перевода. Я бы порекомендовал вам обойтись без в-заголовок реализации, и скрыть статический мьютекс вместе с реализацией функции в том же модуле перевода.

С этого момента вы можете использовать пространство имен, так как оно становится вопросом организации.

0

Другие решения

С точки зрения общей «хорошей практики», я бы избегал любых глобальных данных и использовал бы как можно меньше статических данных (избегая синдрома синглтона).

Первый вопрос: больно иметь несколько экземпляров этих объектов? Обычно, если вы не управляете доступом к оборудованию или подобным, это не так. Даже если вы предполагаете использовать только один, хорошо сделать его как можно более общим и разрешить несколько экземпляров класса.

Кроме того, статические / глобальные переменные имеют тенденцию нести проблемы с потоками / процессами, поскольку иногда сложно определить, сколько у вас есть копии статического объекта.

Итак, краткий ответ: поместите их в класс как нестатические, а также поместите эти «глобальные» данные в класс.

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

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

Редакция:

После издания вопроса и попыток ближе разобраться в чем вопрос:

Предположим, вам требуется обертка вокруг мьютекса, которая уникальна для каждого процесса.

class MyMutexWrapper // very minimal class, you should finish it.
{
MyMutex mutex;
public:
anyFunction();
};

Когда у вас есть это, вы можете создать один глобальный экземпляр и поделиться им через весь код. Лучшее решение — создать его в любой области и передать его любому компоненту, который его использует.
Вы можете, например, передать ссылку.

Этот подход может показаться более сложным, но он позволяет избежать перекрестных зависимостей и сделать вашу структуру кода более чистой => затем вы можете использовать ее повторно, расширять, поддерживать …

0

По вопросам рекламы [email protected]