[JAVA] Anything Arrangement-11 [C # Refactoring-Beispiel]

Was ist ein Array?

Für Programmierer, die die Klasse nicht kennen, ist es häufig der Fall, dass alle Teile, die zu einer Klasse gemacht werden sollen, durch ein Array dargestellt werden. Verwenden Sie beispielsweise anstelle von List ein erweiterbares Array oder machen Sie alle Teile, die Klassenmitgliedern entsprechen, zu Arrays. Die Sequenz kann universell sein, wenn man bedenkt, dass die Sequenz schließlich verwendet wird, um die Produktion abzuschließen. Auf der anderen Seite ist es eine schlechte Angewohnheit, weil es nicht einfach zu warten ist und selbst eine kleine Änderung der Spezifikationen die Anzahl der Codeänderungen erhöht. Denken wir konkret mit dem Beispielcode.

Beispielcode

Betrachten Sie ein Beispiel für die Konvertierung eines Arrays mit ID, Name und Anmerkungen in ein zweidimensionales Array in TSV.

        /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
         *Es ist jedoch im Tsv-Format ohne Name.
         *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var ids = new string[values.Length];
            var remarks = new string[values.Length];
            var rowNumbers = new int[values.Length];

            //In einem zeilenweisen Array speichern.
            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>();

            //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
            for (int i = 0; i < ids.Length; i++)
            {
                var line =
                    rowNumbers[i] + "\t" +
                    ids[i] + "\t" +
                    remarks[i];
                returnValues.Add(line);
            }

            return returnValues;
        }

java
    /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
     *Es ist jedoch im Tsv-Format ohne Name.
     *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
     */
    public List<String> getTsvWithRowNumber(String[][] values) {
        String[] ids = new String[values.length];
        String[] remarks = new String[values.length];
        int[] rowNumbers = new int[values.length];

        //In einem zeilenweisen Array speichern.
        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>();

        //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
        for (int i = 0; i < ids.length; i++) {
            String line =
                    rowNumbers[i] + "\t" +
                    ids[i] + "\t" +
                    remarks[i];
            returnValues.add(line);
        }

        return returnValues;
    }

Problem

Dieser Code fügt jedes Element in ein Array ein, und jedes Array muss mit der Anzahl der Zeilen übereinstimmen. Ein Fehler außerhalb der Indexgrenzen tritt auf, wenn das Array falsch deklariert wird. Wenn die Anzahl der Elemente gering ist, kann sie verwaltet werden. In Geschäftsanwendungen sind jedoch normalerweise 10 oder mehr Elemente vorhanden, sodass es schwierig ist, alle Elemente anzuordnen.

Nach dem Refactoring

Durch Konvertieren in Dto und anschließende Verarbeitung wird die Lesbarkeit verbessert und Indexprobleme gelöst. Um die magische Zahl zu reduzieren, wurde sie auf die Werte [i] [j ++] geändert. Die Lesbarkeit ist verringert, aber der Korrekturbereich beim Hinzufügen von Elementen ist verringert.

       /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
         *Es ist jedoch im Tsv-Format ohne Name.
         *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var dtoes = new List<Dto>(values.Length);

            //In Dto konvertieren.
            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>();

            //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
            foreach (var dto in dtoes)
            {
                var line =
                    dto.RowNumber + "\t" +
                    dto.Id + "\t" +
                    dto.Remarks;
                returnValues.Add(line);
            }

            return returnValues;
        }

        /**Zwischenklasse für die Verarbeitung**/
        private class Dto
        {
            public int RowNumber { get; set; }
            public string Id { get; set; }
            public string Name { get; set; }
            public string Remarks { get; set; }

        }

java
    /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
     *Es ist jedoch im Tsv-Format ohne Name.
     *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
     */
    public List<String> getTsvWithRowNumber(String[][] values) {
        List<Dto> dtoes = new ArrayList<Dto>(values.length);

        //In Dto konvertieren.
        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>();

        //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
        for (Dto dto : dtoes) {
            String line =
                    dto.getRowNumber() + "\t" +
                    dto.getId() + "\t" +
                    dto.getRemarks();
            returnValues.add(line);
        }

        return returnValues;
    }

    /**Zwischenklasse für die Verarbeitung**/
    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;
        }

Zusammenfassung

Wenn es sich um eine Datenstruktur handelt, sollten Sie zunächst in Betracht ziehen, sie zu einer Klasse zu machen. Wenn Sie die Klasse nicht verstehen, warum nicht mit einer objektorientierten Studie beginnen?

Auch das Schreiben mit Arrays war in VB6 üblich, aber ich habe das Gefühl, dass viele Programmierer beim Wechsel zu .Net nicht auf objektorientiert umsteigen konnten.

Nachtrag 2017/4/9 Im Kommentarbereich wurde darauf hingewiesen, dass der Prozess der Konvertierung in Dto eine Methode sein sollte. Hier ist also der Code, der den Prozess zu einer Methode gemacht hat.

Nach dem Refactoring

Nicht nur Werte => Dto, sondern auch Dto => Tsv ist eine Methode.

        /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
         *Es ist jedoch im Tsv-Format ohne Name.
         *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
         */
        public List<string> GetTsvWithRowNumber(string[][] values)
        {
            var dtoes = CreateDtoes(values);

            var returnValues = ConvertToTsv(dtoes);

            return returnValues;
        }

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

            //In Dto konvertieren.
            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;
        }

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

            //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
            foreach (var dto in dtoes)
            {
                var line =
                    dto.RowNumber + "\t" +
                    dto.Id + "\t" +
                    dto.Remarks;
                lines.Add(line);
            }
            return lines;
        }

        /**Zwischenklasse für die Verarbeitung**/
        private class Dto
        {
            public int RowNumber { get; set; }
            public string Id { get; set; }
            public string Name { get; set; }
            public string Remarks { get; set; }

        }
java
   /*Die Zeile der übergebenen Daten erhält eine Zeilennummer und wird zurückgegeben.
     *Es ist jedoch im Tsv-Format ohne Name.
     *ID im Zeilen- und Spaltenformat für Werte,Name,Anmerkungen werden gespeichert.
     */
    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);

        //In Dto konvertieren.
        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>();

        //Erstellen Sie einen Rückgabewert, indem Sie der Zeilennummer ein Präfix voranstellen.
        for (Dto dto : dtoes) {
            String line =
                    dto.getRowNumber() + "\t" +
                    dto.getId() + "\t" +
                    dto.getRemarks();
            lines.add(line);
        }
        return lines;
    }

    /**Zwischenklasse für die Verarbeitung**/
    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;
        }



Vorheriger Artikel (Getter, Setter-Umkehrproblem)

Nächster Artikel (wenn die Verarbeitung nach der bedingten Verzweigung redundant ist)

Inhaltsverzeichnis

Recommended Posts

Anything Arrangement-11 [C # Refactoring-Beispiel]
Getter, Setter Reverse Problem-10 [C # Refactoring Sample]
Probleme bei der Verwendung von Bildschirmanzeigewerten-13 [C # Refactoring Sample]
Wenn die Verarbeitung nach der bedingten Verzweigung redundant ist-12 [C # Refactoring Sample]
Konvertieren Sie das 2D-Array von Swift in das 2D-Array von C.