Хорошо иметь переменные в пространстве имен? - PullRequest
3 голосов
/ 19 января 2010

У меня есть набор функций, которые работают с файлом. Первоначально я сделал это в классе, с единственным закрытым членом был static const std::string, который был именем файла. Пользователь использовал эти функции, создавая объект и вызывая из него функции. Тем не менее, я думаю, что я собираюсь перейти к использованию пространства имен, так как это просто набор функций и имеет больше смысла. Единственная проблема заключается в том, что я все еще хотел бы сохранить эту постоянную строку. Будет ли что-то делать в этом направлении?

namespace FileHandler {
    // Functions to do stuff with file
    const std::string FILE_NAME;
}

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

Ответы [ 2 ]

5 голосов
/ 19 января 2010

Вы можете делать подобные вещи, но у них будет другая семантика.

В классе статическая переменная является объявлением, а не определением, оно все еще требует определения вне класса; объявление переменной в пространстве имен является определением, если вы не пометите как extern и не предоставите инициализатор.

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

1009 * Е.Г. *

class Test
{
    static const std::string FILE_NAME;
};

(в некоторых отношениях) эквивалентно:

namespace Test
{
    extern const std::string FILE_NAME;
}

Если бы вы сделали это, вы бы объявили FILE_NAME пустой строкой. Вы не можете переопределить его в другом месте в том же переводчике.

namespace Test
{
    const std::string FILE_NAME;
}

Вы могли бы, однако, сделать это.

namespace Test
{
    const std::string FILE_NAME = "myfile.txt";
}

Каждая единица перевода будет иметь свою собственную версию Test::FILE_NAME, но все они будут согласованы.

2 голосов
/ 19 января 2010

Я не вижу проблемы, которая заставила вас перейти от использования класса к использованию пространства имен. Если каждая функция действует на файл, имя которого хранится в FILE_NAME, то файл кажется совершенно допустимой частью состояния объекта. Переход от того, что составляет глобальную переменную, является сильным запахом кода. Что происходит, когда вы хотите выполнить операции с двумя файлами одновременно? Что если вы хотите поддерживать файлы разных типов? Гораздо проще ответить на эти вопросы с помощью объектно-ориентированного подхода, который позволяет избежать глобального состояния.

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

...