changer pour mieux coder
DESCRIPTION
Live code by Rémy Sanlaville and Johan Martinsson at Agile Grenoble 2012TRANSCRIPT
![Page 1: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/1.jpg)
Changer pour mieux coder
Règles pour améliorer son code source
Démo en live
Bonus : raccourcis clavier et astuces pour être plus productif
Ce que vous verrez
Ce que vous ne verrez pas Une mise en pratique du TDD (Test Driven
Development)
![Page 2: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/2.jpg)
Bienvenue à notre réunion Développeurs Anonymes (DA)
![Page 3: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/3.jpg)
Application
Magasin (Inn)
Articles (Items) dont la qualité se dégrade continuellement à l’approche de la date de péremption
vend
A chaque fin de journée, l’application met à jour la qualité de tous les articles (Inn.updateQuality())
SellIn = nombre de jour restant avant la date de péremption
Quality = correspond à la valeur de l’objetArticle (Item)
![Page 4: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/4.jpg)
ApplicationSellIn = nombre de jour restant avant la date de péremption
Quality = correspond à la valeur de l’objetArticle (Item)
Une fois la date de péremption dépassée, la qualité se dégrade 2 fois plus vite.
“Aged Brie” = la qualité augmente avec le temps qui passe
“Sulfuras” = article légendaire dont la qualité ne décroit jamais et qui n’a pas de date de péremption.
“Backstage passes” = la qualité augmente avec le temps de la manière suivante :
6 ≤ sellIn ≤ 10 → la qualité augmente par 20 ≤ sellIn ≤ 5 → la qualité augmente par 3sellIn < 0 → la qualité = 0
La qualité n’est jamais négative et ne dépasse jamais 50 : 0 ≤ quality ≤ 50.
Contraintes
![Page 5: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/5.jpg)
Entrainons-nous !
Emmanuel Chenu
![Page 6: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/6.jpg)
9 règles pour votre gymnastique objet
1. Use one level of indentation per method
2. Don't use the else keyword
3. Wrap all primitives and strings
4. Use only one dot per line
5. Don't abbreviate
6. Keep all entities small
7. Don't use any classes with more than two instance variables
8. Use first class collections
9. Don't use any getters, setters or propertiesObject Calisthenics by Jeff Bay tiré du livre ThoughtWorks Anthology
![Page 7: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/7.jpg)
1. Use one level of indentation per method
![Page 8: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/8.jpg)
2. Don’t use the else keyword
Early Return
Utiliser une map
Polymorphisme
– Stratégie
– Null Object Empty lists
…
![Page 9: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/9.jpg)
3. Wrap all primitives and strings
public class Money {
private Integer amountInCents;
public Money(Integer amountInCents) { this.amountInCents = amountInCents; }
[…]}
public class Discounter {
private Money discount;
[…]}
public class Discounter {
private Integer discount;
[…]}
![Page 10: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/10.jpg)
4. Use only one dot per line
Loi de Demeter« Ne parlez pas aux inconnus »
![Page 11: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/11.jpg)
5. Don’t abbreviate
Répétition signifie souvent un concept commun à faire émerger
![Page 12: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/12.jpg)
6. Keep all entities small
Pas de classe > 50 lignes
Pas de paquet > 10 classes
« Single Responsibility Principle »
![Page 13: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/13.jpg)
7. Don't use any classes with more than two instance variables
Cohésion
Emergence de model à grain fin
Ex OrangeForge : User & Project => Permissions?
![Page 14: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/14.jpg)
8. Use first class collections
Le pendant Wrap all primitives
Centralise traitements sur la collection
![Page 15: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/15.jpg)
9. Don't use any getters, setters or properties
q.setQuality(q.getQuality() - 1);
q.decrease();
q.quality = 0; q.dropToZero();
« Tell don’t ask »
![Page 16: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/16.jpg)
Bilan
Nécessité des tests pour le refactoring.
Règles 2. Don't use the else keyword3. Wrap all primitives and strings9. Don't use any getters, setters or properties
cela a été une aide
code plus lisible, maintenable et évolutif
![Page 17: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/17.jpg)
Acteurs
Johan MARTINSSONIndépendant [email protected]@johan_alps
Le Parrain
Rémy SANLAVILLEDéveloppeur [email protected]@sanlaville
Le Filleul
![Page 18: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/18.jpg)
Discussions
![Page 19: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/19.jpg)
Update Quality for BackstageUpdate Backstage
passes[sellIn ≥ 11]
qualité += 1
Cas 1
![Page 20: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/20.jpg)
Update Quality for BackstageUpdate Backstage
passes[sellIn ≥ 11]
qualité += 1
Cas 1
![Page 21: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/21.jpg)
Update Quality for BackstageUpdate Backstage
passes[sellIn ≥ 11]
qualité += 1
Cas 1
[10 ≥ sellIn ≥ 6]qualité += 2
Cas 2
[5 ≥ sellIn ≥ 0]qualité += 3
Cas 3
[0 > sellIn]qualité = 0
Cas 4
![Page 22: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/22.jpg)
Solution 1 : ifUpdate Backstage passes
[getSellIn() < 11]quality.increase();
if
quality.increase();
demo-live
![Page 23: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/23.jpg)
Solution 1 : ifUpdate Backstage passes
[getSellIn() < 11]quality.increase();
if
quality.increase();
demo-live
![Page 24: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/24.jpg)
Solution 1 : ifUpdate Backstage passes
[getSellIn() < 11]quality.increase();
if
quality.increase();
demo-live
![Page 25: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/25.jpg)
Solution 1 : ifUpdate Backstage passes
[getSellIn() < 11]quality.increase();
if
[getSellIn() < 0]quality.dropToZero();
if
quality.increase();
[getSellIn() < 6]ifquality.increase();
setSellIn(getSellIn() - 1);
demo-live
![Page 26: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/26.jpg)
Solution 2 : if - elseUpdate Backstage passes
Tag : backstageWithElseIf
[daysBefore > 10]quality.increaseBy(1)
if
![Page 27: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/27.jpg)
Solution 2 : if - elseUpdate Backstage passes
Tag : backstageWithElseIf
[daysBefore > 10]quality.increaseBy(1)
if
![Page 28: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/28.jpg)
Solution 2 : if - elseUpdate Backstage passes
Tag : backstageWithElseIf
[daysBefore > 10]quality.increaseBy(1)
if
[daysBefore > 5]quality.increaseBy(2)
else if
[daysBefore > 0]quality.increaseBy(3)
else if
quality.resetToZero()
else
![Page 29: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/29.jpg)
Solution 3 : Range MapUpdate Backstage passes
Tag : rangeMap
strategies = new TreeMap<Integer, IncreaseStrategy>() {{ put(Integer.MIN_VALUE, new ResetToZero()); put(0, new IncreaseBy(3)); put(5, new IncreaseBy(2)); put(10, new IncreaseBy(1));}};
Initialisation de la Map
![Page 30: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/30.jpg)
Solution 3 : Range MapUpdate Backstage passes
Tag : rangeMap
strategies = new TreeMap<Integer, IncreaseStrategy>() {{ put(Integer.MIN_VALUE, new ResetToZero()); put(0, new IncreaseBy(3)); put(5, new IncreaseBy(2)); put(10, new IncreaseBy(1));}};
Initialisation de la Map
![Page 31: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/31.jpg)
Solution 3 : Range MapUpdate Backstage passes
Tag : rangeMap
strategies = new TreeMap<Integer, IncreaseStrategy>() {{ put(Integer.MIN_VALUE, new ResetToZero()); put(0, new IncreaseBy(3)); put(5, new IncreaseBy(2)); put(10, new IncreaseBy(1));}};
Initialisation de la Map
Récupération de la stratégiestrategies.lowerEntry(daysBefore).getValue();
Appliquer la stratégie
strategy().applyTo(quality);
![Page 32: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/32.jpg)
Solution 4 : DSLUpdate Backstage passes
Tag : backstageUpdateDSL
quality.doIncreaseBy(1).when(daysBefore, greaterThan(10));
![Page 33: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/33.jpg)
Solution 4 : DSLUpdate Backstage passes
Tag : backstageUpdateDSL
quality.doIncreaseBy(1).when(daysBefore, greaterThan(10));
![Page 34: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/34.jpg)
Solution 4 : DSLUpdate Backstage passes
Tag : backstageUpdateDSL
quality.doIncreaseBy(1).when(daysBefore, greaterThan(10));
quality.doIncreaseBy(2).when(daysBefore, between(5, 10));
quality.doIncreaseBy(3).when(daysBefore, between(0, 5));
quality.doResetToZero().when(daysBefore, lessThanOrEqualTo(0));
![Page 35: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/35.jpg)
Conclusion
Les règles peuvent-être vues comme une chance pour sortir du cadre et réfléchir autrement plutôt que comme des contraintes.
Pour s’améliorer, il faut savoir prendre du temps pour s’exercer.
![Page 36: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/36.jpg)
En savoir plus
Thoughtworks Anthology by PragProg http://pragprog.com/book/twa/thoughtworks-anthology
Object Calisthenicshttp://www.bennadel.com/resources/uploads/2012/ObjectCalisthenics.pdf
How object oriented are you feeling today? Krzysztof Jelski - Software Craftsmanship 2011 Conference http://fr.slideshare.net/KrzysztofJelski/how-object-oriented-are-you-feeling-today
![Page 37: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/37.jpg)
LiensPlugins Eclipse
Infinitest (http://infinitest.github.com)MoreUnit (http://moreunit.sourceforge.net/)EclEmma (http://www.eclemma.org/)
Clipboard ManagerDitto (http://ditto-cp.sourceforge.net/)
Code sous GitHub
https://github.com/sanlaville/AgileGrenoble2012.githttps://github.com/martinsson/AgileGrenoble2012.git
Ctrl + 1
Raccourcis clavier Eclipse
Alt + Shift + T
![Page 38: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/38.jpg)
![Page 39: Changer Pour Mieux Coder](https://reader035.vdocuments.net/reader035/viewer/2022081506/55893218d8b42add138b45a2/html5/thumbnails/39.jpg)
N’oubliez pas de remplir les feedbacks !