En tant que nouveau diplômé, j'ai créé une application Web de gestion d'objectifs en interne, mais après tout, j'ai appris le framework Java et Play. Certaines parties du code ne sont pas très visibles et certaines parties méritent d'être refactorisées.
Voici le contenu de Effective Java tout en ayant honte et en exposant le refactor Je voulais avoir une touche pratique sur ce qui est écrit dans le modèle de conception. C'est un code médiocre, mais si vous le refactorisez réellement, la lisibilité du code augmentera-t-elle autant? J'aimerais que les débutants s'en rendent compte.
Aussi, avec des personnes intermédiaires, j'attends Masakari qui est comme ça dans cette partie. L'introduction est par ici et allez au sujet principal!
Cette fois, je vais corriger le code de la partie qui génère CSV. Jetons un coup d'œil au code avant de le réparer. Pensez à l'endroit où vous le répareriez.
public List<Csv> getEvaluations(String gaUserId, Integer year, String term) throws IOException {
AlibabaApi alibabaApi = AlibabaApiHelper.getAlibabaRet();
List<User> subordinates = alibabaApi.getSubordinates(gaUserId).execute().body().users;
List<User> mySubordinates = (subordinates.stream().filter(distinctByKey(p -> p.gaUserId)).collect(Collectors.toList()));
List<UserTerm> list = mySubordinates.stream().map(user -> termTargetService.getUserTerm(user.gaUserId,year,term)).collect(Collectors.toList());
List<Csv> allSubordinatesCsv = list.stream()
.map(user -> new Csv(
user.name,
user.grade,
user.termTargets.target == null ? "" : user.termTargets.target.body,
user.termTargets.target == null ? "" : user.termTargets.target.selfComments == null ? "" : user.termTargets.target.selfComments.quarter == null ? "" : user.termTargets.target.selfComments.quarter.body,
user.termTargets.contribution == null ? "" : user.termTargets.contribution.body,
user.termTargets.contribution == null ? "" : user.termTargets.contribution.selfComments == null ? "" : user.termTargets.contribution.selfComments.quarter == null ? "" : user.termTargets.contribution.selfComments.quarter.body,
user.termTargets.superiorComments == null ? "" : user.termTargets.superiorComments.quarter == null ? "" : user.termTargets.superiorComments.quarter.body)
).collect(Collectors.toList());
return allSubordinatesCsv;
}
Soyons clairs. c'est terrible. Le but de ce CSV est de donner des objectifs individuels (mensuels) et des réflexions sur les objectifs pour le nombre de personnes sous gestion. Le problème spécifique est
Le fait est que les perspectives sont très mauvaises car il y a de nombreux arguments dans la partie où le nouveau Csv () est fait.
De plus, bien que cela soit pratique pour le site, il est fort possible que cet élément CSV augmente à l'avenir, et il sera plus difficile à lire lorsque l'élément augmentera comme c'est le cas maintenant. Le code sera mal entretenu.
J'ai donc emprunté un peu de sagesse à Effective Java. Cette fois, nous utiliserons le modèle Builder.
Le modèle Builder est généralement nouveau pour créer une instance. Préparez une méthode Builder dans une classe statique et définissez la valeur du champ.
L'avantage d'utiliser le modèle Builder est que la visibilité des paramètres passés au constructeur est bien meilleure. De plus, s'il y a des paramètres inutiles, il vous suffit de les définir pour garantir l'extensibilité de l'implémentation.
Voir la section ci-dessous pour ce que vous faites réellement! En passant, le nom de la variable est changé pour plus de commodité.
berfor after Maintenant, refactorisons.
Tout d'abord, refactorisons la classe de modèle lors de la création de csv. befor
public class Csv {
/**
*Nom
*/
public String name;
/**
*Position
*/
public String yakushoku;
/**
*Cible
*/
public String mokuhyou;
/**
*Rétrospective de l'objectif
*/
public String hurikaeri;
/**
*Commentaire du patron sur le but
*/
public String joushinoKoment;
/**
*Objectifs de la contribution organisationnelle
*/
public String sosikikoukenMokuhyou;
/**
*Rétrospective des objectifs de contribution organisationnelle
*/
public String sosikikoukenMokuhyoHurikaeri;
public Csv(String name, String yakushoku, String mokuhyou, String hurikaeri, String joushinoKoment, String sosikikoukenMokuhyou,String sosikikoukenMokuhyoHurikaeri){
this.name = name;
this.grade = yakushoku;
this.target = mokuhyou;
this.hurikaeri = hurikaeri;
this.joushinoKoment = joushinoKoment;
this.sosikikoukenMokuhyou = sosikikoukenMokuhyou;
this.sosikikoukenMokuhyoHurikaeri = sosikikoukenMokuhyoHurikaeri;
}
}
after
public class Csv {
/**
*Nom
*/
public String name;
/**
*Position
*/
public String yakushoku;
/**
*Cible
*/
public String mokuhyou;
/**
*Rétrospective de l'objectif
*/
public String hurikaeri;
/**
*Commentaire du patron sur le but
*/
public String joushinoKoment;
/**
*Objectifs de la contribution organisationnelle
*/
public String sosikikoukenMokuhyou;
/**
*Rétrospective des objectifs de contribution organisationnelle
*/
public String sosikikoukenMokuhyoHurikaeri;
private Csv() {
}
public static class Builder {
String name = "";
String yakushoku = "";
String mokuhyou = "";
String hurikaeri = "";
String joushinoKoment ="";
String sosikikoukenMokuhyou = "";
String sosikikoukenMokuhyoHurikaeri = "";
public Builder name(String name) {
this.name = name;
return this;
}
public Builder yakushoku(String yakushoku) {
this.yakushoku = yakushoku;
return this;
}
public Builder mokuhyou(String mokuhyou) {
this.mokuhyou = mokuhyou;
return this;
}
public Builder hurikaeri(String hurikaeri) {
this.hurikaeri = hurikaeri;
return this;
}
public Builder joushinoKoment(String joushinoKoment) {
this.joushinoKoment = joushinoKoment;
return this;
}
public Builder sosikikoukenMokuhyou(String sosikikoukenMokuhyou){
this.sosikikoukenMokuhyou = sosikikoukenMokuhyou;
return this;
}
public Builder sosikikoukenMokuhyoHurikaeri(String sosikikoukenMokuhyoHurikaeri) {
this.sosikikoukenMokuhyoHurikaeri = sosikikoukenMokuhyoHurikaeri;
return this;
}
public Csv build() {
Csv csv = new Csv();
csv.name = this.name;
csv.yakushoku = this.yakushoku;
csv.mokuhyou = this.mokuhyou;
csv.hurikaeri = this.hurikaeri;
csv.joushinoKoment = this.joushinoKoment;
csv.sosikikoukenMokuhyou = this.sosikikoukenMokuhyou;
csv.sosikikoukenMokuhyoHurikaeri = this.sosikikoukenMokuhyoHurikaeri;
return csv;
}
}
}
Ce que j'ai fait spécifiquement était de préparer une méthode de générateur de type Csv.
Et si le refactor se passe bien, la partie de la génération CSV réelle sera comme ça.
private List<Csv> transformIntoCSV(List<UserTerm> list) {
return list.stream()
.map(user -> new Csv.Builder()
.name(user.name)
.grade(user.grade)
.target(user.termTargets.target == null ? "" : user.termTargets.target.body)
.commentForTarget(user.termTargets.target == null ? "" : user.termTargets.target.selfComments == null ? "" : user.termTargets.target.selfComments.quarter == null ? "" : user.termTargets.target.selfComments.quarter.body)
.contribution(user.termTargets.contribution == null ? "" : user.termTargets.contribution.body)
.commentForContribution(user.termTargets.contribution == null ? "" : user.termTargets.contribution.selfComments == null ? "" : user.termTargets.contribution.selfComments.quarter == null ? "" : user.termTargets.contribution.selfComments.quarter.body)
.superiorCommentForTarget(user.termTargets.superiorComments == null ? "" : user.termTargets.superiorComments.quarter == null ? "" : user.termTargets.superiorComments.quarter.body)
.build()
).collect(Collectors.toList());
}
La visibilité du code s'est considérablement améliorée et le code est devenu plus facile à maintenir.
Cette fois en utilisant le modèle Builder qui apparaît dans Effective Java J'ai essayé de refactoriser la partie génération CSV, qui est difficile à lire et à maintenir.
En fait, l'utilisation du modèle Builder le rend plus lisible même si le nombre d'arguments augmente. Le fait est que les perspectives pour les éléments CSV sont améliorées.
J'espère que vous avez trouvé que le modèle Builder est très efficace pour traiter les méthodes qui nécessitent beaucoup d'arguments car les exigences sont facilement modifiées comme cette fois.
Recommended Posts