[JAVA] Une interface fluide? -Je veux vous donner l'occasion d'écrire du bon code. 3 [Exemple de refactoring C #]

Est-ce la bonne façon d'utiliser l'interface fluide?

Sur un site, une personne ayant une longue expérience de Java m'aide avec un projet C #. Une partie du code utilisait une interface fluide, mais je n'étais pas tout à fait convaincu. J'ai essayé de créer un exemple de code en me référant au code à ce moment-là.

Spécifications) Mettez à jour le DB en fusionnant les valeurs d'écran avec les résultats obtenus du DB.

  1. Il y a Header1, Header2 et Header3 dans DB, et tous doivent être mis à jour.
  2. La valeur peut être modifiée à l'écran et le moment de la fusion est lorsque le bouton d'enregistrement est cliqué.
        /**Traitement principal**/
        private Dao _dao = new Dao();

        public void Main()
        {
            //Obtenez les informations actuelles de la base de données.
            var param = new UpdateParameter(_dao)
                            .SetHeader(1)
                            .SetHeader2("a")
                            .SetHeader3(2);

            //Reflétez les informations à l'écran.
            SetValueFromView(param);

            //Mettez à jour la base de données.
            _dao.Update(param);
        }

        private void SetValueFromView(UpdateParameter param)
        {
            //Header1 du paramètre qui a obtenu la valeur de l'écran,2,Réfléchissez en 3.
            //Code omis
        }

        /**Classe de paramètres qui résume le DTO de la table de mise à jour de la base de données**/
        public class UpdateParameter
        {
            public Header Header { get; private set; }
            public Header2 Header2 { get; private set; }
            public Header3 Header3 { get; private set; }

            private readonly Dao _dao = null;

            public UpdateParameter(Dao dao)
            {
                _dao = dao;
            }

            public UpdateParameter SetHeader(int id)
            {
                Header = _dao.GetHeader(id);
                return this;
            }

            public UpdateParameter SetHeader2(string code)
            {
                Header2 = _dao.GetHeader2(code);
                return this;
            }

            public UpdateParameter SetHeader3(int id)
            {
                Header3 = _dao.GetHeader3(id);
                return this;
            }
        }

        /** Header1,2,3 DTO**/
        public class Header
        {
            public int Id { get; set; }
        }

        public class Header2
        {
            public string Code { get; set; }
        }

        public class Header3
        {
            public int Id { get; set; }
        }

        /**Dao pour l'acquisition et la mise à jour des données**/
        public class Dao
        {
            public Header GetHeader(int id)
            {
                //Obtenir l'en-tête
                return new Header() { Id = id };
            }

            public Header2 GetHeader2(string code)
            {
                //Obtenir l'en-tête 2
                return new Header2() { Code = code };
            }

            public Header3 GetHeader3(int id)
            {
                //Obtenir l'en-tête 3
                return new Header3() { Id = id };
            }

            public void Update(UpdateParameter param)
            {
                //Exécutez le traitement de mise à jour de la base de données. Code omis
            }
        }
java
    private Dao dao = new Dao();

    public void main() {
        //Obtenez les informations actuelles de la base de données.
        UpdateParameter param = new UpdateParameter(dao)
                .setHeader(1)
                .setHeader2("a")
                .setHeader3(2);

        //Reflétez les informations à l'écran.
        setValueFromView(param);

        //Mettez à jour la base de données.
        dao.update(param);
    }

    private void setValueFromView(UpdateParameter param) {
        //Header1 du paramètre qui a obtenu la valeur de l'écran,2,Réfléchissez en 3.
        //Code omis
    }

    public class UpdateParameter {
        private Header header = null;
        private Header2 header2 = null;
        private Header3 header3 = null;

        private final Dao dao;

        public UpdateParameter(Dao dao) {
            this.dao = dao;
        }

        public UpdateParameter setHeader(int id) {
            this.header = dao.getHeader(id);
            return this;
        }

        public UpdateParameter setHeader2(String code) {
            this.header2 = dao.getHeader2(code);
            return this;
        }

        public UpdateParameter setHeader3(int id) {
            this.header3 = dao.getHeader3(id);
            return this;
        }

        public Header getHeader() {
            return header;
        }

        public Header2 getHeader2() {
            return header2;
        }

        public Header3 getHeader3() {
            return header3;
        }

    }

    /** Header1,2,3 DTO**/
    public class Header {
        private int id;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }
    }

    public class Header2 {
        private String Code;

        public String getCode() {
            return Code;
        }

        public void setCode(String code) {
            Code = code;
        }

    }

    public class Header3 {
        private int Id;

        public int getId() {
            return Id;
        }

        public void setId(int id) {
            Id = id;
        }
    }

    /**Dao pour l'acquisition et la mise à jour des données**/
    public class Dao {
        public Header getHeader(int id) {
            //Obtenir l'en-tête
            Header header = new Header();
            header.setId(id);
            return header;
        }

        public Header2 getHeader2(String code) {
            //Obtenir l'en-tête 2
            Header2 header2 = new Header2();
            header2.setCode(code);
            return header2;
        }

        public Header3 getHeader3(int id) {
            //Obtenir l'en-tête 3
            Header3 header3 = new Header3();
            header3.setId(id);
            return header3;
        }

        public void update(UpdateParameter param) {
            //Exécutez le traitement de mise à jour de la base de données. Code omis
        }
    }

Ce qui m'intéressait

Il semble que l'interface soit telle que UpdateParameter s'écoule, mais ce code présente les problèmes suivants.

  1. UpdateParameter fait référence à Dao.
  2. Il existe plusieurs endroits à corriger lorsque le nombre de tables augmente.
  3. SetHeader1 à SetHeader3 doit être appelé.

