[JAVA] Einfach zu wartender FizzBuzz

Einführung

Als ich mich auf einer Website zur Bewertung von Fähigkeiten für eine Abwechslung anmeldete, war das erste Problem FizzBuzz.

Es macht keinen Spaß, nur FizzBuzz zu lösen, also schreibe ich, dass FizzBuzz, das auf meine Weise einfach zu warten ist, so aussieht.

Der Code, der schließlich übernommen wurde

Eigentlich unterscheidet es sich ein wenig von der eingereichten Antwort, aber als Ergebnis des Refactorings nach dem Absenden der Antwort wurde es wie folgt.

public final class FizzBuzz {
    /**
     *Geben Sie den numerischen Wert von 1 bis 100 wie folgt an die Standardausgabe aus.
     * <p>
     * <ul>
     * <li>Für Vielfache von 3 und 5: "FizzBuzz"Und Ausgabe</li>
     * <li>Wenn es ein Vielfaches von 3 und kein Vielfaches von 5 ist: "Fizz"Und Ausgabe</li>
     * <li>Wenn es ein Vielfaches von 5 anstelle eines Vielfachen von 3 ist: "Buzz"Und Ausgabe</li>
     * <li>Wenn beides nicht:Geben Sie den numerischen Wert so wie er ist aus</li>
     * </ul>
     *
     * @param args unbenutzt
     */
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            boolean fizz = (i % 3 == 0);
            boolean buzz = (i % 5 == 0);

            if (fizz && buzz) {
                System.out.println("FizzBuzz");
            } else if (fizz) {
                System.out.println("Fizz");
            } else if (buzz) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }
}

Schreiben Sie Javadoc genau

Die Spezifikation der Methode main () ist in Javadoc beschrieben. Es ist normalerweise nicht möglich, nicht verwendete Argumente zu belassen, aber diesmal ist es die main () -Methode, daher werden die nicht verwendeten Argumente als "nicht verwendet" beschrieben.

Erklärende Variablen eingeführt

Es ist in Ordnung, "if (i% 3 == 0)" zu schreiben, aber es ist etwas unangenehm, denselben Ausdruck zweimal zu sehen, daher habe ich eine erklärende Variable eingefügt.

Es mag besser sein, den Variablennamen als "Vielfaches von 3" oder "Vielfaches von 5" darzustellen, aber ich konnte mir keinen guten Namen vorstellen, und diesmal "wenn es ein Vielfaches von 3 und ein Vielfaches von 5 ist," Fizz "und" Buzz ". Da es eine Spezifikation von "und Ausgabe" gibt, habe ich die Variablennamen "Fizz" und "Buzz" gewählt.

Setzen Sie Klammern, damit Sie sich nicht in der Priorität der Operatoren verlieren

boolean fizz = (i % 3 == 0);

Dies gilt auch dann, wenn Sie als Ergebnis Folgendes schreiben.

boolean fizz = i % 3 == 0;

Ohne Klammern kann dies den Leser des Codes jedoch für einen Moment verwirren. Es ist eine gute Idee, Klammern zu setzen, um den Leser nicht zu verwirren.

Lassen Sie die mittlere Halterung nicht weg

Sie können es wie folgt schreiben, aber wenn Sie die mittlere Klammer weglassen, ist es wahrscheinlicher, dass Sie einen Fehler machen, wenn später zusätzliche Verarbeitung hinzugefügt wird, sodass ich ihn nicht weggelassen habe.

Nun, es kann eine alte Gewohnheit sein, weil Sie es bemerken werden, wenn es richtig eingerückt ist.

public final class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            boolean fizz = (i % 3 == 0);
            boolean buzz = (i % 5 == 0);

            if (fizz && buzz) System.out.println("FizzBuzz");
            else if (fizz) System.out.println("Fizz");
            else if (buzz) System.out.println("Buzz");
            else System.out.println(i);
        }
    }
}

Schreiben Sie nicht "i% 15 == 0"

Ich sehe oft Code, der "if (i% 15 == 0)" in die Bedingungsbeurteilung schreibt.

