Techniques de refactorisation du code Dupliquer le code

Dans le processus de développement de notre projet, il est parfois facile d'écrire et d'écrire. Pour certains codes métier, nous devons les écrire à plusieurs reprises, de sorte que lorsque nous devons les modifier ultérieurement, nous devons retrouver ces codes répétés partout dans l'ensemble. projet, ce qui est vraiment une mauvaise chose.

1. Dupliquer le code

définition

Le code dupliqué ne fait pas référence exactement au même code. Tant qu'il y a un morceau de code ou de traitement métier, on peut parler de code dupliqué.

Influence

Trop de code répétitif rendra le code trop long et difficile à lire, et si la logique du code doit être modifiée, cela rendra le code facile à manquer et difficile à maintenir.

Deuxièmement, le cas du code répété

2.1 Duplication de code entre plusieurs méthodes d'une même classe

Il existe les codes suivants, qui doivent calculer le prix des fruits. La formule de calcul du prix des conduites d'eau ordinaires est le prix de la quantité de fruits et le prix des produits à prix réduit est la quantité de fruits et le prix des fruits * remise. On peut le voir que le code suivant, la logique de calcul du prix selon le type de fruit est Répéter, si le prix du fruit change, chaque méthode doit changer.

/**
 * 计算水果总价(同一个类的两个函数含有相同的表达式)
 *
 */
public class FruitsCost {
    
    
    public double computeMoneyWithoutPrivileges(String type, int numbers) {
    
    
        double prices;
        switch (type) {
    
    
            case "apple":
                prices = 5.5;
                break;
            case "banana":
                prices = 4.0;
                break;
            case "strawberry":
                prices = 10.5;
                break;
            default:
                throw new IllegalArgumentException("Illegal type : " + type);
        }
        return prices * numbers;
    }
    public double computeMoneyWithPrivileges(String type, double numbers, double discount) {
    
    
        double prices;
        switch (type) {
    
    
            case "apple":
                prices = 5.5;
                break;
            case "banana":
                prices = 4.0;
                break;
            case "strawberry":
                prices = 10.5;
                break;
            default:
                throw new IllegalArgumentException("Illegal type : " + type);
        }
        return prices * numbers * discount;
    }
}

Solution
Pour la duplication de code entre plusieurs méthodes d'une même classe, vous pouvez utiliser la méthode d'extraction de fonctions.Ce qui suit présente principalement comment utiliser les outils de développement IDEA pour extraire rapidement des fonctions et refuser de les extraire manuellement !
1: Sélectionnez le segment de code à affiner
insérez la description de l'image ici
2. Utilisez les touches de raccourci Ctrl + Alt + M, la fenêtre suivante apparaîtra
insérez la description de l'image ici
3. Cliquez sur OK, remplacez les autres segments de code similaires un par un, sélectionnez Remplacer et remplacez toutes les sélections à la fois time All.
insérez la description de l'image ici
Refactor Le code fini est le suivant :

public class FruitsCost {
    
    
    public double computeMoneyWithoutPrivileges(String type, int numbers) {
    
    
        double prices = getPrices(type);
        return prices * numbers;
    }

    private double getPrices(String type) {
    
    
        double prices;
        switch (type) {
    
    
            case "apple":
                prices = 5.5;
                break;
            case "banana":
                prices = 4.0;
                break;
            case "strawberry":
                prices = 10.5;
                break;
            default:
                throw new IllegalArgumentException("Illegal type : " + type);
        }
        return prices;
    }

    public double computeMoneyWithPrivileges(String type, double numbers, double discount) {
    
    
        double prices = getPrices(type);
        return prices * numbers * discount;
    }
}

2.2 Duplication de code dans des sous-classes sœurs

Parfois, deux sous-classes héritent de la même classe mère, et il y a le même code entre les sous-classes, on peut envisager d'extraire le même code dans la classe mère, qui est aussi appelée fonction up.
insérez la description de l'image ici
code afficher comme ci-dessous:

/**
 * 水果利润(两个互为兄弟的子类含有相同的表达式)
 *
 */
class Fruits {
    
    
    // 成本单价
    public double costPrices;

    // 出售单价
    public double prices;

    // 最小出货量
    public double minSaleableNum;
}

class Banana extends Fruits {
    
    
    public Banana(double costPrices, double prices, double minSaleableNum) {
    
    
        this.costPrices = costPrices;
        this.minSaleableNum = minSaleableNum;
        this.prices = prices;
    }

    public double profitMoney(int number) {
    
    
        return Math.max(0, number - minSaleableNum) * this.prices - this.costPrices * number;
    }
}
class Apple extends Fruits {
    
    
    public Apple(double costPrices, double prices, double minSaleableNum) {
    
    
        this.costPrices = costPrices;
        this.minSaleableNum = minSaleableNum;
        this.prices = prices;
    }

    public double profitMoney(int number) {
    
    
        return Math.max(0, number - minSaleableNum) * this.prices - this.costPrices * number;
    }
}

Utilisez IDEA pour déplacer le même code vers la classe parent :
1. Sélectionnez le code qui doit être déplacé vers le haut
insérez la description de l'image ici
2. Raccourci Ctrl+Alt+Maj+T, sélectionnez Tirer les membres vers le HAUT
insérez la description de l'image ici
3. Cliquez sur Refactoriser
insérez la description de l'image ici
4. Une fois la sous-classe actuelle refactorisé, supprimez-le manuellement Les mêmes méthodes dans d'autres sous-classes.

2.3 Duplication de code entre différentes classes

Parfois, le code répété n'est pas dans la même classe, dans ce cas, la méthode est également refactorisée par extraction de la méthode, mais la méthode refactorisée est généralement sélectionnée et définie comme une méthode statique.
insérez la description de l'image ici

Code problème :

class MonthJudgement {
    
    
    public boolean judgeMonth() {
    
    
        Long timeStamp = System.currentTimeMillis();  // 获取当前时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
        String month = date.split(" ")[0].split("-")[1];
        return "12".equals(month);
    }
}

class YearJudgement {
    
    
    public boolean judgeYear() {
    
    
        Long time = System.currentTimeMillis();  // 获取当前时间戳
        System.out.println("获得当前时间戳");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = dateFormat.format(new Date(Long.parseLong(String.valueOf(time))));
        return date.startsWith("2021");
    }
}

On peut analyser que la logique du temps d'initialisation est la même dans les deux codes. Ces lignes de code peuvent être extraites en tant que méthodes statiques. Les étapes sont les suivantes :
1 : Sélectionnez le code de sortie de YearJudgement et utilisez la touche de raccourci pour vous déplacer. vers le haut, comme suit Animation
insérez la description de l'image ici
2. Sélectionnez le code suivant, puis utilisez la touche de raccourci Ctrl+Alt+M
insérez la description de l'image ici
3. Sélectionnez Déclarer statique et public, annulez l'annotation et cliquez sur refactoriser
insérez la description de l'image ici

4. Déplacez le curseur sur la méthode statique que vous venez de créer dans la classe, puis utilisez la touche de raccourci Ctrl+Alt+Shift+T pour sélectionner Extract Delegate
insérez la description de l'image ici
5. Entrez le nom de la classe et le nom du package où se trouve la classe dans la nouvelle fenêtre
insérez la description de l'image ici
6. Ces codes seront utilisés place, remplacés manuellement par des méthodes statiques refactorisées.

3. Résumé des touches de raccourci

insérez la description de l'image ici

Acho que você gosta

Origin blog.csdn.net/qq_45171957/article/details/124414857
Recomendado
Clasificación