améliorer la qualité du code par restriction du langage
Post on 21-Dec-2014
917 Views
Preview:
DESCRIPTION
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
top related