[JAVA] Verschwenderische Verarbeitung von Sammlungen - ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 5 [C # Refactoring Sample]

Verschwendete Abholung der Sammlung

Bei Sammlungen wird in einem normalen Projekt häufig die Codierungskonvention angezeigt, dass "Sammlungen leere Instanzen zurückgeben, ohne Nullen zurückzugeben". Andererseits haben viele Menschen diese Vereinbarung zum ersten Mal gehört. Infolgedessen sehen wir oft nutzlose Nullprüfungen. Wenn jemand mit Java-Erfahrung bei einem C # -Projekt half, gab es eine Person, die die Anzahl der Fälle überprüfte und dann eine for-Schleife durchführte. Ich bin der Meinung, dass der Erfassungsvorgang unabhängig von der Sprache nicht bekannt ist.

Beispielcode

Betrachten Sie den Code, der von der Datenbank abgerufen wird und den Wert ausgibt, der an die Konsole gesendet wird. Es gibt einige Probleme mit diesem Code.

  1. Die Sammlung soll null sein.
  2. Wenn die Sammlung null ist, wird ein "Fehler" ausgegeben, aber die Ausnahmeinformationen werden gequetscht.
  3. Die Anzahl der Fälle wird vor Verwendung von foreach überprüft.
          internal void Main()
        {
            var items = GetDataFromDB();
            //NG1 NULL vor jeder Prüfung prüfen
            if (items != null)
            {
                foreach (var item in items)
                {
                    Console.WriteLine(item);
                }
            }

            //NG2 NULL-Prüfung und Zählprüfung vor jeder Prüfung
            if (items != null && items.Count > 0)
            {
                foreach (var item in items)
                {
                    Console.WriteLine(item);
                }
            }

            //Ich gehe davon aus, dass NG3 NULL nicht kommen wird, aber überprüfen Sie aus irgendeinem Grund die Anzahl der Fälle
            if (items.Count > 0)
            {
                foreach (var item in items)
                {
                    Console.WriteLine(item);
                }
            }

            //Fehler, wenn die NG4-Liste null ist
            if (items == null)
            {
                Console.WriteLine("Error");
            }
        }

        /**Daten aus der DB abrufen**/
        private List<string> GetDataFromDB()
        {
            //Holen Sie sich Daten aus der Datenbank und setzen Sie im Fehlerfall NULL.
            //Es wird angenommen, dass der neue Teil Daten von Dao erhält.
            try
            {
                var list = new List<string>();
                list.Add("1");
                list.Add("2");
                return list;
            }
            catch (Exception)
            {
                return null;
            }
        }

Nach dem Refactoring

Die Annahme von null wurde entfernt und die Ausnahme in den Rückgabewert aufgenommen.

        internal void Main()
        {
            var result = GetDataFromDB();
            var items = result.Items;
            //Keine Notwendigkeit für Nullprüfung oder Zählprüfung
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }

            //Wenn eine Ausnahme aufgetreten ist, werden die Ausnahmeinformationen ausgegeben.
            if (result.Exception !=null)
            {
                Console.WriteLine(result.Exception.ToString());
            }
        }

        /**Daten aus der DB abrufen**/
        private Result GetDataFromDB()
        {
            //Holen Sie sich Daten aus der Datenbank und setzen Sie im Fehlerfall NULL.
            //Es wird angenommen, dass der neue Listenteil Daten von Dao erhält.
            try
            {
                var list = new List<string>();
                list.Add("1");
                list.Add("2");
                return new Result(list, null);
            }
            catch (Exception ex)
            {
                return new Result(new List<string>(), ex);
            }
        }

        /**Verarbeitungsergebnisklasse einschließlich Rückgabewert und Ausnahmeverarbeitung**/
        private class Result
        {
            internal List<string> Items { get; private set; }
            internal Exception Exception { get; private set; }

            internal Result(List<string> items, Exception ex)
            {
                this.Items = items;
                this.Exception = ex;
            }
        }

Zusammenfassung

Indem wir die Sammlung nicht auf Null setzen, konnten wir redundanten Code eliminieren. Es ist jedoch notwendig, eine andere Methode für diejenigen in Betracht zu ziehen, die "Überprüfen Sie die Anzahl der Fälle vor jedem". Auf mysteriöse Weise kann die Anzahl der Fälle überprüft werden oder nicht, sodass die Kriterien unbekannt sind. Ich denke nicht, dass die Regel, dass "Sie nicht die Anzahl der Fälle vor oder für jeden prüfen dürfen", nicht festgelegt wird.

