ブロックは画面に収まるくらいに

仕事で不具合調査をしていてぶち当たったコード。当然そのまま出すわけにはいかないので具体的な処理を覗いた部分をのせる。

int func(void)
{
    while(1) {
        if ( A ) {
            if ( B ) {
                if ( C ) {
                   
                }
            } else {
                if ( D ) {
                    if( E ) {
                        if ( F ) {
                            if ( G ) {

                            }
                        } else {
                            if ( H ) {

                            }
                        }
                    } else {
                        if ( I ) {

                        }
                    }
                } else {
                    if ( J ) {
                        if ( K ) {

                        }
                    } else if( L ) {
                        if( M ) {

                        } else {

                        }
                        if( N ) {

                        }

                    }
                }
            }
        }
    }

    return 0;
}

うーん。深いコードだ。ついでにブロックが広い。たとえば最初のifブロック(A)はどこまでかかっているのかAの部分を見ているだけではさっぱりわからない。これは実はループ全体にかかっているのだ。これじゃわからんので解析のためだけに同値のコードを書き直す。

int func(void)
{
    while(1) {
        if ( !A ) {
            continue;
        }

        if ( B ) {
            if ( C ) {

            }
            continue;
        }

        if ( D ) {
            if( E ) {
                if ( F ) {
                    if ( G ) {

                    }
                } else {
                    if ( H ) {

                    }
                }
            } else {
                if ( I ) {

                }
            }
            continue;
        }

        if ( J ) {
            if ( K ) {

            }
        } else if( L ) {
            if( M ) {

            } else {

            }
           
            if( N ) {

            }

        }

    }

    return 0;
}

意味的に無理矢理な部分もあるが設計書が無いんじゃ!とにかく読みやすいようにするぜ、ってことでelse節が残り部分にかかっている時はifをcontinueで抜けてしまうようにした。これでcontinueが見えている部分ではとにかく処理が一区切りになるので見通しがよくなる。ネストも深くならない。
DEFGの部分が気になるがロジックとしてこれ以上切り分けが難しいし、なんとかこの部分が一画面に収まる。

人間のレジスタって7つぐらいらしい。ネストが深くなると思考もスタックしなきゃならないしブロックが広いとそれだけレジスタを消費する。とにかく画面に収まる範囲で動作を把握できるようになっていてほしい。