Программирование ката — это упражнение, которое помогает программисту отточить свои навыки посредством практики и повторения.
Эта статья является частью серии «Учебник по Java через Katas». Статьи делятся на легкие, средние и сложные.
Fizz Buzz (Легко) — Java 7
Берлинские часы (Easy) — Java 7 и 8
Игра в теннис (легкая) — Java 7
Обратная польская запись (средняя) — Java 7 и 8
В статье предполагается, что читатель уже имеет опыт работы с Java, что он знаком с основами использования тестов JUnit и что он знает, как запускать их из своей любимой IDE (например, IntelliJ IDEA ).
Тесты, которые доказывают, что решение является правильным, показаны ниже. Рекомендуемый способ решения этой проблемы заключается в использовании подхода к разработке на основе тестов (напишите реализацию для первого теста, подтвердите, что он прошел, и перейдите к следующему). Как только все тесты пройдены, ката может считаться решенной.
Одно из возможных решений приведено ниже тестов. Попробуйте сначала решить ката самостоятельно.
Игра в теннис
Реализуйте простую игру в теннис
Правила:
- Баллы от нуля до трех баллов описываются как «любовь», «пятнадцать», «тридцать» и «сорок» соответственно.
- Если по крайней мере три очка были набраны каждой стороной, и игрок имеет на одно очко больше, чем его противник, счет игры является «преимуществом» для игрока в лидере.
- Если по крайней мере три очка были набраны каждым игроком, и очки равны, счет «двойка».
- Игра выиграна первым игроком, который выиграл по крайней мере четыре очка в общей сложности и по крайней мере на два очка больше, чем противник.
[Тесты]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
public class GameTest { Player victor; Player sarah; Game game; @Before public void beforeGameTest() { victor = new Player( "Victor" ); sarah = new Player( "Sarah" ); game = new Game(victor, sarah); } @Test public void loveShouldBeDescriptionForScore0() { Game game = new Game(victor, sarah); assertThat(game, hasProperty( "score" , is( "love, love" ))); } @Test public void fifteenShouldBeDescriptionForScore1() { sarah.winBall(); assertThat(game, hasProperty( "score" , is( "love, fifteen" ))); } @Test public void thirtyShouldBeDescriptionForScore2() { victor.winBall(); victor.winBall(); sarah.winBall(); assertThat(game, hasProperty( "score" , is( "thirty, fifteen" ))); } @Test public void fortyShouldBeDescriptionForScore3() { IntStream.rangeClosed( 1 , 3 ).forEach((Integer) -> { victor.winBall(); }); assertThat(game, hasProperty( "score" , is( "forty, love" ))); } @Test public void advantageShouldBeDescriptionWhenLeastThreePointsHaveNeenScoredByEachSideAndPlayerHasOnePointMoreThanHisOpponent() { IntStream.rangeClosed( 1 , 3 ).forEach((Integer) -> { victor.winBall(); }); IntStream.rangeClosed( 1 , 4 ).forEach((Integer) -> { sarah.winBall(); }); assertThat(game, hasProperty( "score" , is( "advantage Sarah" ))); } @Test public void deuceShouldBeDescriptionWhenAtLeastThreePointsHaveBeenScoredByEachPlayerAndTheScoresAreEqual() { for ( int index = 1 ; index <= 3 ; index++) { victor.winBall(); } for ( int index = 1 ; index <= 3 ; index++) { sarah.winBall(); } assertThat(game, hasProperty( "score" , is( "deuce" ))); victor.winBall(); assertThat(game, hasProperty( "score" , is(not( "deuce" )))); sarah.winBall(); assertThat(game, hasProperty( "score" , is( "deuce" ))); } @Test public void gameShouldBeWonByTheFirstPlayerToHaveWonAtLeastFourPointsInTotalAndWithAtLeastTwoPointsMoreThanTheOpponent() { for ( int index = 1 ; index <= 4 ; index++) { victor.winBall(); } for ( int index = 1 ; index <= 3 ; index++) { sarah.winBall(); } assertThat(game, hasProperty( "score" , is(not( "Victor won" )))); assertThat(game, hasProperty( "score" , is(not( "Sarah won" )))); victor.winBall(); assertThat(game, hasProperty( "score" , is( "Victor won" ))); } } |
Тестовый код можно найти в GitHub GameTest.java . Другой набор тестов (не перечисленных выше) можно найти в GitHub PlayerTest.java .
[ОДИН ВОЗМОЖНОЕ РЕШЕНИЕ]
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class Game { private Player player1; private Player player2; public Game(Player player1, Player player2) { this .player1 = player1; this .player2 = player2; } public String getScore() { if (player1.getScore() >= 3 && player2.getScore() >= 3 ) { if (Math.abs(player2.getScore() - player1.getScore()) >= 2 ) { return getLeadPlayer().getName() + " won" ; } else if (player1.getScore() == player2.getScore()) { return "deuce" ; } else { return "advantage " + getLeadPlayer().getName(); } } else { return player1.getScoreDescription() + ", " + player2.getScoreDescription(); } } public Player getLeadPlayer() { return (player1.getScore() > player2.getScore()) ? player1 : player2; } } |
Код решения Java можно найти в решении Game.java . Он использует класс Player (не указан выше), который можно найти в решении Player.java .
Ссылка: | Учебник по Java с помощью Katas: Tennis Game (Easy) от нашего партнера по JCG Виктора Фарчича в блоге по технологиям . |