フラグの管理

プログラムを書く時に悩むことはいろいろとありますが、その中の1つ、フラグの数が多くなってきた時の管理にも頭を使います。



例えば、状態Aの時、処理1をさせ、状態Aではない時に処理2をさせる(単純な排他制御)なら、話は簡単です。
例えば、次のように書けます。

(※便宜上、複数のプログラム言語を混ぜ合わせたような書式で記述していますが、そこは特に今回言いたいことではないので無視しちゃってください。)

if( joutaiA ) 
{
    shori1();

}else{
    shori2();

}


ここで、条件Bが登場したとします。状態A条件Bの時のみ、処理3をさせたくなったとします。
また、処理は1つのみしか行わないこととします。
そのときは、例えば次のように書けます。
if( joutaiA )
{
    if( joukenB )
    {
        shori3();
    
    }else{
        shori1();

    }
}else{
   shori2();

}


さらに、次のバージョンアップ用に新機能を追加しようと考えます。条件B条件Cの時に、新機能の処理4のみを実行させるようにします。
そのときは、次のように書けます。
if( joukenB && joukenC )
{
    shori4();

}else{
    if( joutaiA )
    {
        if( joukenB )
        {
            shori3();
        
        }else{
            shori1();
            
        }
    }else{
       shori2();
       
    }
}


さらにさらに、処理4が成功した時には条件Cではなくなって、失敗した時には条件Bではなくなるとします。ややこしいですね。
また、処理4が失敗した時は(条件さえあえば)他の処理1〜3を実行できるようにします。
そのとき、
if( joukenB && joukenC )
{
    shori4ret = shori4();   // 処理4を行い、結果をshori4retに代入する

    if( shori4ret == OK ){
        joukenC = FALSE;   // 処理4が成功したら条件Cを偽に
    }else{
        joukenB = FALSE;   // 処理4が失敗したら条件Bを偽に
    }
}else{
    ・・・     // (*)
}
と記述すると、処理4が失敗した時に、else の中身(*) が実行されません。
そこには気が付いたとします。

そこまではいいのですが、ついつい次のように書いてしまう可能性があります。
if( joukenB && joukenC )
{
    shori4ret = shori4();

    if( shori4ret == OK ){
        joukenC = FALSE;
    }else{
        joukenB = FALSE;
    }
}

if( !(joukenB && joukenC) )    // (*2)
{
    ・・・
}

上のように書いてしまうと、処理4が成功しても(*2)の処理に入ってしまいます。
これではバグとなります。

下のように書けば、正しく動くはずです。
shori4ret = NOT_RUN;

if( joukenB && joukenC )
{
    shori4ret = shori4();

    if( shori4ret == OK ){
        joukenC = FALSE;
    }else{
        joukenB = FALSE;
    }
}

if( shori4ret != OK )
{
    if( joutaiA )
    {
        if( joukenB )
        {
            shori3();
        
        }else{
            shori1();
            
        }
    }else{
       shori2();
       
    }
}



ここで示した例は、複雑なプログラムに比べれば比較的単純なものです。
フラグの数も
joutaiA, joukenB, joukenC, shori4kekka
の4つしかありません。
それでも、正しく記述しないと、簡単にバグは生みだされるのですね。

実際には、小規模なソフトウェアであってもフラグの数がもっと多いです。正しいフラグの管理が必要となってきます。

どういう条件の時には、どういう動きをさせる/させないという明確なイメージを持ちつつ、それをシートで管理していくのが 望ましいですが、実際はなかなかできてませんねぇ。
人間が考える以上、フラグが増えてくると想定外の条件の組み合わせというものは必ず起こります。

できるだけバグを生み出さないようにしたいものですね。


#毎度の事ながら、自分のソフトにバグがあることの言い訳みたいになってしまっている。。。(ちょっと反省、、ほんとにちょっとだけ)


戻る