Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Design de code par l'exemple

Design de code par l'exemple

TDD et BDD ne sont pas des outils de tests.
Code dispo sur https://github.com/shouze/parkedLife

Timothée Barray

September 26, 2016
Tweet

More Decks by Timothée Barray

Other Decks in Programming

Transcript

  1. Disclaimer Inspiré par everzet : Modeling by example Issue de

    nos propres expériences Pas de gifs rigolos
  2. Imaginez un gars avec un mégaphone crier Dev guys quel

    est votre métier ? Le code, le code, le code
  3. Développeur ? C’est quelqu’un qui rédige les spéci cations détaillées

    en langage machine d’une solution à un problème Eric Daspet : https://n.survol.fr/n/dis-tonton-cest-quoi-un-developpeur Le code n'est pas une nalité
  4. F e a t u r e : H o

    t e l d e a l . S c e n a r i o : I l o a d f i x t u r e s f o r t h e s e s c a s e s G i v e n I h a v e s f G u a r d P e r m i s s i o n w i t h f i x t u r e s : | i d | n a m e | d e s c r i p t i o n | 1 | a d m i n . h o t e l . i n d e x | L i s t a l l h o t e l s | 2 | a d m i n . d e a l . i n d e x | L i s t a l l d e a l s | 3 | a d m i n . b o o k i n g . i n d e x | L i s t a l l b o o k i n g s | 4 | a d m i n . c i t y . i n d e x | L i s t a l l c i t i e s | 5 | a d m i n . c u s t o m e r . i n d e x | L i s t a l l c u s t o m e r s | 6 | h o t e l . d e a l . i n d e x | L i s t h o t e l d e a l s | 7 | h o t e l . b o o k i n g . i n d e x | L i s t h o t e l b o o k i n g s | 8 | h o t e l . p r o f i l e . g e n e r a l - i n f o r m a t i o n s . e d i t | E d i t h o t e l p r o f i l e g e n e r a l i n f o r m a t i o n s | 9 | h o t e l . p r o f i l e . a d m i n | M a n a g e a l l h o t e l p r o f i l e | 1 0 | h o t e l . d e a l . a d m i n | M a n a g e a l l h o t e l d e a l s | 1 1 | h o t e l . b o o k i n g . a d m i n | M a n a g e a l l h o t e l b o o k i n g s | 1 2 | h o t e l . p r o f i l e . d e s c r i p t i o n s . e d i t | E d i t h o t e l p r o f i l e d e s c r i p t i o n s | 1 3 | h o t e l . p r o f i l e . r o o m - t y p e s . i n d e x | L i s t h o t e l p r o f i l e r o o m t y p e s | 1 4 | h o t e l . p r o f i l e . p h o t o s . e d i t | E d i t h o t e l p r o f i l e r o o m t y p e s | 1 5 | h o t e l . p r o f i l e . b a n k - d e t a i l s . e d i t | E d i t h o t e l p r o f i l e b a n k d e t a i l s | 1 6 | h o t e l . b i l l i n g . i n d e x | L i s t b i l l s o f a n h o t e l
  5. Bien démarrer avec les méthodes à Gilles En vrai on

    devrait dire les méthodes de Gilles mais bon
  6. Behavior driven development (ou BDD) est une méthode agile qui

    encourage la collaboration entre les développeurs, les responsables qualités, les intervenants non-techniques et les entreprises participant à un projet de logiciel. https://fr.wikipedia.org/wiki/Behavior_driven_development A project face serious problems when its language is fractured. Domain experts use their jargon while technical team members have their own. Eric Evans
  7. La méthode TDD est une méthode de développement logiciel dans

    laquelle l'écriture des tests automatisés dirige l'écriture du code source. C'est une technique très e cace pour livrer des logiciels bien construits avec une suite de tests de non-régression. http://www-igm.univ-mlv.fr/~dr/XPOSE2009/TDD/pagesHTML/Preambule.html
  8. Écouter borner le périmètre Discuter gommer toute ambiguité Illustrer véri

    er qu'on a compris Les premiers exemples doivent émerger de la discussion.
  9. Début de feature F e a t u r e

    : A d d v e h i c l e I n o r d e r t o f o l l o w m a n y v e h i c l e s w i t h m y a p p l i c a t i o n # B é n é f i c e A s a n a p p l i c a t i o n u s e r # Q u i I s h o u l d b e a b l e t o a d d m y v e h i c l e # Q u o i
  10. Premier scenario : Happy path F e a t u

    r e : A d d v e h i c l e I n o r d e r t o f o l l o w m a n y v e h i c l e s w i t h m y a p p l i c a t i o n A s a n a p p l i c a t i o n u s e r I s h o u l d b e a b l e t o a d d m y v e h i c l e S c e n a r i o : S u c c e s s f u l l y a d d i n g o f a v e h i c l e W h e n I a d d a v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 4 D E 5 6 7 " T h e n t h e v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 4 D E 5 6 7 " s h o u l d b e a v a i l a b l e
  11. Continuez à discuter F e a t u r e

    : R e g i s t e r v e h i c l e I n o r d e r t o f o l l o w m a n y v e h i c l e s w i t h m y a p p l i c a t i o n A s a n a p p l i c a t i o n u s e r I s h o u l d b e a b l e t o r e g i s t e r m y v e h i c l e S c e n a r i o : S u c c e s s f u l l y r e g i s t e r i n g o f a v e h i c l e W h e n I r e g i s t e r a v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 4 D E 5 6 7 " T h e n t h e v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 4 D E 5 6 7 " s h o u l d b e a v a i l a b l e Amélioration du langage commun add => register
  12. Super ! Allons coder maintenant ! Ou pas... v e

    n d o r / b i n / b e h a t - - a p p e n d - s n i p p e t s - - s n i p p e t s - f o r = F e a t u r e C o n t e x t
  13. Test ? un seul comportement/chemin à la fois. Unitaire méthode

    Intégration métier Fonctionnel utilisateur
  14. p u b l i c f u n c

    t i o n _ _ c o n s t r u c t ( ) { $ t h i s - > v e h i c l e F l e e t = D o m a i n \ V e h i c l e F l e e t : : o f U s e r ( n e w D o m a i n \ U s e r I d ( ' u s e r ' ) ) ; } / * * * @ W h e n I r e g i s t e r a v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r i n m y v e h i c l e f l e e t * / p u b l i c f u n c t i o n i R e g i s t e r A V e h i c l e W i t h P l a t e n u m b e r ( $ p l a t e n u m b e r ) { $ t h i s - > v e h i c l e F l e e t - > r e g i s t e r V e h i c l e ( $ p l a t e n u m b e r ) ; } / * * * @ T h e n t h e v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r s h o u l d b e p a r t o f m y v e h i c l e f l e e t * / p u b l i c f u n c t i o n t h e V e h i c l e W i t h P l a t e n u m b e r S h o u l d B e A v a i l a b l e ( $ p l a t e n u m b e r ) { $ t h i s - > v e h i c l e F l e e t - > i s V e h i c l e P a r t O f ( $ p l a t e n u m b e r ) ; } Ok maintenant on code ! ou pas... v e n d o r / b i n / p h p s p e c d e s c " S h o u z e \ P a r k e d L i f e \ D o m a i n \ V e h i c l e F l e e t "
  15. c l a s s V e h i c

    l e F l e e t S p e c e x t e n d s O b j e c t B e h a v i o r { p u b l i c f u n c t i o n l e t ( ) { $ t h i s - > b e C o n s t r u c t e d W i t h ( n e w U s e r I d ( ' 1 2 3 ' ) ) ; } p u b l i c f u n c t i o n i t _ r e g i s t e r _ n e w _ v e h i c l e ( ) { $ t h i s - > r e g i s t e r V e h i c l e ( ' 1 2 3 D E 4 5 ' , ' M y s p o r t c a r ' ) - > s h o u l d R e t u r n A n I n s t a n c e O f ( V e h i c l e : : c l } }
  16. Se tromper : Oups, je l'ai encore fait C'est normal

    et pas grave ! feedback beaucoup plus rapide nouvelle conversation amélioration du code
  17. Event Sourcing Raconter une histoire Contrôler les changements et pas

    les états F e a t u r e : P a r k v e h i c l e I n o r d e r t o n o t f o r g e t w h e r e I p a r k m y v e h i c l e A s a n a p p l i c a t i o n u s e r I s h o u l d b e a b l e t o s t o r e m y v e h i c l e l o c a t i o n S c e n a r i o : S u c c e s s f u l l y p a r k i n g o f a v e h i c l e G i v e n I r e g i s t r e d m y v e h i c l e w i t h p l a t e n u m b e r " 3 4 5 6 R T 5 6 7 " W h e n I p a r k m y v e h i c l e w i t h p l a t e n u m b e r " 3 4 5 6 R T 5 6 7 " a t l o c a t i o n " 3 . 1 2 3 4 5 6 , 2 . 7 8 9 0 " T h e n t h e k n o w n l o c a t i o n o f m y v e h i c l e " 3 4 5 6 R T 5 6 7 " s h o u l d b e " 3 . 1 2 3 4 5 6 , 2 . 7 8 9 0 "
  18. Quelles fixtures ? / * * * @ G i

    v e n I r e g i s t r e d m y v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r * / p u b l i c f u n c t i o n i R e g i s t r e d M y V e h i c l e W i t h P l a t e n u m b e r ( $ p l a t e n u m b e r ) { $ t h i s - > v e h i c l e F l e e t - > r e g i s t e r V e h i c l e ( $ p l a t e n u m b e r ) ; } Mais déjà passé
  19. Quelles fixtures ? / * * * @ G i

    v e n I r e g i s t r e d m y v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r * / p u b l i c f u n c t i o n i R e g i s t r e d M y V e h i c l e W i t h P l a t e n u m b e r ( $ p l a t e n u m b e r ) { $ t h i s - > p a s t C h a n g e s [ ] = n e w V e h i c l e W a s R e g i s t r e d ( $ p l a t e n u m b e r , $ t h i s - > u s e r I d ) ; } Le passé c'est du passé
  20. Quelle assertion ? / * * * @ T h

    e n t h e k n o w n l o c a t i o n o f m y v e h i c l e : p l a t e n u m b e r s h o u l d b e : l o c a t i o n * / p u b l i c f u n c t i o n t h e K n o w n L o c a t i o n O f M y V e h i c l e S h o u l d B e ( $ p l a t e n u m b e r , D o m a i n \ L o c a t i o n $ l o c a t i o n ) { A s s e r t i o n : : t r u e ( $ t h i s - > v e h i c l e F l e e t - > i s V e h i c l e L o c a t e d ( $ p l a t e n u m b e r , $ l o c a t i o n ) ) ; } V e h i c l e F l e e t : : i s V e h i c l e L o c a t e d vraiment utile ? Ou du code pour le test ?
  21. Quelle assertion ? / * * * @ T h

    e n t h e k n o w n l o c a t i o n o f m y v e h i c l e : p l a t e n u m b e r s h o u l d b e : l o c a t i o n * / p u b l i c f u n c t i o n t h e K n o w n L o c a t i o n O f M y V e h i c l e S h o u l d B e ( $ p l a t e n u m b e r , D o m a i n \ L o c a t i o n $ l o c a t i o n ) { $ t h i s - > v e h i c l e F l e e t S h o u l d H a v e R e c o r d e d C h a n g e s ( [ n e w V e h i c l e W a s P a r k e d ( $ p l a t e n u m b e r , $ t h i s - > u s e r I d ) ] ) ; } p r i v a t e f u n c t i o n v e h i c l e F l e e t S h o u l d H a v e R e c o r d e d C h a n g e s ( a r r a y $ c h a n g e s ) { i f ( n u l l = = = $ t h i s - > v e h i c l e F l e e t H i s t o r y ) { $ t h i s - > v e h i c l e F l e e t H i s t o r y = $ t h i s - > v e h i c l e F l e e t - > p o p H i s t o r y ( ) - > t o A r r a y ( ) ; } A s s e r t i o n : : a l l C h o i c e ( $ c h a n g e s , $ t h i s - > v e h i c l e F l e e t H i s t o r y ) ; } Et voilà !
  22. Ok installons Symfony ! Ou pas F e a t

    u r e : R e g i s t e r v e h i c l e I n o r d e r t o f o l l o w m a n y v e h i c l e s w i t h m y a p p l i c a t i o n A s a n a p p l i c a t i o n u s e r I s h o u l d b e a b l e t o r e g i s t e r m y v e h i c l e @ c r i t i c a l S c e n a r i o : S u c c e s s f u l l y r e g i s t r i n g o f a v e h i c l e W h e n I r e g i s t e r m y v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 D E 4 5 6 " d e s c r i b e d a s " M y s p o r t c a r " T h e n t h e v e h i c l e w i t h p l a t e n u m b e r " 1 2 3 D E 4 5 6 " s h o u l d b e p a r t o f m y v e h i c l e f l e e t Même scénario mais prisme di érent.
  23. Merci Behat3 d e f a u l t :

    s u i t e s : d o m a i n : f i l t e r s : { t a g s : " ~ u i " } c o n t e x t s : - D o m a i n C o n t e x t w e b : f i l t e r s : { t a g s : " c r i t i c a l , u i " } c o n t e x t s : - W e b C o n t e x t - R e z z z a \ R e s t A p i B e h a t E x t e n s i o n \ R e s t A p i C o n t e x t - R e z z z a \ R e s t A p i B e h a t E x t e n s i o n \ J s o n \ J s o n C o n t e x t e x t e n s i o n s : R e z z z a \ R e s t A p i B e h a t E x t e n s i o n \ E x t e n s i o n : r e s t : b a s e _ u r l : h t t p : / / l o c a l h o s t : 8 8 8 8 / s t o r e _ r e s p o n s e : t r u e B e h a t \ S y m f o n y 2 E x t e n s i o n : ~ @critical : scénarios critiques @ui : spé ciques à la UI v e n d o r / b i n / b e h a t - s w e b
  24. / * * * @ G i v e n

    I r e g i s t r e d m y v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r * / p u b l i c f u n c t i o n i R e g i s t r e d M y V e h i c l e W i t h P l a t e n u m b e r ( $ p l a t e n u m b e r ) { $ t h i s - > u s e r I d = S h o r t U u i d : : u u i d 4 ( ) ; $ t h i s - > e v e n t S t o r e - > c o m m i t ( n e w C o m m o n \ E v e n t S o u r c i n g \ E v e n t S t r e a m ( n e w C o m m o n \ E v e n t S o u r c i n g \ E v e n t S t r e a m I d ( ' v e h i c l e - f l e e t _ ' . $ t h i s - > u s e r I d ) , [ n e w D o m a i n \ V e h i c l e W a s R e g i s t e r e d ( $ p l a t e n u m b e r , $ t h i s - > u s e r I d ) ] ) ) ; } / * * * @ W h e n I r e g i s t e r m y v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r i n m y v e h i c l e f l e e t * / p u b l i c f u n c t i o n i R e g i s t e r M y V e h i c l e I n M y V e h i c l e F l e e t ( $ p l a t e n u m b e r ) { $ t h i s - > r e s t A p i B r o w s e r - > s e n d R e q u e s t ( ' P O S T ' , s p r i n t f ( ' / u s e r s / % s / v e h i c l e s ' , $ t h i s - > u s e r I d ) , j s o n _ e n c o d e ( [ ' p l a t e n u m b e r ' = > $ p l a t e n u m b e r ] ) ) ; } / * * * @ T h e n t h e v e h i c l e w i t h p l a t e n u m b e r : p l a t e n u m b e r s h o u l d b e p a r t o f m y v e h i c l e f l e e t * / p u b l i c f u n c t i o n t h e V e h i c l e S h o u l d B e P a r t O f M y V e h i c l e F l e e t ( $ p l a t e n u m b e r ) { $ t h i s - > j s o n C o n t e x t - > t h e J s o n A r r a y N o d e S h o u l d C o n t a i n E l e m e n t s ( ' v e h i c l e s ' , $ p l a t e n u m b e r ) ; }
  25. En résumé Repousser les décisions d'infra Concentrer sur le code

    métier Récolter un feedback rapide Permettre de se tromper C'est ça qu'aurez voulu Gillou !