【速攻解消】IF文のネストを浅くするテクニックとその方法

リファクタリング

IF文のネストを浅くするテクニックとして、『反転』と『分割』について、実際にコードをリファクタしながら解説してきます。

開発保守フェーズに入ったシステムでは度々ネストしているコードに出会います。負の遺産とまでは言いませんが、無暗にネストするべきではありません。

大きな理由として「可読性が下がる」、「テスト工数が増える」からです。

そんなIF文のネストも、これから解説する『反転』と『分割』を覚えておけば、もう恐れることはありません。

それでは早速、IF文がネストしているコードをリファクタしていきましょう。

『反転』と『分割』を駆使してIF文のネストを浅くする

Integer hoge = 0;
Integer fuga = 0;

if(hoge != null && hoge != 0) {
    if(fuga == 1){
        // 処理A

        return;
    }else{
        // 処理B

        return;
    }
}else{
    // 処理C

    return;
}

今回は上記のコードをリファクタしていきます。

この手のコードはまず反転させるところから始まります。

IF/ELSEを反転させる

Integer hoge = 0;
Integer fuga = 0;

if(!(hoge != null && hoge != 0)) { // -- (1)
    // 処理C
    return;
}else{
    if(fuga == 1){
        // 処理A
        return;
    }else{
        // 処理B
        return;
    }
}

IF/ELSEのIF側の条件に否定(!)を付与して、IFとELSEを反転させます。否定(!)を付与したことでIF側とELSE側とで中身の処理が入れ替わります。

※(1)が否定(!)を付与した箇所

IF/ELSEを分割する

Integer hoge = 0;
Integer fuga = 0;

if(!(hoge != null && hoge != 0)) {
    // 処理C
	return;
}
if(fuga == 1){
    // 処理A
	return;
}else{
    // 処理B
	return;
}

ELSEの中にネストされていた処理A、および処理BのIF/ELSEを外に出してIF文を分割します。

これでネストは解消されました。しかし、このままだと否定(!)がネストしているのでよろしくありません。

そこで登場するのがド・モルガンの法則です。

ド・モルガンの法則を利用すると否定(!)のネストだって浅くできます。

ド・モルガンの法則を利用して否定(!)のネストを浅くする

ターゲットは「if(!(hoge != null && hoge != 0)) {」箇所です。

// 1.ターゲット
if(!(hoge != null && hoge != 0)) {

     ↓

// 2.条件を反転、そして、否定(!)する
if(!(!(hoge == null || hoge == 0))) {

     ↓

// 3.重複した否定(!)を削除する
if(hoge == null || hoge == 0) {

2番目の状態、つまり、「条件を反転、そして、否定(!)する」このタイミングでド・モルガンの法則を利用しています。

ド・モルガンの法則の詳細についてはググってください。

とにかく「条件を反転、そして、否定(!)する」を覚えておけば問題ないでしょう。

リファクタ前後でコードを見比べる

下記コードがリファクタ後です。

Integer hoge = 0;
Integer fuga = 0;

if(hoge == null || hoge == 0) {
    // 処理C
	return;
}
if(fuga == 1){
    // 処理A
	return;
}else{
    // 処理B
	return;
}

下記コードがリファクタ前です。見比べてください。

Integer hoge = 0;
Integer fuga = 0;

if(hoge != null && hoge != 0) {
    if(fuga == 1){
        // 処理A

        return;
    }else{
        // 処理B

        return;
    }
}else{
    // 処理C

    return;
}

さいごにまとめ

  • IF/ELSEのIF側を否定(!)するとIF/ELSEが反転する
  • ELSE側の中身をIF文の外に分割できないか検討する
  • ド・モルガンの法則を利用することで条件を変えずに否定(!)ネストを削除できる

特にド・モルガンの法則は一度覚えてしまえば大変便利なもののため、ぜひ使いこなせるようになりましょう。

最後に、今回解説したテクニック含め、既存のソースコードを安全にリファクタリングするテクニックを知りたいという方には下記の書籍がオススメ。リファクタするなら一度は読んでおきたい一冊です!

コメント

タイトルとURLをコピーしました