[JAVA] Anything Arrangement-11 [Exemple de refactoring C #]

Qu'est-ce qu'un tableau?

Pour les programmeurs qui ne connaissent pas la classe, il arrive souvent que toutes les parties à transformer en classe soient représentées par un tableau. Par exemple, au lieu d'utiliser List, utilisez un tableau extensible ou transformez toutes les parties qui correspondent aux membres de la classe en tableaux. La séquence peut être polyvalente, étant donné que la séquence est finalement utilisée pour terminer la production. En revanche, c'est une mauvaise habitude car elle n'est pas facile à entretenir et même un petit changement de spécifications augmentera le nombre de modifications de code. Réfléchissons concrètement avec l'exemple de code.

Exemple de code

Prenons un exemple de conversion d'un tableau contenant l'ID, le nom et les notes en un tableau bidimensionnel vers TSV.

        /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
         *Cependant, il est au format Tsv hors Nom.
         *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var ids = new string[values.Length];
            var remarks = new string[values.Length];
            var rowNumbers = new int[values.Length];

            //Stocker dans un tableau ligne par ligne.
            for (int i = 0; i < values.Length; i++)
            {
                ids[i] = values[i][0];
                remarks[i] = values[i][2];
                rowNumbers[i] = i + 1;
            }

            var returnValues = new List<string>();

            //Créez une valeur de retour en préfixant le numéro de ligne.
            for (int i = 0; i < ids.Length; i++)
            {
                var line =
                    rowNumbers[i] + "\t" +
                    ids[i] + "\t" +
                    remarks[i];
                returnValues.Add(line);
            }

            return returnValues;
        }

java
    /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
     *Cependant, il est au format Tsv hors Nom.
     *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
     */
    public List<String> getTsvWithRowNumber(String[][] values) {
        String[] ids = new String[values.length];
        String[] remarks = new String[values.length];
        int[] rowNumbers = new int[values.length];

        //Stocker dans un tableau ligne par ligne.
        for (int i = 0; i < values.length; i++) {
            ids[i] = values[i][0];
            remarks[i] = values[i][2];
            rowNumbers[i] = i + 1;
        }

        ArrayList<String> returnValues = new ArrayList<String>();

        //Créez une valeur de retour en préfixant le numéro de ligne.
        for (int i = 0; i < ids.length; i++) {
            String line =
                    rowNumbers[i] + "\t" +
                    ids[i] + "\t" +
                    remarks[i];
            returnValues.add(line);
        }

        return returnValues;
    }

problème

Ce code place chaque élément dans un tableau et chaque tableau doit correspondre au nombre de lignes. Une erreur en dehors des limites d'index se produit lorsque le tableau est déclaré de manière incorrecte. Si le nombre d'éléments est petit, il peut être géré, mais dans les applications d'entreprise, il y a généralement 10 éléments ou plus, il est donc difficile de tous les organiser.

Après refactoring

La conversion en Dto, puis le traitement amélioreront la lisibilité et résoudront les problèmes d'index. Aussi, afin de réduire le nombre magique, il a été modifié en valeurs [i] [j ++]. La lisibilité est réduite, mais la plage de correction lors de l'ajout d'éléments est réduite.

       /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
         *Cependant, il est au format Tsv hors Nom.
         *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var dtoes = new List<Dto>(values.Length);

            //Convertir en Dto.
            for (int i = 0; i < values.Length; i++)
            {
                int j = 0;
                var dto = new Dto();
                dto.Id = values[i][j++];
                dto.Name = values[i][j++];
                dto.Remarks = values[i][j++];
                dto.RowNumber = i + 1;

                dtoes.Add(dto);
            }

            var returnValues = new List<string>();

            //Créez une valeur de retour en préfixant le numéro de ligne.
            foreach (var dto in dtoes)
            {
                var line =
                    dto.RowNumber + "\t" +
                    dto.Id + "\t" +
                    dto.Remarks;
                returnValues.Add(line);
            }

            return returnValues;
        }

        /**Classe intermédiaire pour le traitement**/
        private class Dto
        {
            public int RowNumber { get; set; }
            public string Id { get; set; }
            public string Name { get; set; }
            public string Remarks { get; set; }

        }