Vous pouvez voir l'avantage d'une interface fluide dans une classe comme StringBuilder. D'un autre côté, cela semble étrange de l'utiliser dans une classe qui ne contient que des informations simples telles que UpdateParameter.

Essayez de le corriger avec un code sûr.

       /**Traitement principal**/
        private Dao _dao = new Dao();

        public void Main()
        {
            //Obtenez les informations actuelles de la base de données.
            var param = new UpdateParameter();
            //Récupérez les données de DB dans le processus principal.
            param.Header = _dao.GetHeader(1);
            param.Header2 = _dao.GetHeader2("a");
            param.Header3 = _dao.GetHeader3(2);

            //Reflétez les informations à l'écran.
            SetValueFromView(param);

            //Mettez à jour la base de données.
            _dao.Update(param);
        }

        private void SetValueFromView(UpdateParameter param)
        {
            //Header1 du paramètre qui a obtenu la valeur de l'écran,2,Réfléchissez en 3.
            //Code omis
        }

        /**Classe de paramètres qui résume le DTO de la table de mise à jour de la base de données**/
        public class UpdateParameter
        {
            public Header Header { get; set; }
            public Header2 Header2 { get; set; }
            public Header3 Header3 { get; set; }

            //Supprimer la référence Dao
        }

        /** Header1,2,3 DTO**/
        public class Header
        {
            public int Id { get; set; }
        }

        public class Header2
        {
            public string Code { get; set; }
        }

        public class Header3
        {
            public int Id { get; set; }
        }

        /**Dao pour l'acquisition et la mise à jour des données**/
        public class Dao
        {
            public Header GetHeader(int id)
            {
                //Obtenir l'en-tête
                return new Header() { Id = id };
            }

            public Header2 GetHeader2(string code)
            {
                //Obtenir l'en-tête 2
                return new Header2() { Code = code };
            }

            public Header3 GetHeader3(int id)
            {
                //Obtenir l'en-tête 3
                return new Header3() { Id = id };
            }

            public void Update(UpdateParameter param)
            {
                //Exécutez le traitement de mise à jour de la base de données. Code omis
            }
        }

java
    private Dao dao = new Dao();

    public void main() {
        //Obtenez les informations actuelles de la base de données.
        UpdateParameter param = new UpdateParameter();
        //Récupérez les données de DB dans le processus principal.
        param.setHeader(dao.getHeader(1));
        param.setHeader2(dao.getHeader2("a"));
        param.setHeader3(dao.getHeader3(2));

        //Reflétez les informations à l'écran.
        setValueFromView(param);

        //Mettez à jour la base de données.
        dao.update(param);
    }

    private void setValueFromView(UpdateParameter param) {
        //Header1 du paramètre qui a obtenu la valeur de l'écran,2,Réfléchissez en 3.
        //Code omis
    }

    public class UpdateParameter {
        private Header header = null;
        private Header2 header2 = null;
        private Header3 header3 = null;

        //Supprimer la référence Dao

        public void setHeader(Header header) {
            this.header = header;
        }

        public void setHeader2(Header2 header2) {
            this.header2 = header2;
        }

        public void setHeader3(Header3 header3) {
            this.header3 = header3;
        }

        public Header getHeader() {
            return header;
        }

        public Header2 getHeader2() {
            return header2;
        }

        public Header3 getHeader3() {
            return header3;
        }

    }

    //Le code suivant est omis

Je viens de supprimer la référence Dao de UpdateParameter et j'ai obtenu la base de données du côté du traitement principal, mais ce code est convaincant.

Résumé

J'ai environ un an d'expérience en développement Java, je me demande donc si le code affiché dans l'exemple est normal pour Java. Aussi, quelle est la raison d'utiliser une interface fluide même si les problèmes décrits dans "Ce qui m'intéressait" sont laissés tels quels.

[Article précédent (collection de code un peu inquiétante)] (http://qiita.com/csharpisthebest/items/7d9d2c7e4da4b89488fd)

[Article suivant (déclaration d'affectation redondante)] (http://qiita.com/csharpisthebest/items/f9ebc741e40037553d5b)

Table des matières

Recommended Posts

Une interface fluide? -Je veux vous donner l'occasion d'écrire du bon code. 3 [Exemple de refactoring C #]
Easy Null Check-Je veux vous donner une chance d'écrire du bon code. 6 [Exemple de refactoring C #]
Une petite collection de code inquiétante - je veux vous donner une chance d'écrire du bon code. 2 [Exemple de refactoring C #]
Branchement conditionnel compliqué - je veux vous donner une chance d'écrire du bon code. 1 [Exemple de refactoring C #]
Gestion des types booléens - Je veux vous donner une chance d'écrire du bon code. 7 [Exemple de refactoring C #]
Trop d'arguments de fonction - je veux vous donner une chance d'écrire du bon code. 8 [Exemple de refactoring C #]
Traitement inutile des collections - je veux vous donner une chance d'écrire du bon code. 5 [Exemple de refactoring C #]
Est-il possible de séparer les appels de fonction et les branches conditionnelles? - Je veux vous donner une chance d'écrire du bon code. 9 [Exemple de refactoring C #]
Je veux écrire un joli build.gradle
Je veux écrire un test unitaire!
Je veux écrire une simple répétition d'une chaîne de caractères
7 choses que je veux que tu gardes pour que ça ne devienne pas un putain de code
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Je veux donner un nom de classe à l'attribut select
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
Je voudrais résumer Apache Wicket 8 car c'est une bonne idée
Je veux ForEach un tableau avec une expression Lambda en Java
Je souhaite développer une application web!
Je veux créer une application ios.android
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe