[JAVA] Facile à entretenir FizzBuzz

introduction

Lorsque je me suis inscrit sur un site d'évaluation de compétences pour un changement de rythme, le premier problème était FizzBuzz.

Ce n'est pas amusant de simplement résoudre FizzBuzz, alors j'écrirai que FizzBuzz, qui est facile à entretenir à ma manière, ressemble à ceci.

Le code finalement adopté

En fait, c'est un peu différent de la réponse soumise, mais à la suite de la refactorisation après avoir soumis la réponse, il est devenu comme suit.

public final class FizzBuzz {
    /**
     *Sortez la valeur numérique de 1 à 100 sur la sortie standard comme suit.
     * <p>
     * <ul>
     * <li>Pour les multiples de 3 et 5: "FizzBuzz"Et sortie</li>
     * <li>S'il s'agit d'un multiple de 3 et non d'un multiple de 5: "Fizz"Et sortie</li>
     * <li>S'il s'agit d'un multiple de 5 au lieu d'un multiple de 3: "Buzz"Et sortie</li>
     * <li>Si ni:Sortie de la valeur numérique telle quelle</li>
     * </ul>
     *
     * @param args inutilisé
     */
    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);
            }
        }
    }
}

Écrivez Javadoc exactement

La spécification de la méthode main () est décrite dans Javadoc. Il n'est généralement pas possible de laisser des arguments inutilisés, mais cette fois c'est la méthode main (), donc les arguments inutilisés sont décrits comme "inutilisés".

Introduction de variables explicatives

C'est correct d'écrire ʻif (i% 3 == 0) `, mais c'est un peu désagréable de voir la même expression deux fois, donc j'ai inclus une variable explicative.

Il serait peut-être préférable de représenter le nom de la variable sous la forme "un multiple de 3" ou "un multiple de 5", mais je ne pouvais pas penser à un bon nom, et cette fois, "s'il s'agit d'un multiple de 3 et un multiple de 5," pétiller "et" buzz " Puisqu'il y a une spécification de "et sortie", j'ai choisi les noms de variable "fizz" et "buzz".

Mettez des parenthèses pour ne pas vous perdre dans la priorité des opérateurs

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

C'est la même chose même si vous écrivez ce qui suit.

boolean fizz = i % 3 == 0;

Mais sans parenthèses, cela peut perturber les lecteurs de code pendant une seconde. C'est une bonne idée de mettre des parenthèses pour ne pas embrouiller le lecteur.

N'omettez pas le support central

Vous pouvez l'écrire comme suit, mais si vous omettez le crochet du milieu, vous êtes plus susceptible de faire une erreur lors de l'ajout d'un traitement supplémentaire plus tard, donc je ne l'ai pas omis.

Eh bien, c'est peut-être une vieille habitude parce que vous la remarquerez si elle est correctement en retrait.

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);
        }
    }
}

ʻI% 15 == 0` n'est pas écrit

Je vois souvent du code qui dit «si (i% 15 == 0)» dans le jugement de condition.

Ce n'est pas une erreur, mais la spécification FizzBuzz ne mentionne jamais le nombre "15".

Évidemment, c'est 3x5, bien sûr, mais j'ai essayé de ne pas donner le nombre 15 pour ne pas le confondre.

Ajouter la finale à la classe

Il n'y a pas d'héritage ou de merde dans une classe qui n'a que des méthodes statiques, Dans le passé, je n'ai simplement pas ajouté la finale, alors j'ai été hérité et j'ai pleuré. Sauf pour certains cas tels que Exception, j'ajoute essentiellement final.

N'utilisez pas la gamme

Étant donné que Java ne prend pas en charge la méthode d'indication de la plage dans le langage, je n'ai pas adopté la méthode d'écriture suivante et utilisé une simple instruction for que tout le monde peut comprendre. Celui que vous utilisez réellement dépend de la situation.

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);
}

Bien sûr, si Ruby est pris en charge par le langage, écrivez comme suit.

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

Ne faites pas d'abstractions inutiles

Par exemple, vous pouvez écrire comme suit (à part le nom de la méthode run), en pensant que "je pourrais produire une sortie autre que la sortie standard plus tard, donc je veux pouvoir la renvoyer en tant que List ".

Cependant, cela est rarement nécessaire dans la pratique et il existe de nombreux cas de pleurs à cause d'abstraction inutile. Il suffit de refactoriser en cas de besoin.

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;
    }
}

en conclusion

C'est comme: "Que dois-je faire si je suis sérieux au sujet de FizzBuzz?", Mais c'était assez intéressant d'écrire ce à quoi je pensais lors du codage.

Recommended Posts

Facile à entretenir FizzBuzz
Écrire du code facile à maintenir (partie 1)
Écrire du code facile à maintenir (partie 4)
Écrire du code facile à maintenir (partie 3)
Bibliothèque de traitement facile à créer
La fonction est très facile à utiliser
SpringBoot + Redis Démo facile à faire
[Rails] Un moyen simple de vérifier les colonnes
Facile à utiliser Cloud Firestore (Android)
à_ ○
Écrivons un code facile à maintenir (Partie 2) Nom
Facile à créer Slack Bot avec Java
Un moyen simple de définir les icônes des applications iOS
Comment brouiller l'image (super facile)
Un moyen simple de créer des balises personnalisées JSP
[Facile] Comment mettre à niveau Ruby et le bundler
Facile à parcourir avec les expressions régulières Java