Coder
Coder
j’adore ça !
Coder
...mais c’est trop compliqué !
Apprenons le Java !

class MainClass {
public static void main(String[] args) {
System.out.println(“Hello, World!”);
}
}
Apprenons le Java !

class MainClass {
public static void main(String[] args) {
System.out.println(“Hello, World!”);
}
}
Apprenons le Java !
?
?

?

?

?

?

class MainClass {
public static void main(String[] args) {
System.out.println(“Hello, World!”);
}
}

?
?
?

?

?

?
Apprenons le Java !
?
?

?

?

?

?

??!

class MainClass {
public static void main(String[] args) {
System.out.println(“Hello, World!”);
}
}

?

?

?

?

?

?
puts “Hello World!”

print(“Hello World!”)

printStrLn “Hello World!”

print “Hello World!”
Alors comme ça c’est compliqué ?
Making Software:
What Really Works and Why We Believe It
Why is it So Hard
to Learn to Program?
Compliqué ?
Concevoir un algorithme est simple.
Communiquer un algorithme à un humain est
simple.
Communiquer un algorithme à une machine
est moins simple.
Pourquoi ?

Les langages de programmation !
(?)
Plus précisément

Les langages de programmation
orientés objet
java, c#, python, ruby...
Axiomes
Orienté-objet
=
polymorphisme + encapsulation

Qualité
=
testable / modulaire + maintenable / lisible
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
updateField();
// field equals y
Parfum de variable globale

// field equals x
field = computeValue();
// field equals y
Méthode détachée de son objet
Des objets à la rescousse
Test

Interface
mpub
Implémentation
Nouvelle
dépendance

Nouvelle
dépendance

mpub

mpub

cp

cp
Les méthodes privées
● Inutiles
● Dangereuses
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

Faible encapsulation
Couplage fort
Double dépendance
Dépendences cycliques

Classe
abstraite
Dépendences cycliques

Classe
abstraite

?
Dépendences cycliques

Classe
abstraite

Classe fille
concrète
Dépendences cycliques

Classe
abstraite

??!

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

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

Difficile à tester
Difficile à maintenir
Dépendances ‘cycliques’
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
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;
}
...
}
Solution : composition
abstract class AbstractCollection<T>

class CollectionDecorator<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();
}
}
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 variables…
alors qu’elles sont globales !
Pragmatisme
Débutants
Merci !
Questions ?

Hugo.Wood@sopragroup.com / @mercury_wood / elevatedabstractions.wordpress.com

Les langages de programmation sont trop compliqués