2011-11-08 10 views
4

私は、例えば、 pingServer、checkUserValidAccount、countDistanceのように、すべてが1つのことを行う多くの小さな関数を持っています。多くの単一の関数を扱うベストプラクティス

すべての関数を単一のクラスにラップする価値はありません。

このような多くの小さな関数を処理するためのC++のベストプラクティスは何ですか?

たとえば、NetworkHelpersのようなヘルパーと呼ばれるクラスを書くことがありますか?

答えて

6

namespaceに配置することはオプションです。私はクラスの必要性を見ません。クラスのインスタンスは状態を表すことを意味しますが、あなたは自由な関数の束を記述しています。したがって、ステートレスなシステムです。

"すべての関数を単一のクラスにラップする価値はありません。" - これは、クラスを作成しないという決定をするための有効な議論ではありません。クラスは単一のメンバと単一のメソッドを持つことができますが、その背後にロジックがある場合は、それを記述する必要があります。

あなたの関数とロジックがクラスの使用を義務づけていて、関数が同じロジックを持ちますがオブジェクトによって異なる動作をする場合は、必ずクラスを作成してください。あなたの唯一の目的は、論理がクラスの同じインスタンスに本当に依存していないときに、関数をまとめてグループ化することです。あなたの質問をもとに

例:あなたが見ることができるように

namespace NetworkHelpers 
{ 
    //free function, use a namespace 
    bool pingServer(std::string hostname); 
} 

//alternative, where the object has a state: 
class ServerConnection 
{ 
    std::string _hostname; 
public: 
    NetworkHelpersClass(std::string hostname) 
    { 
     _hostname = hostname; 
    } 
    bool pingServer() 
    { 
     return NetworkHelpersNamespace::pingServer(_hostname); 
    } 
}; 

は、名前空間内で、関数がパラメータ以外には依存しません。

クラス内には状態があり、サーバーごとにオブジェクトを作成するので(オブジェクトに応じて同様の動作ですが)、オブジェクトは状態を持つため、パラメータなしで関数を呼び出します。

これが明らかになることを望みます。

+1

ここで、「機能」とは「クラス」を意味しますか? :) – themel

+0

@themel、はい、私はポストボタンを押すとすぐに私の答えを編集しました。 :) –

+0

私はさらに注意してください:名前空間の選択に関しては、関数を同じ名前空間( 'std'ではなく)に引数として入れるのは良い習慣です。 。名前空間に存在する引数を取らない場合( 'std'以外の場合)は、その戻り型の名前空間を考慮してください。名前空間がまったく呼び出されない場合は、名前空間を作成します。 –

1

一部の言語とは異なり、C++ではすべての関数をクラスに入れる必要はありません。クラスに属さない関数がある場合は、それらを名前空間に入れます。

0

名前空間以外のベストプラクティスを追加することができます:DLL内の関数をグループ化して、依存関係を詳しく調べることができます。 循環リンクを避け、できるだけ依存性が最小の低レベルライブラリを作成します。

関連する問題