非メンバークラス関連の関数を定義する場合は、通常はヘッダーファイルまたはソースファイルに記述しますか?これは一般にベストプラクティスですか?それともすべての個人的な好みですか?非メンバークラスに関連する関数のスタイル付け
1
A
答えて
0
常に視認性を最小限に抑えるようにしてください。あなたが唯一のソースファイルで、あなたの機能が必要な場合は、無名の名前空間にそれを置くことができます。
// Your .cpp
namespace
{
void yourHelperFunction(void) // only visible in the translation unit
{
...
}
}
// 私は家に帰る途中で、現在ですが、私は高い評判を必要とするので、私はコメントしたかったです..多分私は後で私の答えを洗練するつもりです。
0
私は通常、再使用の要件に応じて、C++のヘルパー関数の4つの戦略のうちの1つを選択します。
1.関数は大規模で、1つのソースファイルでのみ使用されていますか?
これは、単一の.cppファイルに必要とされる機能であり、あなたの.ccpファイルの先頭に匿名の名前空間に入れて、複数の場所で使用されようとしている場合:
namespace
{
int myHelperFunc()
{
int result = 0;
....
return result;
}
}
...
bool MyClass::someMethod()
{
return 0 != myHelperFunc();
}
void MyClass::someOtherMethod()
{
if (0 == myHelperFunc())
{
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
}
}
これにより、ヘルパー機能を再利用できますが、名前の競合の可能性はありません。
利点
- 単一のファイルに制限範囲。
- 同じ名前を持つ他のファイルの他のヘルパー関数との名前の競合はありません。ヘルパー関数の
欠点
- 多数は、限られた範囲の機能を持つファイルを汚染することができ、ソースファイルの先頭でドロップ。
2.関数がクラス状態にアクセスする必要がありますか?
ヘルパー関数が内部クラス状態にアクセスする必要がある場合は、それをプライベートメソッドにします。
int MyClass::myStatefulHelperFunc()
{
int result = 0;
if (IsInitialized())
{
....
}
return result;
}
...
bool MyClass::someMethod()
{
return 0 != myStatefulHelperFunc();
}
void MyClass::someOtherMethod()
{
if (0 == myStatefulHelperFunc())
{
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
}
}
利点
- 単一のクラスに限定スコープ。
- クラス状態へのアクセス。
- 派生クラスが代替実装でヘルパーをオーバーライドできるように仮想化することができます。
デメリット
- は、ヘッダファイルで宣言する必要があります。
3.この関数は複数のソースファイルで役立ちますか?
ヘルパー関数は、コードベースの複数の場所で使用される可能性があります場合は、それ自身の名前空間内のそれ自身のファイルにそれを抽出します。
HelperFunction.h
namespace ProjectHelpers
{
/**
* \brief Do helpful thing.
*
* \return a helpful integer.
*/
int myHelperFunc();
}
利点
- 簡単にアクセスできるどこかでからコードベース。複数のクラス/翻訳単位間で共有ヘルパー関数の
欠点
- 多数は、コードのにおいの指標とすることができます。
4.ヘルパー機能は1つの機能に制限されていますか?
ヘルパー関数が非常に小さく、その使用法が1つの関数に限定されている場合は、ラムダ関数を作成し、C++アルゴリズム関数(たとえばstd::for_each()
)を使用する他の関数と同様に使用できます。
利点
- 単一の機能に限定されるものでスコープ。
- 変数に代入することで、関数内の複数の場所で使用できます。
欠点
- C++ 11以降のみ。ヘルパー関数のための
5. ...その他のオプション
その他のオプション静的クラスの機能とコピー/貼り付けコードが含まれています。上記の各戦略にはそれぞれ利点と欠点がありますので、独自のコードベースに最適なアプローチを決定するのはあなた次第です。
関連する問題
- 1. エンティティフレームワーク非キーフィールドとの関連付け
- 2. Xamarinのボタンにプログラムでスタイルを関連付ける方法は?
- 3. belongs_toのデフォルトの関連付け=(関連付ける)メソッドをオーバーライドする方法?
- 4. 2つのデータベーステーブルの関連付け(従業員をアクティビティに関連付ける)
- 5. Mysqlは2つのテーブルを関数に関連付ける
- 6. SailsJSによる関連付け:関連付けの作成方法?
- 7. 構造変数を関連付ける?
- 8. 複数のレベルでの関連付け
- 9. モデル内の複数の関連付け
- 10. Railsのhas_manyの関連付け:私は、次の2つの関連付けを持って、関連するオブジェクト
- 11. CakePHP複数モデルの関連付け
- 12. Railsアクティブなレコード数の関連付け
- 13. Backbone.js:イベントコールバック関数にパラメータを関連付ける
- 14. オペレータをラムダ関数に関連付けるマップ
- 15. Rails関数/メソッドをhtml.erbに関連付ける
- 16. 関連付けるイベント
- 17. CakePHP 2.0ページネーションとサムの関連付け関連するモデル
- 18. Uncrustifyファイルの関連付け
- 19. Rails:モデルの関連付け
- 20. アクティブモデルシリアライザとの関連付け
- 21. Railsモデルの関連付け
- 22. Sequelizeの関連付け値
- 23. Rubyクラスの関連付け
- 24. クラスの関連付け
- 25. アソシエーションの関連付けを続ける
- 26. 各記事を関連情報に関連付ける
- 27. has_many関連、複数の関連付けを1つの列に格納
- 28. ワードの関連付けをカウントする
- 29. DQLクエリと関連付け?
- 30. Railsでの適切な関連付けに関する質問