[JAVA] Lorsque le traitement après le branchement conditionnel est redondant-12 [C # Refactoring Sample]

Lorsque le traitement après le branchement conditionnel est redondant

Nous voyons souvent des cas où le même code existe dans le traitement après le branchement avec l'instruction if. En particulier, lors de l'écriture d'un processus d'enregistrement en cliquant sur le bouton d'enregistrement, il existe de nombreux processus qui convertissent les informations d'écran en DTO. Alors, considérons l'exemple de code dans cet exemple.

Exemple de code

        /** 
         *Convertissez les informations d'écran en Dto.
         *L'ID et le nom prennent la valeur de la propriété Text de Label et TextBox.
         *L'identifiant est nul pour une nouvelle inscription.
         **/
        public Dto CreateDto(string id, string name, string updateUserId)
        {
            if (id == null)
            {
                var dto = new Dto();
                dto.Id = -1;
                dto.Name = name;
                dto.RegistUser = updateUserId;
                dto.RegistDate = DateTime.Now;
                dto.UpdateUserId = updateUserId;
                dto.UpdateDate = DateTime.Now;
                return dto;
            }
            else
            {
                var dto = GetDto(int.Parse(id));
                dto.Name = name;
                dto.UpdateUserId = updateUserId;
                dto.UpdateDate = DateTime.Now;
                return dto;
            }
        }

        /**Obtenez Dto de la table. Code omis**/
        private Dto GetDto(int id)
        {
            return new Dto();
        }

        /**Tableau Dto. Si nouveau, id est-Réglez sur 1.**/
        public class Dto
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string RegistUser { get; set; }
            public DateTime? RegistDate { get; set; }
            public string UpdateUserId { get; set; }
            public DateTime? UpdateDate { get; set; }
        }
java
    /**
     *Convertissez les informations d'écran en Dto.
     *L'ID et le nom prennent la valeur de la propriété Text de Label et TextBox.
     *L'identifiant est nul pour une nouvelle inscription.
     **/
    public Dto createDto(String id, String name, String updateUserId) {
        Dto dto = null;

        if (id == null) {
            dto = new Dto();
            dto.setId(-1);
            dto.setName(name);
            dto.setRegistUser(updateUserId);
            dto.setRegistDate(new Date());
            dto.setUpdateUserId(updateUserId);
            dto.setUpdateDate(new Date());
        } else {
            dto = getDto(Integer.parseInt(id));
            dto.setName(name);
            dto.setUpdateUserId(updateUserId);
            dto.setUpdateDate(new Date());
        }

        return dto;
    }

    /**Obtenez Dto de la table. Code omis.**/
    private Dto getDto(int id) {
        //Obtenez Dto de la table. Code omis.
        return new Dto();
    }

    /**Tableau Dto. Si nouveau, id est-Réglez sur 1.**/
    public class Dto {
        private int id;
        private String name;
        private String registUser;
        private Date registDate;
        private String updateUserId;
        private Date updateDate;

        public int getId() {
            return id;
        }

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

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getRegistUser() {
            return registUser;
        }

        public void setRegistUser(String registUser) {
            this.registUser = registUser;
        }

        public Date getRegistDate() {
            return registDate;
        }

        public void setRegistDate(Date registDate) {
            this.registDate = registDate;
        }

        public String getUpdateUserId() {
            return updateUserId;
        }

        public void setUpdateUserId(String updateUserId) {
            this.updateUserId = updateUserId;
        }

        public Date getUpdateDate() {
            return updateDate;
        }

        public void setUpdateDate(Date updateDate) {
            this.updateDate = updateDate;
        }
    }

problème

Je comprends que le traitement est divisé entre nouveau et mis à jour, mais il existe certains du même code. Par exemple, si un numéro de téléphone est ajouté, ce code nécessite deux codes supplémentaires pour attribuer le numéro de téléphone à Dto. Ce problème peut être résolu en séparant uniquement les processus qui doivent être branchés par l'instruction if.

Refactoring des restrictions

