Introduction à Effective Java en pratiquant et en apprenant (modèle Builder)

Série à apprendre en jouant avec le système Java créé quand j'étais un nouveau diplômé (modèle Builder)

introduction

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!

La partie à trafiquer cette fois

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.

Quel est le modèle Builder?

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.

Résumé

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

Introduction à Effective Java en pratiquant et en apprenant (modèle Builder)
Modèle de générateur (Java effectif)
[Introduction à Java] À propos des déclarations et des types de variables
[Java] Introduction à Java
Introduction à Java
Introduction à la commande java
Comprendre le modèle Singleton en comparant le code Java et JavaScript
[Java] Introduction à l'expression lambda
[Java] Introduction à l'API Stream
Comprendre le modèle Iterator en comparant le code Java et JavaScript
De Java inefficace à Java efficace
[Introduction aux jeux Janken (comme)] Java
[Introduction à Java] À propos des variables et des types (déclaration de variable, initialisation, type de données)
À propos de TestSize préconisé par Google et comment réaliser TestSize par Java et Maven
Introduction à Scala du point de vue Java (basique)
[Introduction à Java] À propos des expressions lambda
[Introduction à Java] À propos de l'API Stream
Introduction à la programmation fonctionnelle (Java, Javascript)
Java passe par valeur et passe par référence
Introduction initiale à Mac (ingénieur Java)
J'ai essayé de résumer l'apprentissage Java (1)
[Introduction à Java] À propos des opérations de tableau (tableau 1D, déclaration de tableau 2D, instanciation, initialisation et utilisation)
Modèle d'objet mère et modèle de générateur de données de test
Comment passer l'examen Java Silver et comment apprendre
Introduction à Java pour la première fois # 2
Modificateur final et modificateur statique de l'historique d'apprentissage JAVA
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
[Introduction à Java] Comment écrire un programme Java
Implémentation Java pour créer et résoudre des labyrinthes
[Java] Comment sortir et écrire des fichiers!
Deep Learning Java à partir de zéro Chapitre 1 Introduction
Remarque: suivant ・ nextLine (paiza apprenant l'introduction de Java 9: # 06)
Introduction à EHRbase 1 - Présentation et maintenance de l'environnement
Méthode d'apprentissage inexpérimentée pour obtenir Java Silver 11
Cours et méthodes abstraits d'histoire d'apprentissage JAVA
Sortie du livre "Introduction à Java"
Apprendre pour la première fois java [Introduction]
Introduction à la surveillance à partir de Java Touching Prometheus
De Java à C et de C à Java dans Android Studio
Comment utiliser @Builder et @NoArgsConstructor ensemble
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
[Introduction à Docker] Créer une image Docker pour l'apprentissage automatique et utiliser le notebook Jupyter
Essayez de réaliser une correspondance de modèle de type Option de type Scala et une carte, flatMap en Java