これは単なる一般的なヘルプの質問です。問題を解決するために必要なすべてのステートメントを含む 1 つの長く複雑な関数を使用するよりも、C++ アプリケーションのコードに一連の小さな関数を使用する利点は何ですか?
5 に答える
このニーモニックの編集クレジットは、OP のコメント作成者に送られます。
大きな機能をいくつかの小さな機能に分割すると、MURDERが発生する可能性があります。この場合、これは良いことかもしれません。:)
M -保守性。小さくて単純な関数は保守が容易です。
U -分かりやすさ。シンプルな機能は理解しやすい。
R -再利用性。一般的な操作を別の関数に移動することで、コードの再利用を促進します。
D -デバッグ可能性。複雑な関数よりも単純な関数をデバッグする方が簡単です。
E -拡張性。コードの再利用と保守性により、関数のリファクタリングが 6 か月で容易になります。
R -回帰。再利用とモジュール化は、より効果的な回帰テストにつながります。
大きな関数を小さな関数に分割することには、潜在的な利点がいくつかあります。それらが私の脳から落ちた順序で:
コードの再利用を促進します。多くの場合、大規模な関数では、多かれ少なかれ同じことを何度も行う必要があります。これを 1 つの共通関数に一般化することで、その 1 つのコード ブロックを複数の場所で使用できます。
コードの再利用は、潜在的なバグを複数ではなく 1 つの場所に分離することで、堅牢性と保守性を高めるのに役立ちます。
コードの行数が少なく、適切な名前の関数への呼び出しが多いほど、関数のセマンティクスを理解しやすくなります。
複数のリターン ポイントを持つ関数に反対する場合は、大きな関数を分割すると、それらを減らすのに役立ちます。
他の方法では気づきにくい微妙なデータの依存関係に関する (潜在的な) 問題を特定して分離するのに役立ちます。
ただし、これについては、良い面と悪い面があることに注意することが重要です。大きな関数を分割することには、いくつかの潜在的な欠点もあります。
大きな機能が以前は機能していた場合、それをモジュール化しようとすると、欠陥が生じる可能性があります。
マルチスレッド アプリケーションでは、同期ポリシーが微妙であったり、単に間違っていたりすると、デッドロックや競合状態が発生する可能性があります。
関数呼び出しによるパフォーマンス ヒットが発生する可能性があります。
より明確なコードは、理解と保守が容易になることを意味します。
1 つの大きな複雑な関数は、complex です。
コードを個別の関数に分割すると、コードの操作がはるかに簡単になります。まず、特定のタスクを実行するコードの部分を探す場合、それが独自の関数内にあるかどうかを簡単に見つけることができます。
第 2 に、関数を変更するのは、単純であればはるかに簡単です。その関数を変更するために大量のコードを理解する必要はありません。
また、単一の大きな関数だけでなく、より多くの目的に使用できる小さな関数に分割すると、別のプロジェクトでそのコードを再利用しやすくなる場合があります。
プログラムを複数の関数に分割する利点は次のとおりです。
- ほとんどのプログラムには、複数の場所で必要とされるいくつかの基本的な機能があります。その機能が別の関数にあるということは、同じ機能が使用されている場合に、より明白になり、問題を一度だけ修正する必要があることを意味します。
- プログラムを関数に分割することで、コードに複数レベルの抽象化を導入できます。メイン関数では、プログラムが何をするかの広範な概要を取得し、呼び出しツリーの各レベルを下に移動すると、特定の側面がどのように実現されるかがより詳細に明らかになります。
医療機器システムでは、コードを小さな断片に分割することで、回帰テストの必要性が減り、変更の影響をより小さな範囲に絞り込むことができます。
たとえば、1 つのファイルに 3 つのテーマに対して 15 の関数があるとします。
ファイル内の関数の 1 つを変更すると、すべてを再構築して再テストする必要があります。
ファイルをそれぞれ 5 つの関数の 3 つの個別のファイルに分割すると、5 つの関数を再構築して 5 つの関数を再テストするだけで済みます。5 つの機能をテストすると、15 の機能よりも短いテスト時間で済みます。
また、チームが同じコード ベースで作業している場合、コードを分割すると、2 人以上の人が同じファイルで作業する可能性が低くなります。複数のユーザーが同じファイルで作業していると、チェックイン中に 1 人のコードが誤って削除されるなど、多くの競合が発生します。