Dies ist kein Fehler, aber in der FizzBuzz-Spezifikation wird die Nummer "15" nie erwähnt.

Natürlich ist es 3x5, aber ich habe versucht, die Nummer 15 nicht anzugeben, um sie nicht zu verwirren.

Final zur Klasse hinzufügen

Es gibt keine Vererbung oder Mist in einer Klasse, die nur statische Methoden hat. In der Vergangenheit habe ich nur kein Finale hinzugefügt, also wurde ich geerbt und geweint. Mit Ausnahme einiger Fälle wie Ausnahme füge ich grundsätzlich final hinzu.

Verwenden Sie Range nicht

Da Java die Methode zur Angabe des Bereichs in der Sprache nicht unterstützt, habe ich die folgende Schreibmethode nicht übernommen und eine einfache for-Anweisung verwendet, die jeder verstehen kann. Welches Sie tatsächlich verwenden, hängt von der Situation ab.

import java.util.stream.IntStream;

public static void main(String[] args) {
    IntStream.rangeClosed(1, 100).mapToObj((i) -> {
        if (i % 3 == 0 && i % 5 == 0) {
            return "FizzBuzz";
        } else if (i % 3 == 0) {
            return "Fizz";
        } else if (i % 5 == 0) {
            return "Buzz";
        } else {
            return String.valueOf(i);
        }
    }).forEach(System.out::println);
}

Wenn Ruby von der Sprache unterstützt wird, schreiben Sie natürlich wie folgt.

(1..100).each do |i|
   ...
end

Machen Sie keine unnötigen Abstraktionen

Sie können beispielsweise wie folgt schreiben (abgesehen vom Ausführen des Methodennamens) und denken, dass "ich möglicherweise später als die Standardausgabe ausgeben werde, damit ich sie als List zurückgeben kann".

In der Praxis wird es jedoch selten benötigt, und es gibt viele Fälle von Weinen aufgrund unnötiger Abstraktion. Es ist genug, um bei Bedarf umzugestalten.

import java.util.ArrayList;
import java.util.List;

public final class FizzBuzz {
    public static void main(String[] args) {
        List<String> results = FizzBuzz.run();

        for (String result : results) {
            System.out.println(result);
        }
    }

    private static List<String> run() {
        List<String> results = new ArrayList<>();

        for (int i = 1; i <= 100; i++) {
            boolean fizz = (i % 3 == 0);
            boolean buzz = (i % 5 == 0);

            if (fizz && buzz) {
                results.add("FizzBuzz");
            } else if (fizz) {
                results.add("Fizz");
            } else if (buzz) {
                results.add("Buzz");
            } else {
                results.add(String.valueOf(i));
            }
        }

        return results;
    }
}

abschließend

Es ist wie: "Was soll ich tun, wenn ich FizzBuzz ernst meine?", Aber es war ziemlich interessant aufzuschreiben, woran ich beim Codieren gedacht habe.

Recommended Posts

Einfach zu wartender FizzBuzz
Schreiben Sie einfach zu wartenden Code (Teil 1)
Schreiben Sie einfach zu pflegenden Code (Teil 4)
Schreiben Sie einfach zu wartenden Code (Teil 3)
Einfach zu erstellende Verarbeitungsbibliothek
Die Funktion ist sehr einfach zu bedienen
SpringBoot + Redis Einfache Demo
[Schienen] Einfache Möglichkeit, Spalten zu überprüfen
Einfach zu bedienender Cloud Firestore (Android)
to_ ○
Schreiben wir einen Code, der einfach zu pflegen ist (Teil 2)
Einfach, Slack Bot mit Java zu machen
Einfache Möglichkeit, iOS-App-Symbole festzulegen
So verwischen Sie das Bild (super einfach)
Einfache Möglichkeit, benutzerdefinierte JSP-Tags zu erstellen
[Einfach] So aktualisieren Sie Ruby und Bundler
Einfach mit regulären Java-Ausdrücken zu stolpern