Skip to content

Instantly share code, notes, and snippets.

@schauder
Created August 15, 2011 21:28
Show Gist options
  • Save schauder/1147908 to your computer and use it in GitHub Desktop.
Save schauder/1147908 to your computer and use it in GitHub Desktop.
Fizz Buzz Kata, mit dem 'funktionalen' refactoring von der Couch
package de.schauderhaft.kata.fizzbuzz
import org.scalatest.FunSuite
import org.scalatest.matchers.ShouldMatchers
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
@RunWith(classOf[JUnitRunner])
class FizzBuzzTest extends FunSuite with ShouldMatchers {
val testValues = List(
(1, "1"),
(2, "2"),
(3, "fizz"),
(5, "buzz"),
(6, "fizz"),
(15, "fizz buzz"))
for ((in, out) <- testValues)
test("fizzbuzz von %d ist '%s'".format(in, out)) {
fizzbuzz(in) should be(out)
}
for (in <- 1 to 1000 if (in % 5 == 0))
test(" fizzbuzz von %d contains buzz".format(in)) {
fizzbuzz(in) should endWith("buzz")
}
def fizzbuzz(i : Int) : String = {
def isDividable(value : Int, dividor : Int) : Boolean = value % dividor == 0
/** dies ist eine Funktion, die Funktionen produziert
und zwar nehmen die Ergebnisfunktionen eine Zahl als Argument und liefern entweder etwas, nämlich einen String (Some(result)) oder nichts (None).
*/
def rule(trigger : Int, result : String) : Int => Option[String] =
(i : Int) => if (isDividable(i, trigger)) Some(result) else None
/**
Eine Liste der Funktion, die bei Teilbarkeit durch die jeweilige Zahl den jeweiligen String als Ergbnis liefern
*/
val rules = List(rule(15, "fizz buzz"), rule(3, "fizz"), rule(5, "buzz"))
// eigentliche Implementierung von fizzbuzz
rules.flatMap(_.apply(i)).headOption.getOrElse(i.toString)
// ^-----------------^ geht alle Elemente (Funktionen) der Liste durch, wendet sie auf i an. Resultierende None's werden entfernt.
// ^--- liefert Some(erstenElement) wenn es das gibt, oder None
// ^--- Im Falle von Some liefert dies den Inhalt, im Falle von None,
// das was als Argument übergeben wird, als i.toString
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment