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

同カテゴリーの次の記事

コードの現代化を実践: スレッド化、メモリー、ベクトル化の最適化

この記事は、インテル® デベロッパー・ゾーンに公開されている「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. 最後の行問題」のリンクを同僚と共有してください。

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

関連記事

  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • 比較関数の罠比較関数の罠 この記事は、インテル® デベロッパー・ゾーンに公開されている「The Evil within the Comparison Functions」の日本語参考訳です。 この記事の PDF […]
  • インテル® AVX 命令を使用した complex float データ型の IIR フィルターの実装インテル® AVX 命令を使用した complex float データ型の IIR フィルターの実装 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Intel® AVX Realization Of IIR Filter For Complex Float Data」の日本語参考訳です。 はじめに この記事では、インテル® AVX の SIMD (Single Instruction […]
  • マルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発するマルチスレッド開発ガイド: 4.6 インテル® Parallel Composer を利用して並列コードを開発する コードの並列化にはさまざまな手法があります。この記事では、インテル® Parallel Composer で利用可能な手法の概要を説明し、各手法の主な長所を比較します。インテル® Parallel Composer は Windows* 上の C/C++ を使用した開発のみを対象としていますが、これらの手法の多くは Fortran や […]
  • 並列プログラミングにおけるロックの効率的な使用並列プログラミングにおけるロックの効率的な使用 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Using Locks Effectively in Parallel Programming […]