Améliorer
la qualité du code
par restriction du langage
Java est trop compliqué !
Mais où est la qualité ?
●
●
●
●
●

Tests unitaires
Tests d’intégration
Intégration continue
Qualimétrie
Revues de code
Qualité : définition

Maintenabilité
Qualité : définition

Maintenabilité => Modularité
Qualité : définition

Maintenabilité => Modularité => Testabilité
Langage : définition

Java
et les langages orientés-classe
Restriction
null
wat?!
null
● non type-safe
● non OO
Les méthodes privées
ranger => planquer sous le lit
Une méthode publique trop imposante

Test

Interface

Méthode
publique

Implémentation

cp

cp
Des méthodes privées à la rescousse

Test

Interface
mpub
Implémentation

mpriv

mpriv

cp

cp
Des problèmes

Test

Interface
mpub
Implémentation

mpriv

mpriv

cp

cp
Deux styles de méthodes privées

// field equals x
doSomething();
// field equals y
Parfum variable globale

// field equa...
Des objets à la rescousse
Test

Interface
mpub
Implémentation
Nouvelle
dépendance

Nouvelle
dépendance

mpub

mpub

cp

cp
Les méthodes privées
● Bancales
● Sournoises
● N’aide pas à encapsuler
L’héritage de classe
Coupling: it’s over 9000!
Difficile à tester

Mère

Test
Mère

Fille

Test
Fille
Difficile à tester

Mère

Test
Mère

super

Fille

Test
Fille
Difficile à tester

Mère

Test
Mère

Fille

Test
Fille
Difficile à tester

Mère

Test
Mère

Fille

Test
Fille
Difficile à tester

Mère

Test
Mère

Fille

Test
Fille
Difficile à tester

Mère

Test
Mère

Fille

Test
Fille
Difficile à maintenir
public
Difficile à maintenir
public

protected
Difficile à maintenir
public

protected

Rupture de l’
encapsulation
Couplage fort
Double dépendance
Dépendences étranges

Classe
abstraite
Dépendences étranges

Classe
abstraite

?
Dépendences étranges

Classe
abstraite

Classe fille
concrète
Dépendences étranges

Classe
abstraite

??!

Classe fille
concrète
C’est l’enfer !
● Difficile à tester
● Difficile à maintenir
● Dépendances étranges
C’est l’enfer !
●
●
●
●

Difficile à tester
Difficile à maintenir
Dépendances étranges
Et ça sert à...quoi exactement ?
C’est l’enfer !
●
●
●
●

Difficile à tester
Difficile à maintenir
Dépendances étranges
Et ça sert à...quoi exactement ?
■ ...
Solution : composition
interface MembreDeLaFamille {...}
class Mère implements MembreDeLaFamille {...}
class Fille impleme...
Solution : composition
abstract class AbstractCollection<T>

class CollectionIteratableDecorator<T>

implements Collection...
Static dispatch
It’s not a bug, it’s a feature!
L’enfer 2.0
L’enfer 2.0
● Difficile à tester
L’enfer 2.0
● Difficile à tester
● Difficile à maintenir
L’enfer 2.0
● Difficile à tester
● Difficile à maintenir
● Détruit tout polymorphisme
L’enfer 2.0
●
●
●
●

Difficile à tester
Difficile à maintenir
Détruit tout polymorphisme
Rend les classes potentiellement ...
Pragmatisme
Débutants
Merci !
Questions ?
@mercury_wood

ElevatedAbstractions.wordpress.com
Prochain SlideShare
Chargement dans…5
×

Améliorer la qualité du code par restriction du langage

1 862 vues

Publié le

