Lors d’une refactorisation de code une technique qui peut être intéressante est celle permettant d’inverser deux blocs if imbriqués.
Cela peut permettre ainsi de faire apparaître deux blocs équivalents.
L’exemple suivant (tiré du Kata Gilded Rose) est assez parlant :

// premier bloc
if (item.name == "Sulfuras, Hand of Ragnaros") {
    item.sellIn = item.sellIn - 1
}

// second bloc
if (item.sellIn < 0) {
    if (item.name == "Aged Brie") {
        if (item.quality < 50) {
            item.quality = item.quality + 1
        }
    }
}

Il serait préférable de faire ressortir le test sur le nom de l’item dans le second bloc afin qu’il soit au premier niveau.
Pour cela nous allons d’abord dupliquer le if que nous souhaitons inverser. Cela peut paraître contre-productif de dupliquer du code mais dans le cadre de la refactorisation il est souvent souhaitable dans un premier temps de multiplier la duplication du code avant de pouvoir généraliser le code dans un second temps :

// if dupliqué
if (item.name == "Aged Brie") {
    if (item.sellIn < 0) {
        if (item.name == "Aged Brie") {
            if (item.quality < 50) {
                item.quality = item.quality + 1
            }
        }
    }
}

Une fois ceci fait nous relançons les tests avant de pouvoir supprimer la condition devenue superflue.
Afin de nous assurer que notre changement est correct nous pouvons déjà remplacer la condition dans le if doublon par true :

if (item.name == "Aged Brie") {
    if (item.sellIn < 0) {
        // condition superflue : item.name == "Aged Brie" est remplacé par true
        if (true) {
            if (item.quality < 50) {
                item.quality = item.quality + 1
            }
        }
    }
}

Nous relançons les tests et nous pouvons désormais supprimer sans réfléchir le if superflu :

if (item.name == "Sulfuras, Hand of Ragnaros") {
    item.sellIn = item.sellIn - 1
}

if (item.name == "Aged Brie") {
    if (item.sellIn < 0) {
        // condition superflue supprimée
        if (item.quality < 50) {
            item.quality = item.quality + 1
        }
}
}

Désormais le code fait apparaître les instructions if sur le nom de l’item au même niveau, nous permettant d’avancer dans la refactorisation…