Il y a déjà beaucoup de bonnes réponses à cette question et j'ai commenté et voté plusieurs d'entre elles. Néanmoins, j'aimerais ajouter quelques réflexions.
La flexibilité n'est pas pour les novices
Le PO indique clairement qu'il n'a pas l' expérience de la TDD et je pense qu'une bonne réponse doit en tenir compte. Dans la terminologie du modèle d'acquisition de compétences de Dreyfus , il est probablement un novice . Il n'y a rien de mal à être novice - nous sommes tous novices lorsque nous commençons à apprendre quelque chose de nouveau. Cependant, ce que le modèle Dreyfus explique, c’est que les novices se caractérisent par
- adhérence rigide aux règles ou plans enseignés
- pas d'exercice de jugement discrétionnaire
Ce n'est pas une description d'un déficit de personnalité, il n'y a donc aucune raison d'avoir honte de cela. C'est une étape que nous devons tous traverser pour apprendre quelque chose de nouveau.
Ceci est également vrai pour TDD.
Bien que je sois d’accord avec de nombreuses autres réponses, le TDD n’a pas à être dogmatique et qu’il peut parfois être plus bénéfique de travailler de manière alternative, cela n’aide pas les débutants. Comment pouvez-vous exercer un jugement discrétionnaire lorsque vous n'avez aucune expérience?
Si un novice accepte le conseil selon lequel il est parfois acceptable de ne pas faire de TDD, comment peut-il déterminer quand il est acceptable de ne pas le faire?
En l'absence d'expérience ou de conseils, la seule chose à faire pour un novice est de ne pas utiliser TDD chaque fois que cela devient trop difficile. C'est la nature humaine, mais pas un bon moyen d'apprendre.
Écoutez les tests
Sauter hors du TDD chaque fois que cela devient difficile est de rater l'un des avantages les plus importants du TDD. Les tests fournissent des informations précoces sur l'API du SUT. Si le test est difficile à écrire, c'est un signe important que le SUT est difficile à utiliser.
C’est la raison pour laquelle l’un des messages les plus importants du GOOS est le suivant: écoutez vos tests!
Dans le cas de cette question, ma première réaction en voyant l’API proposée du jeu Yahtzee et la discussion sur la combinatoire que l’on peut trouver sur cette page ont été qu’il s’agissait d’un retour important sur l’API.
Est-ce que l'API doit représenter les jets de dés comme une séquence ordonnée d'entiers? Pour moi, cette odeur d' obsession primitive . C'est pourquoi j'ai été heureux de voir la réponse de Tallseth suggérant l'introduction d'un Roll
cours. Je pense que c'est une excellente suggestion.
Cependant, je pense que certains des commentaires à cette réponse se trompent. Ce que TDD suggère alors, c'est qu'une fois que vous avez eu l'idée qu'un Roll
cours serait une bonne idée, vous suspendez les travaux sur le système sous test original et commencez à travailler sur le Roll
cours.
Bien que je convienne que le TDD vise plus le «joyeux chemin» que les tests complets, il aide toujours à décomposer le système en unités gérables. Un Roll
cours ressemble à quelque chose que vous pourriez terminer beaucoup plus facilement.
Ensuite, une fois que la Roll
classe aura suffisamment évolué, reviendriez-vous sur le SUT d’origine et définissez-le en termes d’ Roll
entrées.
La suggestion d'un Test Helper n'implique pas forcément un caractère aléatoire, c'est simplement un moyen de rendre le test plus lisible.
Une autre façon d’aborder et de modéliser les entrées en termes d’ Roll
instances serait d’introduire un générateur de données de test .
Red / Green / Refactor est un processus en trois étapes
Bien que je sois d’accord avec l’opinion générale selon laquelle (si vous êtes suffisamment expérimenté en TDD), vous n’avez pas besoin de vous en tenir rigoureusement, je pense que c’est plutôt mauvais conseil dans le cas d’un exercice de Yahtzee. Bien que je ne connaisse pas les détails des règles de Yahtzee, je ne vois ici aucun argument convaincant pour justifier l'impossibilité de respecter rigoureusement le processus Red / Green / Refactor et d'obtenir un résultat correct.
Ce que la plupart des gens semblent oublier ici est la troisième étape du processus Red / Green / Refactor. D'abord, vous écrivez le test. Ensuite, vous écrivez la mise en œuvre la plus simple qui passe tous les tests. Ensuite, vous refactor.
C'est ici, dans ce troisième État, que vous pouvez mettre à profit toutes vos compétences professionnelles. C'est là que vous êtes autorisé à réfléchir sur le code.
Cependant, je pense que c’est une échappatoire de dire que vous devriez seulement "écrire la chose la plus simple possible qui ne soit pas complètement aveugle et qui, à l’évidence, soit incorrecte ". Si vous pensez en savoir assez sur la mise en œuvre, alors tout ce qui reste avant la solution complète sera manifestement incorrect . En ce qui concerne les conseils, ceci est donc plutôt inutile pour un novice.
Ce qui devrait vraiment arriver, c’est que si vous pouvez faire passer tous les tests avec une implémentation manifestement incorrecte , c’est un retour que vous devriez écrire un autre test .
Il est étonnant de constater combien de fois cela vous mène vers une implémentation totalement différente de celle que vous aviez en tête en premier. Parfois, l’alternative qui se développe de la sorte peut s’avérer meilleure que votre plan initial.
La rigueur est un outil d'apprentissage
Il est tout à fait logique de s'en tenir à des processus rigoureux comme Red / Green / Refactor tant que l'on apprend. Cela oblige l'apprenant à acquérir de l'expérience avec le TDD non seulement quand c'est facile, mais aussi quand c'est difficile.
Ce n'est que lorsque vous maîtriserez tous les aspects difficiles que vous serez en mesure de prendre une décision éclairée sur le moment de dévier du «vrai» chemin. C'est à ce moment que vous commencez à former votre propre chemin.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)