Je dirais de ne pas commencer par TDD. Prenez une décision éclairée lorsque vous avez passé plus de temps à apprendre les stratégies d'architecture en général. TDD ne vous laissera pas sauter ces devoirs bien que vous puissiez commencer à croire que c'est le cas.
Voici mon problème avec ça. Lorsque vous dites que cela semble être beaucoup de temps perdu sur des choses qui ne briseront jamais les TDDers, vous l'apprécierez lorsque cette chose que vous n'aviez pas prévue dans une énorme chaîne de dépendances est brisée. Lorsque vous précisez qu'il est impossible de prédire de telles choses avant d'écrire votre application, ce qui est euh ... pourquoi nous testons, ils vous disent qu'il s'agit vraiment de conception et non de test, même si le test est utile.
Mais les chaînes géantes de dépendances liées imprévisibles ne sont-elles pas le produit d'une conception pourrie?
Alors c'est quoi?
Voici une pensée. N'ayons pas d'énormes chaînes complexes de dépendances en premier lieu en considérant les deux principes suivants de la conception orientée objet de Design Patterns:
"Programmer vers une interface, pas une implémentation"
C'est-à-dire que vos objets ne devraient pas se soucier de qui fait l'appel ou comment ils ont été faits. Seulement que les arguments appropriés ont été introduits et que les méthodes qu'ils appellent à partir d'autres objets sont dirigées pour fonctionner comme prévu. Dans la plupart des cas, votre chaîne de dépendance doit être à un point de liaison, l'appel de méthode de la part de l'appelant et l'endroit où les arguments sont déposés dans vos méthodes. C'est là que vous vous connectez, validez et envoyez des messages utiles pour le débogage lorsque les choses tournent court.
Et:
"Privilégier la composition des objets à l'héritage des classes"
Qui est le mannequin? Le gars qui a fait quelque chose à une classe dans un système d'héritage en cascade alambiqué impliquant environ 30 classes entraînant une rupture des cas marginaux, ou le développeur qui a proposé cette architecture en premier lieu? TDD pourrait vous aider à résoudre les problèmes à l'intérieur de cette tour penchée de la classe Pise plus tôt que vous ne l'auriez pu, mais cela rend-il moins pénible d'essayer de modifier l'un des points finaux de ce code en cas de catastrophe la prochaine fois?
Et c'est là que j'arrive à ce qui me dérange. TDD aide-t-il vraiment à la conception ou permet-il une mauvaise architecture? Il me semble que cela peut être une stratégie auto-réalisatrice. Plus votre équipe n'a pas à assumer la responsabilité d'une architecture médiocre, plus ces composants de test granulaire semblent utiles, mais en fin de compte, votre application devient un PITA de plus en plus grand avec lequel travailler (en supposant qu'ils n'aient jamais beaucoup réfléchi à l'architecture dans le premier endroit). Et le fait de ne pas en reconnaître les conséquences est sans conteste, toujours l'erreur la plus coûteuse que vous pouvez faire lorsque vous travaillez sur une application destinée à être mise à niveau et modifiée au fil du temps.