Décrivez les restrictions de la politique de refactoring. S'il n'y a pas de restrictions, il existe de nombreuses façons de le résoudre, je veux donc éviter de dévier du sujet principal.

  1. Pour faciliter la compréhension de la correspondance du code, n'en faites pas une fonction.
  2. Les informations sur l'écran doivent être ViewModel et aucune modification modifiant les hypothèses n'est effectuée.
  3. N'apportez aucune modification majeure au code.

Après refactoring

       /** 
         *Convertissez les informations d'écran en Dto.
         *L'ID et le nom prennent la valeur de la propriété Text de Label et TextBox.
         *L'identifiant est nul pour une nouvelle inscription.
         **/
        public Dto CreateDto(string id, string name, string updateUserId)
        {
            Dto dto = null;

            if (id == null)
            {
                dto = new Dto();
                dto.Id = -1;
                dto.RegistUser = updateUserId;
                dto.RegistDate = DateTime.Now;
            }
            else
            {
                dto = GetDto(int.Parse(id));
            }

            dto.Name = name;
            dto.UpdateUserId = updateUserId;
            dto.UpdateDate = DateTime.Now;

            return dto;
        }

        /**Obtenez Dto de la table. Code omis**/
        private Dto GetDto(int id)
        {
            return new Dto();
        }

        /**Tableau Dto. Si nouveau, id est-Réglez sur 1.**/
        public class Dto
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string RegistUser { get; set; }
            public DateTime? RegistDate { get; set; }
            public string UpdateUserId { get; set; }
            public DateTime? UpdateDate { get; set; }
        }

java
    /**
     *Convertissez les informations d'écran en Dto.
     *L'ID et le nom prennent la valeur de la propriété Text de Label et TextBox.
     *L'identifiant est nul pour une nouvelle inscription.
     **/
    public Dto createDto(String id, String name, String updateUserId) {
        Dto dto = null;

        if (id == null) {
            dto = new Dto();
            dto.setId(-1);
            dto.setRegistUser(updateUserId);
            dto.setRegistDate(new Date());
        } else {
            dto = getDto(Integer.parseInt(id));
        }

        dto.setName(name);
        dto.setUpdateUserId(updateUserId);
        dto.setUpdateDate(new Date());

        return dto;
    }

    /**Obtenez Dto de la table. Code omis.**/
    private Dto getDto(int id) {
        return new Dto();
    }

    /**Tableau Dto. Si nouveau, id est-Réglez sur 1.**/
    public class Dto {
        private int id;
        private String name;
        private String registUser;
        private Date registDate;
        private String updateUserId;
        private Date updateDate;

        public int getId() {
            return id;
        }

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

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getRegistUser() {
            return registUser;
        }

        public void setRegistUser(String registUser) {
            this.registUser = registUser;
        }

        public Date getRegistDate() {
            return registDate;
        }

        public void setRegistDate(Date registDate) {
            this.registDate = registDate;
        }

        public String getUpdateUserId() {
            return updateUserId;
        }

        public void setUpdateUserId(String updateUserId) {
            this.updateUserId = updateUserId;
        }

        public Date getUpdateDate() {
            return updateDate;
        }

        public void setUpdateDate(Date updateDate) {
            this.updateDate = updateDate;
        }
    }

Résumé

En séparant le code qui dépend des nouveautés et des mises à jour du reste, la maintenabilité a été améliorée. Dans de nombreux cas, il est dans un état comme l'exemple de code ou il est souvent divisé en une nouvelle fonction et une fonction de mise à jour. Veuillez vérifier s'il existe un code redondant avant d'en faire une fonction.

Cette perspective de refactoring est la même que dans un autre article "Les appels de fonction et le branchement conditionnel peuvent-ils être séparés?".

Article précédent (Tout organiser)

Article suivant (Problèmes d'utilisation des valeurs d'affichage de l'écran)

Table des matières

Recommended Posts

Lorsque le traitement après le branchement conditionnel est redondant-12 [C # Refactoring Sample]
Indique si le branchement conditionnel utilise un retour anticipé ou est écrit en toute sécurité dans la couverture conditionnelle-15 [exemple de refactoring C #]
Anything Arrangement-11 [Exemple de refactoring C #]
Lorsque la chaîne de caractères transmise au C ++ par JNA est déformée
Quand refactoriser?
Modifier le traitement lorsque le bouton de RecyclerView est enfoncé pour chaque liste