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.
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);
}
}
}
}
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".
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".
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.
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);
}
}
}
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.
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.
É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
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;
}
}
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