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

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

Upload: mercurywood

Post on 21-Dec-2014

917 views

Category:

Documents


0 download

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

Page 1: Améliorer la qualité du code par restriction du langage

par restriction du langage

Améliorer la qualité du code

Page 2: Améliorer la qualité du code par restriction du langage

Java est trop compliqué !

Page 3: Améliorer la qualité du code par restriction du langage

● Tests unitaires● Tests d’intégration● Intégration continue● Qualimétrie● Revues de code

Mais où est la qualité ?

Page 4: Améliorer la qualité du code par restriction du langage

Maintenabilité

Qualité : définition

Page 5: Améliorer la qualité du code par restriction du langage

Maintenabilité => Modularité

Qualité : définition

Page 6: Améliorer la qualité du code par restriction du langage

Maintenabilité => Modularité => Testabilité

Qualité : définition

Page 7: Améliorer la qualité du code par restriction du langage

Langage : définition

Javaet les langages orientés-classe

Page 8: Améliorer la qualité du code par restriction du langage

Restriction

Page 9: Améliorer la qualité du code par restriction du langage

nullwat?!

Page 10: Améliorer la qualité du code par restriction du langage

● non type-safe● non OO

null

Page 11: Améliorer la qualité du code par restriction du langage

ranger => planquer sous le lit

Les méthodes privées

Page 12: Améliorer la qualité du code par restriction du langage

Une méthode publique trop imposante

Méthode publique

Interface

Implémentation

cp cp

Test

Page 13: Améliorer la qualité du code par restriction du langage

Des méthodes privées à la rescousse

mpubInterface

Implémentation

cp cp

Test

mpriv mpriv

Page 14: Améliorer la qualité du code par restriction du langage

Des problèmes

mpubInterface

Implémentation

cp cp

Test

mpriv mpriv

Page 15: Améliorer la qualité du code par restriction du langage

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

Page 16: Améliorer la qualité du code par restriction du langage

Des objets à la rescousse

mpubInterface

Implémentation

cp cp

Test

mpub mpub

Nouvelle dépendance

Nouvelle dépendance

Page 17: Améliorer la qualité du code par restriction du langage

Les méthodes privées

● Bancales● Sournoises● N’aide pas à encapsuler

Page 18: Améliorer la qualité du code par restriction du langage

Coupling: it’s over 9000!

L’héritage de classe

Page 19: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

Page 20: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

super

Page 21: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

Page 22: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

Page 23: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

Page 24: Améliorer la qualité du code par restriction du langage

Difficile à tester

Mère

Fille

TestMère

TestFille

Page 25: Améliorer la qualité du code par restriction du langage

Difficile à maintenir

public

Page 26: Améliorer la qualité du code par restriction du langage

Difficile à maintenir

public

protected

Page 27: Améliorer la qualité du code par restriction du langage

Difficile à maintenir

public

protected

Rupture de l’encapsulationCouplage fortDouble dépendance

Page 28: Améliorer la qualité du code par restriction du langage

Dépendences étranges

Classeabstraite

Page 29: Améliorer la qualité du code par restriction du langage

Dépendences étranges

Classeabstraite

?

Page 30: Améliorer la qualité du code par restriction du langage

Dépendences étranges

Classeabstraite

Classe fille concrète

Page 31: Améliorer la qualité du code par restriction du langage

Dépendences étranges

Classeabstraite

Classe fille concrète

??!

Page 32: Améliorer la qualité du code par restriction du langage

● Difficile à tester● Difficile à maintenir● Dépendances étranges

C’est l’enfer !

Page 33: Améliorer la qualité du code par restriction du langage

● Difficile à tester● Difficile à maintenir● Dépendances étranges● Et ça sert à...quoi exactement ?

C’est l’enfer !

Page 34: Améliorer la qualité du code par restriction du langage

● 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 !

Page 35: Améliorer la qualité du code par restriction du langage

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;

}

...

}

Page 36: Améliorer la qualité du code par restriction du langage

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();

}

}

Page 37: Améliorer la qualité du code par restriction du langage

It’s not a bug, it’s a feature!

Static dispatch

Page 38: Améliorer la qualité du code par restriction du langage

L’enfer 2.0

Page 39: Améliorer la qualité du code par restriction du langage

L’enfer 2.0

● Difficile à tester

Page 40: Améliorer la qualité du code par restriction du langage

L’enfer 2.0

● Difficile à tester● Difficile à maintenir

Page 41: Améliorer la qualité du code par restriction du langage

L’enfer 2.0

● Difficile à tester● Difficile à maintenir● Détruit tout polymorphisme

Page 42: Améliorer la qualité du code par restriction du langage

L’enfer 2.0

● Difficile à tester● Difficile à maintenir● Détruit tout polymorphisme● Rend les classes potentiellement variables…

alors qu’elles sont globales !

Page 43: Améliorer la qualité du code par restriction du langage

Pragmatisme

Page 44: Améliorer la qualité du code par restriction du langage

Débutants

Page 45: Améliorer la qualité du code par restriction du langage

Questions ?

Merci !

@mercury_wood

ElevatedAbstractions.wordpress.com