Außerdem schreiben Personen, die Ausnahmen mit null behandeln, denselben Code, auch wenn es sich nicht um eine Sammlung handelt. Daher ist dies auch schwierig zu handhaben. Dieses Problem bei der Ausnahmebehandlung betrifft nicht nur Sammlungen.

Derzeit wird das Problem durch "Machen Sie die Sammlung nicht null" bis zu einem gewissen Grad gelöst. Üben Sie es daher bitte. Es ist jedoch nicht strengstens verboten, und wenn es unbedingt erforderlich ist, es auf Null zu setzen, sollten Sie es dem Architekten erklären und die Erlaubnis einholen.

Beispielcode (Java) 24.03.2017 Hinzugefügt

    protected void main() {
        List<String> items = getDataFromDB();
        //NG1 NULL vorher auf prüfen
        if (items != null) {
            for (String item : items) {
                System.out.println(item);
            }
        }

        //NG2 Nachdem Sie NULL und die Anzahl der Fälle überprüft haben, z
        if (items != null && items.size() > 0) {
            for (String item : items) {
                System.out.println(item);
            }
        }

        //Ich gehe davon aus, dass NG3 NULL nicht kommen wird, aber überprüfen Sie aus irgendeinem Grund die Anzahl der Fälle
        if (items.size() > 0) {
            for (String item : items) {
                System.out.println(item);
            }
        }

        //Fehler, wenn die NG4-Liste null ist
        if (items == null) {
            System.out.println("Error");
        }
    }

    private List<String> getDataFromDB() {
        //Holen Sie sich Daten aus der Datenbank und setzen Sie im Fehlerfall NULL.
        //Es wird angenommen, dass der neue Teil Daten von Dao erhält.
        try {

            List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            return list;

        } catch (Exception e) {
            return null;
        }
    }

Nach dem Refactoring (Java)

    protected void main() {
        Result result = getDataFromDB();
        List<String> items = result.getItems();
        //Keine Notwendigkeit für Nullprüfung oder Zählprüfung
        for (String item : items) {
            System.out.println(item);
        }

        //Wenn eine Ausnahme aufgetreten ist, werden die Ausnahmeinformationen ausgegeben.
        if (result.getException() != null) {
            System.out.println(result.getException().toString());
        }
    }

    /**Daten aus der DB abrufen**/
    private Result getDataFromDB() {
        //Holen Sie sich Daten aus der Datenbank und setzen Sie im Fehlerfall NULL.
        //Es wird angenommen, dass der neue Listenteil Daten von Dao erhält.
        try {
            List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            return new Result(list, null);

        } catch (Exception e) {
            return new Result(new ArrayList<String>(), e);
        }
    }

    /**Verarbeitungsergebnisklasse einschließlich Rückgabewert und Ausnahmeverarbeitung**/
    protected class Result {
        private List<String> items;
        private Exception exception;

        protected Result(List<String> items, Exception exception) {
            this.items = items;
            this.exception = exception;
        }

        protected List<String> getItems() {
            return items;
        }

        protected Exception getException() {
            return exception;
        }
    }

[Vorheriger Artikel (redundante Zuweisungsanweisung)] (http://qiita.com/csharpisthebest/items/f9ebc741e40037553d5b)

Nächster Artikel (einfache Nullprüfung)

Inhaltsverzeichnis

Recommended Posts

Verschwenderische Verarbeitung von Sammlungen - ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 5 [C # Refactoring Sample]
Easy Null Check - Ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 6 [C # Refactoring-Beispiel]
Eine etwas besorgniserregende Codesammlung - ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 2 [C # Refactoring Sample]
Komplizierte bedingte Verzweigung - ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 1 [C # Refactoring-Beispiel]
Bool-Typ-Handling - Ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 7 [C # Refactoring-Beispiel]
Zu viele Funktionsargumente - ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 8 [C # Refactoring-Beispiel]
Eine flüssige Schnittstelle? -Ich möchte Ihnen die Möglichkeit geben, guten Code zu schreiben. 3 [C # Refactoring Sample]
Ist es möglich, Funktionsaufrufe und bedingte Verzweigungen zu trennen? -Ich möchte eine gute Gelegenheit zum Schreiben von Code geben. 9 [C # Refactoring-Beispiel]
Port C-Code mit vielen Typecasts zu Swift
Wie man guten Code schreibt
Eine Sammlung von Mustern, die Sie kennen möchten, um den Code nicht zu komplizieren
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
Ich möchte ein schönes build.gradle schreiben
Stellen Sie sich RxJava als eine Bibliothek vor, die das Schreiben von asynchroner Verarbeitung erleichtert
Ich habe ein Beispiel erstellt, wie ein Delegat in Swift UI 2.0 mit MapKit geschrieben wird