プログラミング、リファクタリング、そしてすべてにおける究極の疑問: No. 12

その他インテル® DPC++/C++ コンパイラー特集

この記事は、インテル® デベロッパー・ゾーンに公開されている「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 );
}

推奨事項

以前の記事と同様に、ここでも次の問題に対応します。類似するコードブロックを記述する場合、プログラマーはコードをコピーして、ペースト後に必要な部分を変更します。その際、特定の文字列や文字を変更し忘れることがあります。それは、プログラマーの集中力が低下する、一連の単調な作業の最後に起こりやすいです。

このようなミスを減らすためのヒントを以下に示します。

  1. 類似コードを「表」形式にします。そうすることで、ミスが見つけやすくなります。「表」形式のコードについては、次のセクションで説明します。この例ではあまり役立たないかもしれませんが、表形式は非常に有効なプログラミング手法です。
  2. コピー & ペーストを使用する際は、細心の注意が必要です。集中して作業し、記述したコードを再確認します。このとき、最後の数行には特に注意します。
  3. 最後の行問題について、常に念頭におき、同僚にも周知すると良いでしょう。このようなエラーがどのように発生するか知っていることは、それらを回避するのに役立ちます。
  4. 最後の行問題」のリンクを同僚と共有してください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました