J'ai écrit mini-dames qui représente la carte dans deux formats: long positionID
et byte[][] board
. L'ancien est moins cher à stocker, ce dernier est plus facile à représenter/manipuler. La conversion elle-même est simple (voir le code ci-dessous).Développement piloté par les tests. Comment écrire un test unitaire pour cette conversion avant que les méthodes ne soient créées?
Le TDD indique «écrire un test défaillant, puis écrire le code de production». Comment cela devrait-il être fait avec la conversion de la représentation? Test unitaire comme
assertEquals(0L, toIndex(new byte[6][6]))
ne fournit pas beaucoup de couverture. Test pour Long myPosID = 42L; assertEquals(myPosID, toIndex(toBoard(myPosID))
n'ajoute pas beaucoup de valeur. Tester toute la gamme prendra une éternité. Exécuter un test unitaire pour plusieurs valeurs aléatoires myPosID
(simulation de Monte-Carlo) semble mieux, mais même en passant le test ne signifie pas grand-chose.
Comment devrait-il être fait dans TDD?
/*
This class manipulates checkers board representation. Position is stored as long and represented as byte[height][width] board.
For board representation white = 0, black = 1, empty = 2.
Long positionID to byte[][] board:
get ternary numeral system representation of positionID, place positional values to corresponding squares.
For conversion from byte[][] board to long positionID:
long positionID = 0; for each (byte playableSquare : board){playable square positionID = positionID*3. positionID+= playableSquare}
*/
public final int boardHeight = 6;
public final int boardWidth = 6;
public long toIndex(byte[][] board) {
byte coords[] = new byte[boardHeight * boardWidth/2];
int totalSquares = boardHeight * boardWidth/2;
byte k = 0;
for (int i = 0; i < boardHeight; i++) {
for (int j = 0; j < boardWidth/2; j++) {
byte makeItCheckers = (byte) ((i + 1) % 2);
coords[k] = board[i][j * 2 + makeItCheckers];
k++;
}
}
long positionID = 0;
for (int i = totalSquares - 1; i >= 0; i--) {
positionID = positionID * 3 + coords[i];
}
return positionID;
}
public byte[][] toBoard(long positionID) {
int totalSquares = boardHeight * boardWidth/2;
int[] coords = new int[totalSquares];
for (int i = 0; i < totalSquares; i++) {
coords[i] = (int) (positionID % 3L);
positionID = positionID/3L;
}
byte[][] board = new byte[boardHeight][boardWidth];
Arrays.fill(board, 2);
byte k = 0;
for (int i = 0; i < boardHeight; i++) {
for (int j = 0; j < boardWidth/2; j++) {
byte makeItCheckers = (byte) ((i + 1) % 2);
board[i][j * 2 + makeItCheckers] = (byte) coords[k];
k++;
}
}
return board;
}
Oui, dans TDD, vous devez d'abord écrire un test défaillant, puis écrire du code de production qui réussit un test. J'ai écrit mon code en premier. Maintenant, je pense, à quoi ressemblerait un TDD. Ils n'auraient pas de fonctions de conversion ou de tests au début. Ils écriraient un test. A quoi ressemblerait le test? – Stepan
Lorsque vous effectuez un TDD, cela ne signifie pas que vous sachiez à l'avance tous les traitements dont vous aurez besoin. Pour votre application, les exigences métier seront d'abord codées dans TDD. Normal: vous commencez à partir des besoins métier initiaux et vous commencez à écrire des tests puis à les implémenter. À la fois, pendant le développement, un besoin plus fin ou une exigence technique vient (ici convertir les données d'un format à un autre) et vous devez l'obtenir pour compléter les besoins d'affaires initiaux. Donc, vous les spécifiez dans TDD. – davidxxx
Permet d'appliquer cette logique à ma question. J'ai besoin d'un TEST et, plus tard, d'une méthode pour passer de la représentation décimale de LongIDID à un système de numération ternaire à "pour chaque valeur d'assignation carrée de la position correspondante dans la représentation numérique ternaire de" positionID ". Comment écrire ce test?!. Il ne couvre rien (vérifiez 0L, 1L, 2L et dites "nous passons! Hourra!" - nous avons simulé un test et trompé les collèges) ou il fonctionne pour toujours. Une méthode en elle-même est triviale. Mais si le test est si difficile à écrire, quel est le point de TDD? – Stepan