2012-02-24 3 views
3

В прошлом, я бы писать классы так:Пространства имен C++ в качестве модулей?

// my_class.h 

class MyClass 
{ 
public: 
    // Signals emitted by MyClass objects. 
    typedef boost::signal<..> SignalA; 
    typedef boost::signal<..> SignalB; 

    enum SomeEnum 
    { 
     .. 
    }; 

    enum AnotherEnum 
    { 
     .. 
    }; 

    typedef some_type SomeOtherType; 

    // an exception thrown by MyClass objects 
    class ExceptionA 
    { 
     .. 
    }; 

    MyClass(); 

    // rest of class definition omitted 
}; 

То, что я всегда ненавидел этого стиля является то, что он свернут объявление класса. Итак, для недавнего проекта я решил попробовать что-то новое. Я решил использовать пространство имен способом, аналогичным тому, что модули в Python (мы также используем Python много, где я работаю):

// my_class.h 

namespace my_class 
{ 
    // Signals emitted by MyClass objects. 
    typedef boost::signal<..> SignalA; 
    typedef boost::signal<..> SignalB; 

    enum SomeEnum 
    { 
     .. 
    }; 

    enum AnotherEnum 
    { 
     .. 
    }; 

    typedef some_type SomeOtherType; 

    // an exception thrown by MyClass objects 
    class ExceptionA 
    { 
     .. 
    }; 

    class MyClass 
    { 
    public: 
     MyClass(); 
     .. 
    }; 
} 

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

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

+2

Я бы сказал, что увеличенная многословие - это хорошо, и почти полностью перестали использовать инструкцию 'using'. По-прежнему используйте его для глубоко вложенных пространств имен, например, в Boost. У меня также есть много вложенных (только пары уровней) пространств имен в моих проектах, и почти единственный код не в пространстве имен является функцией 'main'. –

ответ

2

Кроме имени my_class, все должно быть хорошо. На самом деле, это цель пространств имен.

+0

Ну, аргументация в том, что он назвал его «my_class», состоит в том, что он назван в честь «основного» класса, предоставляемого этим пространством имен, за исключением использования стиля «разделенные словами», а не «PascalCasing». Это похоже на стиль, часто используемый в Python, где модуль называется myclass (они не любят использовать символы подчеркивания там по какой-либо причине), а класс, предлагаемый myclass.py, называется MyClass. –

1

Это именно то, как вы должны это делать. Следует иметь в виду, что вы хотите избежать круговых зависимостей между пространствами имен. Кроме того, IMHO - это хорошая идея для каждого пространства имен, соответствующего отдельной библиотеке. Это также подразумевает, что вам следует избегать слишком глубокого вложения пространств имен. Может быть, одно пространство имен верхнего уровня для вашей компании, чтобы отличать от стороннего кода, а затем еще один уровень пространств имен для отдельных компонентов.

+3

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

+0

Хорошая точка. Я отредактировал ответ. – Dima

Смежные вопросы