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
2. Utilisez les touches de raccourci Ctrl + Alt + M, la fenêtre suivante apparaîtra
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.
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.
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
2. Raccourci Ctrl+Alt+Maj+T, sélectionnez Tirer les membres vers le HAUT
3. Cliquez sur Refactoriser
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.
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
2. Sélectionnez le code suivant, puis utilisez la touche de raccourci Ctrl+Alt+M
3. Sélectionnez Déclarer statique et public, annulez l'annotation et cliquez sur refactoriser
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
5. Entrez le nom de la classe et le nom du package où se trouve la classe dans la nouvelle fenêtre
6. Ces codes seront utilisés place, remplacés manuellement par des méthodes statiques refactorisées.