Пространство имен или класс, что лучше для инкапсуляции только членов функции

Итак, допустим, у меня есть несколько функций для открытия/закрытия файлов.

Лучше ли создать класс со всеми этими функциями, объявленными статически, или просто поместить «общедоступную» функцию в заголовочный файл пространства имен «файл», а остальные «детали реализации» поместить в файл .cc?

Ниже приведены примеры кода.

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

БЛАГОДАРНОСТЬ!!


реализация класса

Заголовок:

#ifndef FILE_H
#define FILE_H

#include <iostream>
#include <fstream>

include "common.h"

enum Errorcode {
    FILE_CANNOT_OPEN,
    FILE_CANNOT_CLOSE
};

class file {

public:
    static common::Lines toLines(std::string filename);

private:
    static void err(Errorcode e, std::string msg);
    static void toLines(std::ifstream &ifs, common::Lines &lines);

};

#endif

.cc файл:

/*just the implementation details of above class.*/

реализация пространства имен

Заголовок:

#ifndef FILE_H
#define FILE_H

#include <iostream>
#include <fstream>

#include "common.h"

namespace file {

common::Lines toLines(std::string filename);

}

#endif    

.cc файл:

namespace file {

enum Errorcode {
    FILE_CANNOT_OPEN,
    FILE_CANNOT_CLOSE
};

void err(Errorcode e, std::string msg);
void toLines(std::ifstream& ifs, common::Lines &lines);

common::Lines toLines(std::string filename)
{
    std::vector<std::string> lines;

    try {
        std::ifstream ifs(filename.c_str());
        if (ifs.fail()) throw FILE_CANNOT_OPEN;

        toLines(ifs, lines);

        ifs.close();
        if (ifs.fail()) throw FILE_CANNOT_CLOSE;
    }
    catch (Errorcode e) {
        err(e, filename);
    }

    return lines;
}

void err(Errorcode e, std::string msg)
{
    switch (e) {
        default:
            std::cerr << "Unknown error.\n";
            break;
        case FILE_CANNOT_OPEN:          
            std::cerr << "file \"" << msg   
                << "\" could not be opened.\n"; 
            break;
        case FILE_CANNOT_CLOSE:         
            std::cerr << "file \"" << msg   
                << "\" could not be closed.\n"; 
            break;
    }
    std::exit(-1);
}

void toLines(std::ifstream& ifs, common::Lines &lines)
{
    std::string line;

    while(std::getline(ifs, line)) {
        lines.push_back(line);
    }

    ifs.clear();    // clear error bit set by getline()
}

}                    

person Jimmy Lu    schedule 30.01.2012    source источник
comment
Любой способ может работать достаточно хорошо, но пространства имен являются более распространенным стилем C++.   -  person Ben Voigt    schedule 30.01.2012


Ответы (3)


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

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

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

person Kerrek SB    schedule 30.01.2012
comment
@BeyondSora: Вот, пожалуйста: ADL — Поиск Кенига - person Alok Save; 30.01.2012
comment
Теперь я знаю, что такое АДЛ. Я думаю, что в моем случае, вероятно, лучше использовать пространство имен вместо класса. БЛАГОДАРНОСТЬ!! - person Jimmy Lu; 30.01.2012

Есть простой вопрос, который охватывает большинство ситуаций: если вы сделаете его классом, будет ли экземпляр этого класса иметь смысл и делать что-то полезное?

Если экземпляр полезен, вам нужен класс. В противном случае пространство имен, вероятно, является лучшим выбором.

person Jerry Coffin    schedule 30.01.2012
comment
в моем случае не было бы необходимости в экземпляре. Так что кажется, пространство имен для меня. - person Jimmy Lu; 30.01.2012

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

person Michael    schedule 30.01.2012
comment
Этот пост является спекулятивным, субъективным, по большей части вымыслом, а в остальном вымыслом желаемого за действительное. - person Kerrek SB; 30.01.2012
comment
Да, классы отлично подходят для объектно-ориентированного программирования, потому что они моделируют объекты. Но в вопросе конкретно говорится, что у него есть набор связанных функций, которые просто нужно инкапсулировать, а не то, что они моделируют объект. Он спрашивает, что лучше: статический класс или пространство имен. В статическом классе нет ничего особенно ООП, и в этом случае использование пространства имен, вероятно, является лучшим вариантом. Я понятия не имею, почему это имеет значение, простое это приложение или сложное; хороший дизайн есть хороший дизайн, будь то простой или сложный, один программист или тысяча. - person Cody Gray; 30.01.2012
comment
Как oop становится все более и более популярным? Разве его популярность не стабилизировалась за последние 10 лет или что-то в этом роде и даже не снизилась с внедрением функциональных возможностей в основные языки? - person fredoverflow; 30.01.2012