Created
August 27, 2018 13:34
-
-
Save jaymoid/5c3fe073cdd0fae6fdd724da356dc804 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import kotlin.math.abs | |
data class Player(val name: String, var points: Int = 0) | |
class TennisGameKotlin(player1Name: String, player2Name: String) : TennisGame { | |
private val player1 = Player(player1Name) | |
private val player2 = Player(player2Name) | |
private val scores = listOf("Love", "Fifteen", "Thirty", "Forty") | |
override fun wonPoint(player: String) = | |
if (player === player1.name) | |
player1.points += 1 | |
else | |
player2.points += 1 | |
override fun getScore(): String = | |
when { | |
someoneHasWon() -> "Win for ${winningPlayer().name}" | |
playerHasAdvantage() -> "Advantage ${winningPlayer().name}" | |
gameIsDrawn() -> if (player1.points >= 3) "Deuce" else scores[player1.points] + "-All" | |
else -> scores[player1.points] + "-" + scores[player2.points] | |
} | |
private fun someoneHasWon() = pointsDifference() >= 2 && aPlayerHasMoreThan3Points() | |
private fun winningPlayer() = if (player1.points > player2.points) player1 else player2 | |
private fun gameIsDrawn() = player1.points == player2.points | |
private fun playerHasAdvantage() = pointsDifference() == 1 && aPlayerHasMoreThan3Points() | |
private fun aPlayerHasMoreThan3Points() = player1.points > 3 || player2.points > 3 | |
private fun pointsDifference() = abs(player1.points - player2.points) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thoroughly enjoyable refactorring Kata by @emilybache - play along at home here:
https://github.com/emilybache/Tennis-Refactoring-Kata
Original source java code: https://github.com/emilybache/Tennis-Refactoring-Kata/blob/master/java/src/main/java/TennisGame2.java