しかし、静的メソッド、ヘッダー、クラス、またはその他のメソッドを使用する必要があるかどうかはわかりません。
ベストプラクティスは何ですか?しかし、ユーティリティ クラスのインスタンスは必要ありません。
次のような機能を追加したい:
Uint32 MapRGB (int r, int g, int b);
const char* CopyString(const char* char);
// etc. You know: utility methods...
しかし、静的メソッド、ヘッダー、クラス、またはその他のメソッドを使用する必要があるかどうかはわかりません。
ベストプラクティスは何ですか?しかし、ユーティリティ クラスのインスタンスは必要ありません。
次のような機能を追加したい:
Uint32 MapRGB (int r, int g, int b);
const char* CopyString(const char* char);
// etc. You know: utility methods...
それらをクラスに入れないでください。名前空間スコープで非メンバー関数にするだけです。
すべての関数が何らかのクラスのメンバー関数でなければならないというルールはありません。
1 つの要因は、それらをクラスに入れるか、名前空間に nomember として入れるかです (Java ではクラスを使用する必要がありますが、C++ では名前空間が提供されます)。
クラスメンバーにする場合、各関数について行う必要がある最も重要な決定は、パラメーターと戻り値を介して受け取られたり渡されたりしない状態を必要とするか、影響を与える必要があるかどうかです。そうでない場合はstatic
、「this」隠し引数を使用しないため、作成する必要があります。
名前空間の代わりにクラスを使用する理由の 1 つは、ユーティリティ クラスがその実装のために追加のメソッドを呼び出す必要がある場合です (たとえば、再帰、複雑な計算などの場合)。次に、メソッドstatic public
と、それが実装されているものを作成できますstatic private
。C++ を使用してから何年も経ちますが、名前空間で非メンバー関数を「隠す」ことはできないと思います (間違っている場合は誰かが訂正してください)。
関数インターフェイスの設計に関しては、引数の数を考慮してください。受信引数が多すぎる場合 (特に、それらの型が似ていて、一部が関連している場合)、複数の引数を渡す代わりに、追加の型を使用することを検討することをお勧めします。たとえば、 の代わりにcalculateVolume(int x, int y, int z)
、 のようなことをしたい場合がありますcalculateVolume(Point3D)
。同様に、あなたの場合、RGB クラスを使用します。ばかげているように思えるかもしれませんが、厄介なエラー (たとえば、int と RGB を受け取る関数がある場合) と時間 (値を他の関数に渡す必要がある場合) を節約できます。静的ファクトリ メソッドを作成して、引数を渡すときにこれらの型を作成しやすくすることができます。例えば:doSomethingWithColor(RGB.create(20,30,40))
これらの関数が論理的にクラスに属していない場合、これらの関数をクラスでラップする理由はおそらくありません。その場合、それらを無料の関数にすることができます。名前の衝突を避けるために、それらを名前空間に含めることが適切な場合があります。
MapRGB()
クラスのストリンガー論理グループを提供したい場合、それらをクラスの静的メンバー関数にすることに実際の害はありませんが、同じクラスのメンバーでCopyString()
ある必要があるような関数を持つ理由はわかりません。
関数をグループ化するだけで、グループのインスタンスを作成したくない場合は、それらをクラスではなく名前空間に配置することを検討する必要があります。
ただし、意味のある名前空間を使用しようとします。MapRGB と CopySstring を一緒に置くことはほとんど意味がありません。本当に両方が必要で、文字列や RGB マッピングを処理する関数が他にない場合は、それらを「ユーティリティ」名前空間に入れるのが理にかなっているかもしれませんが、それらを使用している場合は、より多くの文字列の「もの」といくつかの「色」のものであり、それぞれに名前空間を持つことでおそらく恩恵を受ける可能性があります。
私は通常、リンクされる "util" と呼ばれる .a (Windows では .lib) を持っています。ただし、通常、"util" クラスは悪いニュースであり、標準のオブジェクト指向設計を壊す依存関係を導入します。ここで、クラスを取り出して別のプロジェクトで再利用しようとすると、ユーティリティ ライブラリに何千もの依存関係が隠されています。基本的には便利ですが、そこに物を入れないように最善を尽くしてください。