Einführung in effektives Java durch Üben und Lernen (Builder-Muster)

Serie zum Lernen durch Spielen mit dem Java-System, das als neuer Absolvent erstellt wurde (Builder-Muster)

Einführung

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!

Der Teil, der mit dieser Zeit manipuliert werden soll

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.

Was ist das Builder-Muster?

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.

Zusammenfassung

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

Einführung in effektives Java durch Üben und Lernen (Builder-Muster)
Builder-Muster (effektives Java)
[Einführung in Java] Informationen zu Variablendeklarationen und -typen
[Java] Einführung in Java
Einführung in Java
Einführung in den Java-Befehl
Verstehen Sie das Singleton-Muster, indem Sie Java- und JavaScript-Code vergleichen
[Java] Einführung in den Lambda-Ausdruck
[Java] Einführung in die Stream-API
Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen
Von ineffektivem Java zu effektivem Java
[Einführung in Janken (ähnliche) Spiele] Java
[Einführung in Java] Informationen zu Variablen und Typen (Variablendeklaration, Initialisierung, Datentyp)
Informationen zu TestSize, das von Google empfohlen wird, und zur Realisierung von TestSize durch Java und Maven
Einführung in Scala aus Java-Perspektive (grundlegend)
[Einführung in Java] Über Lambda-Ausdrücke
[Einführung in Java] Informationen zur Stream-API
Einführung in die funktionale Programmierung (Java, Javascript)
Java als Wert übergeben und als Referenz übergeben
Erste Einführung in Mac (Java-Ingenieur)
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
[Einführung in Java] Informationen zu Array-Operationen (1D-Array, 2D-Array-Deklaration, Instanziierung, Initialisierung und Verwendung)
Objektmuttermuster und Test Data Builder-Muster
Wie man die Java Silver Prüfung ablegt und wie man lernt
Einführung in Java zum ersten Mal # 2
JAVA Learning History Final Modifier und Static Modifier
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
[Einführung in Java] So schreiben Sie ein Java-Programm
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
[Java] Wie man Dateien ausgibt und schreibt!
Deep Learning Java von Grund auf neu Kapitel 1 Einführung
Hinweis: next ・ nextLine (Paiza lernt Java-Einführung 9: # 06)
Einführung in EHRbase 1-Übersicht und Umgebungswartung
Unerfahrene Lernmethode, um Java Silver 11 zu erhalten
JAVA lernen Geschichte abstrakte Klassen und Methoden
Ausgabe des Buches "Einführung in Java"
Zum ersten Mal Java lernen [Einführung]
Einführung in die Überwachung von Java Touching Prometheus
Von Java nach C und von C nach Java in Android Studio
Verwendung von @Builder und @NoArgsConstructor zusammen
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
[Einführung in Docker] Erstellen Sie ein Docker-Image für maschinelles Lernen und verwenden Sie das Jupyter-Notizbuch
Versuchen Sie, Scala-ähnliche Optionstyp-Musterübereinstimmung und Map FlatMap in Java zu realisieren