2012-02-24 5 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 
}; 

私はいつもこのスタイルについて嫌っ事は、それはクラス宣言を回旋ということです。それで、最近のプロジェクトでは何か新しいことを試すことにしました。

// 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(); 
     .. 
    }; 
} 

、結果はそれほど悪くはなかった:私は(我々はまた、Pythonの私は仕事をたくさん使用してください)Pythonでのモジュールの場合と同様の方法で名前空間を使用することにしました。唯一の欠点は、すべての前に常に "my_class ::"という接頭辞を付ける必要があったことです。しかし、それは "using"ステートメントを利用することで緩和することができます。

私は別のプロジェクトを開始しようとしており、もう一度やり直すことを考えていました。この名前空間の使用を採用することに重大な欠点(冗長性の向上以外)がありますか?

+2

私は、増加した冗長性は良いことであり、 'using'ステートメントの使用をほぼ完全に停止したと言います。 Boostのような深くネストされた名前空間にはまだそれを使用してください。また、私のプロジェクトにはネストされた(数レベルの)ネームスペースがたくさんあり、ネームスペースにない唯一のコードは 'main'関数です。 –

答えて

2

名前my_class以外は問題ありません。実際、それが名前空間の目的です。

+0

「my_class」という名前の背後にある理由は、PascalCasingの代わりにアンダースコアで区切られた単語を除いて、その名前空間によって提供される「プライマリ」クラスの名前が付けられているということです。これはモジュールがmyclassという名前のPythonでよく使われるスタイルに似ています(何らかの理由でそこにアンダースコアを使用したくない)myclass.pyによって提供されるクラスの名前はMyClassです。 –

1

これはあなたがそれを行う方法です。名前空間間の循環依存関係を避けたいということを忘れないでください。さらに、IMHOは、各名前空間が別々のライブラリに対応することをお勧めします。つまり、ネームスペースをネストスペースに入れすぎないようにする必要があります。あなたの会社が第三者のコードと区別するためのトップレベルのネームスペース、そして個々のコンポーネントのネームスペースの別のレベル。

+3

私が最初に名前空間を使い始めたとき、私は製品の名前をつけた名前空間の下にすべてを包むという考えを試みました。これは、後で別の製品でその製品のコンポーネントを使用したかったときに、痛みであることが判明しました。古い製品にちなんだネームスペースを残しておくか(厄介な、混乱する可能性がある)、検索と置換を行って製品名を新製品の名前に変更します(エラーが発生する可能性があります)。私が働いている会社にちなんで名付けられた名前空間の下にあるものはすべて、プロジェクトからプロジェクトに変更する可能性が最も低いので合理的です。 –

+0

良い点。私は答えを編集しました。 – Dima

関連する問題