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

Post on 21-Dec-2014

917 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related