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