この記事は、インテル® デベロッパー・ゾーンに公開されている「The Ultimate Question of Programming, Refactoring, and Everything」の日本語参考訳です。
12. コピー & ペーストを使用する場合は特に最後の行に注意する
この問題は、Source SDK プロジェクトで見つかりました。このエラーは、次の PVS-Studio 診断によって検出されます。
V525 The code containing the collection of similar blocks. Check items ‘SetX’, ‘SetY’, ‘SetZ’, ‘SetZ’. (V525 コードに類似ブロックのコレクションが含まれています。項目 ‘SetX’、’SetY’、’SetZ’、’SetZ’ を確認してください。)
inline void SetX( float val ); inline void SetY( float val ); inline void SetZ( float val ); inline void SetW( float val ); inline void Init( float ix=0, float iy=0, float iz=0, float iw = 0 ) { SetX( ix ); SetY( iy ); SetZ( iz ); SetZ( iw ); }
説明
私は、このコードがコピー & ペーストを使用して記述されたものであると確信しています。最初の行を何回かコピーして、ペースした後に各行の特定の文字を変更したのでしょう。プログラマーは、最後の行で文字 ‘Z’ を ‘W’ に変更するのを忘れています。
この例で重要なことは、プログラマーがミスしたことではなく、一連の単調な作業の最後にミスがあることです。
詳しくは、「最後の行問題」をお読みください。
簡潔に述べると、コードをコピー & ペーストする場合、プログラマーはペーストした行の最後でよくミスをします。これは単なる私の推測ではなく、統計的に証明されています。
正しいコード
{ SetX( ix ); SetY( iy ); SetZ( iz ); SetW( iw ); }
推奨事項
以前の記事と同様に、ここでも次の問題に対応します。類似するコードブロックを記述する場合、プログラマーはコードをコピーして、ペースト後に必要な部分を変更します。その際、特定の文字列や文字を変更し忘れることがあります。それは、プログラマーの集中力が低下する、一連の単調な作業の最後に起こりやすいです。
このようなミスを減らすためのヒントを以下に示します。
- 類似コードを「表」形式にします。そうすることで、ミスが見つけやすくなります。「表」形式のコードについては、次のセクションで説明します。この例ではあまり役立たないかもしれませんが、表形式は非常に有効なプログラミング手法です。
- コピー & ペーストを使用する際は、細心の注意が必要です。集中して作業し、記述したコードを再確認します。このとき、最後の数行には特に注意します。
- 最後の行問題について、常に念頭におき、同僚にも周知すると良いでしょう。このようなエラーがどのように発生するか知っていることは、それらを回避するのに役立ちます。
- 「最後の行問題」のリンクを同僚と共有してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。