Steve McConnell のチェックリスト項目の 1 つは、ループ インデックスを操作しないことです(第 16 章、25 ページ、ループ インデックス、PDF 形式)。
これは直感的に理解できるものであり、昔プログラミングの方法を学んだときを除いて、私がいつも守ってきた方法です。
最近のコード レビューで、私はこのぎこちないループを発見し、すぐに疑わしいとフラグを立てました。
for ( int i=0 ; i < this.MyControl.TabPages.Count ; i++ )
{
this.MyControl.TabPages.Remove ( this.MyControl.TabPages[i] );
i--;
}
すべての TabPages が削除されるまでインデックスを 0 に保つことで機能するので、ほとんど面白いです。
このループは次のように記述できます。
while(MyControl.TabPages.Count > 0)
MyControl.TabPages.RemoveAt(0);
そして、コントロールは実際にはループとほぼ同時に書かれたので、次のように書かれた可能性さえあります
MyControl.TabPages.Clear();
それ以来、私はコード レビューの問題について異議を唱えられてきましたが、なぜそれが悪い習慣なのかについての私の明確な説明は、私が望んでいたほど強力ではなかったことがわかりました。ループの流れを理解するのが難しく、そのため保守とデバッグが難しくなり、最終的にはコードの存続期間中により多くの費用がかかると言いました。
これが悪い習慣である理由をより明確に説明するものはありますか?