java
    /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
     *Cependant, il est au format Tsv hors Nom.
     *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
     */
    public List<String> getTsvWithRowNumber(String[][] values) {
        List<Dto> dtoes = new ArrayList<Dto>(values.length);

        //Convertir en Dto.
        for (int i = 0; i < values.length; i++) {
            int j = 0;
            Dto dto = new Dto();
            dto.setId(values[i][j++]);
            dto.setName(values[i][j++]);
            dto.setRemarks(values[i][j++]);
            dto.setRowNumber(i + 1);

            dtoes.add(dto);
        }

        List<String> returnValues = new ArrayList<String>();

        //Créez une valeur de retour en préfixant le numéro de ligne.
        for (Dto dto : dtoes) {
            String line =
                    dto.getRowNumber() + "\t" +
                    dto.getId() + "\t" +
                    dto.getRemarks();
            returnValues.add(line);
        }

        return returnValues;
    }

    /**Classe intermédiaire pour le traitement**/
    private class Dto {
        private int rowNumber;
        private String Id;
        private String name;
        private String remarks;

        public int getRowNumber() {
            return rowNumber;
        }

        public void setRowNumber(int rowNumber) {
            this.rowNumber = rowNumber;
        }

        public String getId() {
            return Id;
        }

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

        public String getName() {
            return name;
        }

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

        public String getRemarks() {
            return remarks;
        }

        public void setRemarks(String remarks) {
            this.remarks = remarks;
        }

Résumé

S'il s'agit d'une structure de données, vous devez d'abord envisager d'en faire une classe. Si vous ne comprenez pas la classe, pourquoi ne pas commencer par une étude orientée objet?

De plus, l'écriture à l'aide de tableaux était courante dans VB6, mais je pense que de nombreux programmeurs ne pouvaient pas passer à l'orientation objet lorsqu'ils sont passés à .Net.

PostScript 2017/4/9 Dans la section des commentaires, il a été souligné que le processus de conversion en Dto devrait être une méthode, voici donc le code qui a fait du processus une méthode.

Après refactoring

Non seulement values => Dto, mais aussi Dto => Tsv est une méthode.

        /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
         *Cependant, il est au format Tsv hors Nom.
         *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var dtoes = CreateDtoes(values);

            var returnValues = ConvertToTsv(dtoes);

            return returnValues;
        }

        /**Générer Dto**/
        private List<Dto> CreateDtoes(string[][] values)
        {
            var dtoes = new List<Dto>(values.Length);

            //Convertir en Dto.
            for (int i = 0; i < values.Length; i++)
            {
                int j = 0;
                var dto = new Dto();
                dto.Id = values[i][j++];
                dto.Name = values[i][j++];
                dto.Remarks = values[i][j++];
                dto.RowNumber = i + 1;

                dtoes.Add(dto);
            }

            return dtoes;
        }

        /**Convertissez Dto en Tsv.**/
        private List<string> ConvertToTsv(List<Dto> dtoes)
        {
            var lines = new List<string>();

            //Créez une valeur de retour en préfixant le numéro de ligne.
            foreach (var dto in dtoes)
            {
                var line =
                    dto.RowNumber + "\t" +
                    dto.Id + "\t" +
                    dto.Remarks;
                lines.Add(line);
            }
            return lines;
        }

        /**Classe intermédiaire pour le traitement**/
        private class Dto
        {
            public int RowNumber { get; set; }
            public string Id { get; set; }
            public string Name { get; set; }
            public string Remarks { get; set; }

        }
java
   /*La ligne des données transmises reçoit un numéro de ligne et est renvoyée.
     *Cependant, il est au format Tsv hors Nom.
     *ID au format ligne et colonne pour les valeurs,Name,Les remarques sont stockées.
     */
    public List<String> getTsvWithRowNumber(String[][] values) {

        List<Dto> dtoes = createDtoes(values);

        List<String> returnValues = convertToTsv(dtoes);

        return returnValues;
    }

    private List<Dto> createDtoes(String[][] values) {
        List<Dto> dtoes = new ArrayList<Dto>(values.length);

        //Convertir en Dto.
        for (int i = 0; i < values.length; i++) {
            int j = 0;
            Dto dto = new Dto();
            dto.setId(values[i][j++]);
            dto.setName(values[i][j++]);
            dto.setRemarks(values[i][j++]);
            dto.setRowNumber(i + 1);

            dtoes.add(dto);
        }
        return dtoes;
    }

    private List<String> convertToTsv(List<Dto> dtoes) {
        List<String> lines = new ArrayList<String>();

        //Créez une valeur de retour en préfixant le numéro de ligne.
        for (Dto dto : dtoes) {
            String line =
                    dto.getRowNumber() + "\t" +
                    dto.getId() + "\t" +
                    dto.getRemarks();
            lines.add(line);
        }
        return lines;
    }

    /**Classe intermédiaire pour le traitement**/
    private class Dto {
        private int rowNumber;
        private String Id;
        private String name;
        private String remarks;

        public int getRowNumber() {
            return rowNumber;
        }

        public void setRowNumber(int rowNumber) {
            this.rowNumber = rowNumber;
        }

        public String getId() {
            return Id;
        }

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

        public String getName() {
            return name;
        }

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

        public String getRemarks() {
            return remarks;
        }

        public void setRemarks(String remarks) {
            this.remarks = remarks;
        }



Article précédent (Getter, problème inverse de Setter)

Article suivant (lorsque le traitement après le branchement conditionnel est redondant)

Table des matières

Recommended Posts

Anything Arrangement-11 [Exemple de refactoring C #]
Getter, Setter Reverse Problem-10 [Exemple de refactoring C #]
Problèmes d’utilisation des valeurs d’affichage à l’écran-13 [C # Refactoring Sample]
Lorsque le traitement après le branchement conditionnel est redondant-12 [C # Refactoring Sample]
Convertir le tableau 2D de Swift en tableau 2D de C