2010-10-27 12 views
1

Je viens de commencer à TDD et j'ai très vite couru dans un mur de briques. Voici mon scénario ... J'essaie de modéliser un objet image, et en passant par les étapes TDD j'ai commencé avec un objet simple qui finalement a grandi dans ...Gérer les problèmes de mise en œuvre dans TDD

public class ImageObject 
{ 
public string Name {get; set;} 
public int Width {get; set;} 
public int Height {get; set;} 

public bool IsValid() 
{ 
    //Some rules 
} 
} 

Bien sûr, les essais obligatoires ...

[Test] 
public void ImageWidthCannotBeLessThanZero {...} 
[Test] 
public void ImageHeightCannotBeLessThanZero {...}  
and so forth... 

Jusqu'ici tout va bien. Ensuite, je veux représenter le fichier physique dans la classe en quelque sorte. Il pourrait être un chemin de fichier

public class ImageObject 
{ 
    public string Path {get; set;} 
} 

ou une série d'octets

public class ImageObject 
{ 
    public byte[] Bytes {get; set;} 
} 

(S'il vous plaît ce n'est pas un argument à propos de DB vs système de fichiers pour le stockage.)

A ce stade, je Je ne me sens pas à l'aise parce que mon esprit est en train de dériver et de commencer à penser aux détails de l'infrastructure/de la mise en œuvre. Où est mon défaut ?? Devrais-je prendre la décision à l'avance sur les détails de mise en œuvre? Ai-je besoin d'un motif de conception intelligent pour faire face à cela? Un cadre moqueur pourrait-il aider? C'est un problème d'analyse/conception d'objet et je devrais utiliser des outils UML? (Attendez une minute je pensais que TDD était sur le design?)

De toute façon comment puis-je surmonter ce problème? Je veux rester concentré sur la conception de mes objets et ne pas penser aux problèmes d'infrastructure en ce moment?

Répondre

2

Je pense que vous pourriez commencer au mauvais endroit. Vous dites 'Ensuite, je veux représenter le dossier physique de la classe en quelque sorte' - pourquoi? Quel test échoue qui a conduit à la nécessité de représenter le fichier physique? Un problème est que vous exposer la représentation à travers une propriété publique - est-ce vraiment ce que vous voulez faire? Ou la représentation physique peut-elle rester privée, avec un accès uniquement via certaines opérations que vous avez choisi de mettre en œuvre (par exemple, 'LoadImage()', 'GetImageBytes()')? Si cela reste confidentiel, vos tests ne devraient pas avoir d'incidence sur la mise en œuvre.

+0

Voulez-vous dire que je ne devrais pas me soucier du fichier physique en ce moment? Et à la place je devrais m'inquiéter à ce sujet quand je commence à concevoir le consommateur de l'ImageObject? – Fixer

+0

Vous pouvez commencer à y penser maintenant, je dis simplement en termes de TDD, faites-le en fonction du comportement. Comme dans mon exemple, si vous avez besoin des octets de l'image, vous pouvez avoir une méthode GetBytes() au lieu de permettre un accès direct à la représentation physique. Ensuite, vous pourriez écrire des tests pour GetBytes(), et l'implémenter comme vous le vouliez physiquement. Vous pouvez vous en soucier ou non à ce stade de développement. –

+0

@Fixer - Les tests unitaires sont des consommateurs de 'ImageObject' – Gutzofter

1

Dans TDD, la classe en cours de développement doit être considérée avec une perspective extérieure. D'où vient l'image? Qu'avez-vous l'intention de faire avec l'image? l'afficher? l'envoyer sur un réseau? appliquer une certaine transformation à cela? insérer dans une galerie? Les réponses donneront la direction à suivre. Et le prochain test à écrire. Les tests doivent guider la conception, pas ce que pourrait être une classe Image.

En effet, pour l'application de dessin, un générateur de galerie ou un lecteur de courrier électronique, ImageObject sera différent car la classe qui utilisera cette classe aura des besoins différents.

1

Vous vous concentrez trop sur la modélisation de cette classe, au lieu de mettre en œuvre un scénario réel.

ce qui est une grande différence dans la façon de résoudre les problèmes lorsque vous utilisez TDD. C'est ce qui vous empêche d'ajouter des éléments inutiles dans les classes, et vous permet d'aller vers des conceptions plus simples avec moins de temps d'analyse.

Concentrez-vous sur les scénarios que vous devez implémenter. Laissez cela conduire vos besoins pour ces classes et ce dont vous avez besoin là-bas.