Als neuer Absolvent habe ich eine interne Webanwendung für das Zielmanagement erstellt, aber schließlich habe ich das Java- und Play-Framework gelernt. Es gibt einige Teile des Codes, die nicht sehr sichtbar sind, und einige Teile, die es wert sind, überarbeitet zu werden.
Hier ist der Inhalt von Effective Java, während Sie sich schämen und den Refactor freigeben Ich wollte einen praktischen Einblick in das bekommen, was im Designmuster geschrieben steht. Es ist ein schlechter Code, aber wenn Sie ihn tatsächlich umgestalten, wird sich die Lesbarkeit des Codes so stark verbessern? Ich möchte, dass Anfänger dies erkennen.
Auch bei fortgeschrittenen Leuten erwarte ich Masakari, der in diesem Teil so ist. Die Einführung ist hier und gehen Sie zum Hauptthema!
Dieses Mal werde ich den Code des Teils korrigieren, der CSV generiert. Schauen wir uns den Code an, bevor wir ihn reparieren. Überlegen Sie, wo Sie das Problem beheben würden.
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;
}
Damit wir uns verstehen. Es ist schrecklich. Der Zweck dieser CSV ist es, individuelle Ziele (monatlich) und Überlegungen zu den Zielen für die Anzahl der verwalteten Personen anzugeben. Das spezifische Problem ist
Der Punkt ist, dass die Aussichten sehr schlecht sind, weil es viele Argumente in dem Teil gibt, in dem neues Csv () gemacht wird.
Obwohl es für die Site praktisch ist, besteht außerdem eine große Wahrscheinlichkeit, dass dieses CSV-Element in Zukunft zunimmt, und es wird schwieriger zu lesen sein, wenn das Element so zunimmt, wie es jetzt ist. Der Code wird schlecht gepflegt.
Also habe ich mir Weisheit von Effective Java geliehen. Dieses Mal verwenden wir das Builder-Muster.
Das Builder-Muster ist normalerweise neu und eine Instanz wird erstellt. Bereiten Sie eine Builder-Methode in einer statischen Klasse vor und legen Sie den Wert des Felds fest.
Der Vorteil der Verwendung des Builder-Musters besteht darin, dass die Sichtbarkeit der an den Konstruktor übergebenen Parameter viel besser ist. Wenn unnötige Parameter vorhanden sind, müssen Sie diese nur festlegen, um die Erweiterbarkeit der Implementierung zu gewährleisten.
Im Abschnitt unten erfahren Sie, was Sie tatsächlich tun! Übrigens wird der Name der Variablen der Einfachheit halber geändert.
berfor after Lassen Sie uns nun tatsächlich umgestalten.
Lassen Sie uns zunächst die Modellklasse beim Erstellen von CSV umgestalten. befor
public class Csv {
/**
*Name
*/
public String name;
/**
*Position
*/
public String yakushoku;
/**
*Ziel
*/
public String mokuhyou;
/**
*Rückblick auf das Ziel
*/
public String hurikaeri;
/**
*Boss's Kommentar zum Ziel
*/
public String joushinoKoment;
/**
*Ziele für den organisatorischen Beitrag
*/
public String sosikikoukenMokuhyou;
/**
*Rückblick auf organisatorische Beitragsziele
*/
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 {
/**
*Name
*/
public String name;
/**
*Position
*/
public String yakushoku;
/**
*Ziel
*/
public String mokuhyou;
/**
*Rückblick auf das Ziel
*/
public String hurikaeri;
/**
*Boss's Kommentar zum Ziel
*/
public String joushinoKoment;
/**
*Ziele für den organisatorischen Beitrag
*/
public String sosikikoukenMokuhyou;
/**
*Rückblick auf organisatorische Beitragsziele
*/
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;
}
}
}
Was ich speziell getan habe, war die Vorbereitung einer Builder-Methode vom Typ Csv.
Und wenn der Refactor gut läuft, wird der eigentliche Teil der CSV-Generierung so sein.
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());
}
Die Sichtbarkeit des Codes hat sich erheblich verbessert und die Wartung des Codes ist einfacher geworden.
Diesmal mit dem Builder-Muster, das in Effective Java angezeigt wird Ich habe versucht, den CSV-Generierungsteil zu überarbeiten, der schwer zu lesen und zu warten ist.
Die Verwendung des Builder-Musters macht es sogar dann besser lesbar, wenn die Anzahl der Argumente zunimmt. Der Punkt ist, dass die Aussichten für CSV-Elemente verbessert werden.
Ich hoffe, Sie haben festgestellt, dass das Builder-Muster sehr effektiv im Umgang mit Methoden ist, die viele Argumente erfordern, da die Anforderungen wie dieses Mal leicht geändert werden können.
Recommended Posts