améliorer la qualité du code par restriction du langage
DESCRIPTION
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.TRANSCRIPT
par restriction du langage
Améliorer la qualité du code
Java est trop compliqué !
● Tests unitaires● Tests d’intégration● Intégration continue● Qualimétrie● Revues de code
Mais où est la qualité ?
Maintenabilité
Qualité : définition
Maintenabilité => Modularité
Qualité : définition
Maintenabilité => Modularité => Testabilité
Qualité : définition
Langage : définition
Javaet les langages orientés-classe
Restriction
nullwat?!
● non type-safe● non OO
null
ranger => planquer sous le lit
Les méthodes privées
Une méthode publique trop imposante
Méthode publique
Interface
Implémentation
cp cp
Test
Des méthodes privées à la rescousse
mpubInterface
Implémentation
cp cp
Test
mpriv mpriv
Des problèmes
mpubInterface
Implémentation
cp cp
Test
mpriv mpriv
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
Des objets à la rescousse
mpubInterface
Implémentation
cp cp
Test
mpub mpub
Nouvelle dépendance
Nouvelle dépendance
Les méthodes privées
● Bancales● Sournoises● N’aide pas à encapsuler
Coupling: it’s over 9000!
L’héritage de classe
Difficile à tester
Mère
Fille
TestMère
TestFille
Difficile à tester
Mère
Fille
TestMère
TestFille
super
Difficile à tester
Mère
Fille
TestMère
TestFille
Difficile à tester
Mère
Fille
TestMère
TestFille
Difficile à tester
Mère
Fille
TestMère
TestFille
Difficile à tester
Mère
Fille
TestMère
TestFille
Difficile à maintenir
public
Difficile à maintenir
public
protected
Difficile à maintenir
public
protected
Rupture de l’encapsulationCouplage fortDouble dépendance
Dépendences étranges
Classeabstraite
Dépendences étranges
Classeabstraite
?
Dépendences étranges
Classeabstraite
Classe fille concrète
Dépendences étranges
Classeabstraite
Classe fille concrète
??!
● 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 ?
■ L’héritage d’interfaces fournit déjà le polymorphisme
■ La composition fournit déjà de quoi réutiliser les implémentations
C’est l’enfer !
Solution : compositioninterface 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;
}
...
}
Solution : compositionabstract class AbstractCollection<T>
implements Collection<T> {
boolean contains(Object o) {
...// appelle iterator()
}
abstract Iterator<T> iterator();
}
class CollectionIteratableDecorator<T>
implements Collection<T> {
final Iterable<T> iterable;
boolean contains(Object o) {
...// appelle iterator()
}
Iterator<T> iterator() {
return iterable.iterator();
}
}
It’s not a bug, it’s a feature!
Static dispatch
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 variables…
alors qu’elles sont globales !
Pragmatisme
Débutants
Questions ?
Merci !
@mercury_wood
ElevatedAbstractions.wordpress.com