私は「並列配列」またはリストと呼ぶものを使用するコード(新しいコード)を実行しています。つまり、関連データを含む2つの配列があり、配列内の位置(インデックス)によってリンクされています。
私はこれを混乱させ、あらゆる種類のエラーを起こしやすいと考えています。私が通常提案する解決策は、フィールドCompanyIdおよびCompanyNameを持つCompany
というオブジェクトを作成することです。
非常に現実的な例:
List<string> companyNames;
List<int> companyIds;
//...They get populated somewhere and we then process
for(var i=0; i<companyNames.Count; i++)
{
UpdateCompanyName(companyIds[i],companyNames[i]);
}
これらの並列配列は悪い習慣と見なされていますか?
誰かがparrel配列を使用するかもしれないいくつかの理由はここにあります:
この場合、これを実行するための説得力のある理由は見当たらない...そして、上記のすべてにおそらくより良いオプションがあるか、高級言語ではそれほど有用ではない。
私は 並列配列の使用の罪 をしてきました。時々、あなたは構造に夢中になって、それを抽象化する方法について考えたくないほどです。抽象化はリファクタリングが少し難しい場合があるので、本当に必要なものを証明するまでは、抽象化をすぐに起動することに消極的です。
ただし、詳細を抽象化してリファクタリングすることを検討する価値はあります。多くの場合、私がそれを行うのをためらう最大の理由は、良い名前を考えるのが難しいことです。
並列配列を抽象化する良い方法が見つかれば、毎回そうしてください。しかし、それらに触れることを拒否することによって自分を麻痺させないでください。時には、ちょっとした汚いコードが素晴らしいコードへの最高の足がかりになることがあります。
このパターンは Structure of Arrays とも呼ばれ(Array of Structuresとは対照的)、コードをベクトル化するときに非常に役立ちます。 SSEコンパイラ組み込み関数を1つではなく4つの構造で実行するように組み込み関数を使用する以外は、単一の構造で実行してそのビットをベクトル化する計算を作成するのではなく、通常どおり計算を作成します。これは通常は簡単で、ほとんどの場合高速です。SoAフォーマットはこれを非常に自然にします。また、整列を改善し、SSEメモリ操作を高速化します。