Comment gérer les blocs dupliqués
J'ai couru sonarqube, mais il m'a informé de l'erreur
"Blocs dupliqués" dans la classe Or et Argent.
J'ai modifié beaucoup de choses, mais cela n'a pas résolu le problème
Voici ma source
L'or et l'argent prolongent le plan
Voici un plan.
public abstract class Plan {
public abstract double getBasicRate();
public abstract int getBasicMinute();
public abstract double getAdditionalLineRate();
public abstract double getRatePerExcessMinute();
public abstract String getPlanName();}
Voici l'or.
public class Gold extends Plan {
private static final double BASIC_RATE = 49.95;
private static final int BASIC_MINUTE = 1000;
private static final double ADDITIONAL_LINE_RATE = 14.50;
private static final double RATE_PER_EXCESS_MINUTE = 0.45;
private static final String PLAN_NAME = "Gold";
public double getBasicRate() {
return BASIC_RATE;
}
public int getBasicMinute() {
return BASIC_MINUTE;
}
public double getAdditionalLineRate() {
return ADDITIONAL_LINE_RATE;
}
public double getRatePerExcessMinute() {
return RATE_PER_EXCESS_MINUTE;
}
public String getPlanName() {
return PLAN_NAME;
}
}
Voici un Silver.
public class Silver extends Plan {
private static final double BASIC_RATE = 29.95;
private static final int BASIC_MINUTE = 500;
private static final double ADDITIONAL_LINE_RATE = 21.50;
private static final double RATE_PER_EXCESS_MINUTE = 0.54;
private static final String PLAN_NAME = "Silver";
public double getBasicRate() {
return BASIC_RATE;
}
public int getBasicMinute() {
return BASIC_MINUTE;
}
public double getAdditionalLineRate() {
return ADDITIONAL_LINE_RATE;
}
public double getRatePerExcessMinute() {
return RATE_PER_EXCESS_MINUTE;
}
public String getPlanName() {
return PLAN_NAME;
}
}
Aidez-moi, s'il vous plaît
Le code en or et en argent est identique, sauf à partir des données attribuées aux variables. Vous pouvez refactoriser quelque chose comme ceci pour supprimer la duplication:
public class Plan {
private final double BASIC_RATE;
private final int BASIC_MINUTE;
private final double ADDITIONAL_LINE_RATE;
private final double RATE_PER_EXCESS_MINUTE;
private final String PLAN_NAME;
public Plan(double BASIC_RATE, int BASIC_MINUTE,
double ADDITIONAL_LINE_RATE, double RATE_PER_EXCESS_MINUTE,
String PLAN_NAME) {
this.BASIC_RATE = BASIC_RATE;
this.BASIC_MINUTE = BASIC_MINUTE;
this.ADDITIONAL_LINE_RATE = ADDITIONAL_LINE_RATE;
this.RATE_PER_EXCESS_MINUTE = RATE_PER_EXCESS_MINUTE;
this.PLAN_NAME = PLAN_NAME;
}
public double getBasicRate() {
return BASIC_RATE;
}
public int getBasicMinute() {
return BASIC_MINUTE;
}
public double getAdditionalLineRate() {
return ADDITIONAL_LINE_RATE;
}
public double getRatePerExcessMinute() {
return RATE_PER_EXCESS_MINUTE;
}
public String getPlanName() {
return PLAN_NAME;
}
}
Alors Gold
ressemblerait à quelque chose comme ceci:
public class Gold extends Plan {
public Gold() {
super(49.95, 1000, 14.50, 0.45, "Gold");
}
}
Ce que nous avons fait ici, c'est de prendre du code partagé par 2 classes et de le déplacer vers sa classe parente. En appelant le super constructeur in, Gold
nous affectons les variables aux valeurs requises par cette implémentation de la super classe Plan
.
Nous avons également supprimé les static
variables de classe. Cela signifie que les variables seront liées à une instance de la classe plutôt qu'à la classe elle-même.
Nous faisons cela pour que les variables dans Plan
soient liées à chaque instance de Plan
. Cela signifie que nous pouvons les utiliser dans les deux classes étendues sans que les données ne soient mélangées.
Dans de nombreux cas, vous n'utiliserez généralement pas à static
moins que vous ne vouliez activement qu'une variable soit accessible sans instance de classe. Vous pouvez en savoir plus static
ici .