コード匂い111 -横断している間、コレクションを修正すること


追跡中のコレクションの変更は予期しないエラーにつながる可能性があります

TL;DR: Do not modify collections while traversing them



問題
  • 予想外の結果
  • 並行性問題

  • 解決策
  • コレクションの変更を避ける
  • コピーを作る

  • 文脈
    我々は、コレクションをコピーすることは高価である偏見で我々の解決を最適化します.
    これは、中小規模のコレクションには該当しません.
    言語は多くの異なる方法でコレクションを繰り返します.
    それらを変更することは一般に安全ではない.

    サンプルコード

    間違い
    Collection<Integer> people = new ArrayList<>();
    //here we add elements to the collection...
    
    for (Object person : people) {
        if (condition(person)) {
            people.remove(person);
        }
    }
    //We iterate AND remove elements 
    


    Collection<Integer> people = new ArrayList<>();
    //here we add elements to the collection...
    
    List<Object> iterationPeople = ImmutableList.copyOf(people);
    
    for (Object person : iterationPeople) {
        if (condition(person)) {
            people.remove(person);
        }
    }
    //We iterate a copy and remove from original
    
    coll.removeIf(currentIndex -> currentIndex == 5);
    //Or use language tools (if available)
    

    検出
    [ X ]半自動
    多くの言語は、コンパイル時と実行時の両方を制御します.

    タグ
  • 失敗する

  • 結論
    これは私たちが最初のコースで学ぶものです.
    これは、業界と現実世界のソフトウェアの多くが発生します

    関係



    詳しい情報
  • Stack Overflow

  • クレジット
    写真でChristine Roy on Unsplash
    バグはバグです.バグを使用してコードを書く.ランタイムセーフの意味で安全な言語であるなら、オペレーティングシステムは、危険な方法でバッファオーバーフローを行う代わりにクラッシュします.
    ケントンプソン


    この記事はCodesmellシリーズの一部です.