Un titre un peu barbare pour un constat simple : Java est trop compliqué ! Dans l'industrie de logiciel, notamment les grandes SSII recrutant des débutants, la qualité du code est assez exécrable, même avec de bon outils et process (tests systématiques, intégration continue, qualimétrie...) J'émets l'hypothèse que Java lui-même (et les langages orientés classe en général) est en partie en cause. Certaines de ses features, présentent des inconvénients majeures que j'expose dans cette présentation. Je vais jusqu'à dire que ces features sont même plus dangereuses qu'utiles. Pourtant, les inconvénients ne sont jamais abordés dans la formation du programmeur. Par conséquent, il y a un écart entre académie et industrie, qui nuit à la qualité du code dans l'industrie.

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 862
Sur SlideShare
0
Issues des intégrations
0
Intégrations
587
Actions
Partages
0
Téléchargements
17
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Améliorer la qualité du code par restriction du langage

  1. 1. Améliorer la qualité du code par restriction du langage
  2. 2. Java est trop compliqué !
  3. 3. Mais où est la qualité ? ● ● ● ● ● Tests unitaires Tests d’intégration Intégration continue Qualimétrie Revues de code
  4. 4. Qualité : définition Maintenabilité
  5. 5. Qualité : définition Maintenabilité => Modularité
  6. 6. Qualité : définition Maintenabilité => Modularité => Testabilité
  7. 7. Langage : définition Java et les langages orientés-classe
  8. 8. Restriction
  9. 9. null wat?!
  10. 10. null ● non type-safe ● non OO
  11. 11. Les méthodes privées ranger => planquer sous le lit
  12. 12. Une méthode publique trop imposante Test Interface Méthode publique Implémentation cp cp
  13. 13. Des méthodes privées à la rescousse Test Interface mpub Implémentation mpriv mpriv cp cp
  14. 14. Des problèmes Test Interface mpub Implémentation mpriv mpriv cp cp
  15. 15. Deux styles de méthodes privées // field equals x doSomething(); // field equals y Parfum variable globale // field equals x field = computeSomething(); // field equals y Méthode détachée de son objet
  16. 16. Des objets à la rescousse Test Interface mpub Implémentation Nouvelle dépendance Nouvelle dépendance mpub mpub cp cp
  17. 17. Les méthodes privées ● Bancales ● Sournoises ● N’aide pas à encapsuler
  18. 18. L’héritage de classe Coupling: it’s over 9000!
  19. 19. Difficile à tester Mère Test Mère Fille Test Fille
  20. 20. Difficile à tester Mère Test Mère super Fille Test Fille
  21. 21. Difficile à tester Mère Test Mère Fille Test Fille
  22. 22. Difficile à tester Mère Test Mère Fille Test Fille
  23. 23. Difficile à tester Mère Test Mère Fille Test Fille
  24. 24. Difficile à tester Mère Test Mère Fille Test Fille
  25. 25. Difficile à maintenir public
  26. 26. Difficile à maintenir public protected
  27. 27. Difficile à maintenir public protected Rupture de l’ encapsulation Couplage fort Double dépendance
  28. 28. Dépendences étranges Classe abstraite
  29. 29. Dépendences étranges Classe abstraite ?
  30. 30. Dépendences étranges Classe abstraite Classe fille concrète
  31. 31. Dépendences étranges Classe abstraite ??! Classe fille concrète
  32. 32. C’est l’enfer ! ● Difficile à tester ● Difficile à maintenir ● Dépendances étranges
  33. 33. C’est l’enfer ! ● ● ● ● Difficile à tester Difficile à maintenir Dépendances étranges Et ça sert à...quoi exactement ?
  34. 34. C’est l’enfer ! ● ● ● ● Difficile à tester Difficile à maintenir Dépendances étranges Et ça sert à...quoi exactement ? ■ L’héritage d’interfaces fournit déjà le polymorphisme ■ La composition fournit déjà de quoi réutiliser les implémentations
  35. 35. Solution : composition interface MembreDeLaFamille {...} class Mère implements MembreDeLaFamille {...} class Fille implements MembreDeLaFamille { private final MembreDeLaFamille mère; public Fille(MembreDeLaFamille mère) { this.mère = mère; } ... }
  36. 36. Solution : composition abstract class AbstractCollection<T> class CollectionIteratableDecorator<T> implements Collection<T> { implements Collection<T> { boolean contains(Object o) { final Iterable<T> iterable; ...// appelle iterator() } boolean contains(Object o) { ...// appelle iterator() abstract Iterator<T> iterator(); } } Iterator<T> iterator() { return iterable.iterator(); } }
  37. 37. Static dispatch It’s not a bug, it’s a feature!
  38. 38. L’enfer 2.0
  39. 39. L’enfer 2.0 ● Difficile à tester
  40. 40. L’enfer 2.0 ● Difficile à tester ● Difficile à maintenir
  41. 41. L’enfer 2.0 ● Difficile à tester ● Difficile à maintenir ● Détruit tout polymorphisme
  42. 42. L’enfer 2.0 ● ● ● ● Difficile à tester Difficile à maintenir Détruit tout polymorphisme Rend les classes potentiellement variables… alors qu’elles sont globales !
  43. 43. Pragmatisme
  44. 44. Débutants
  45. 45. Merci ! Questions ? @mercury_wood ElevatedAbstractions.wordpress.com

×