language objet : passé, présent et futur
TRANSCRIPT
VOUS ALLEZ BRILLER !
AVANT TOUT CHOSE
J’ai besoin de 4 volontaires pour une expérience hors du commun avec du papier et un stylo.
L’INFORMATIQUE PREND SON ESSOR
FIN DES ANNÉES 50
• ALGOL, Fortan, LISP
• Procédures, structures de données
• Aucune inter-opérabilité entre machines
• L’informatique quitte le laboratoire pour l’entreprise
• Nouveaux problèmes: Simulations, intelligence artificielle, etc
SIMULA : NYGAARD ET DAHL 1962 À 1967
L’IDÉE DE GÉNIES
• Modélisation du réel
• Chaque unité de code est un processus indépendant
• Donnée + comportement (règle d’opération)
SIMILITUDES ET LA VARIATIONS DE STRUCTURES DE DONNÉES
LES CLASSE D’ENREGISTREMENT DE HOARE
• Sir Tony Hoare en 1965 décrit un système de classement de structures de données basé sur des classes et des sous-classes
• Invention de la notion d’héritage
• Ne considère pas les comportements, uniquement les données
LE « PÈRE » DU LANGAGE OBJET MODERNE
ALAN KAY
• Fait la synthèse d’idées dans le monde de l’informatique des années 60 : ARPANet, LOGO, SketchPad, Simula…
• Il sera le premier à donner une définition du langage « objet »
• Il est à l’origine du langage SMALLTALK en 1971
SIMULA +++
LANGAGE OBJET SELON ALAN KAY
• Tout est objet, classe, processus, etc..
• Encapsulation
• Les objets interagissent via des messages
• Chaque message reçu par un objet correspondant à une « méthode » de son code
LA CONTRIBUTION DU GOF 1994
DESIGN PATTERNS
• Des motifs se répètent dans le code « objet » pour répondre à des problèmes eux-même récurrents
• C’est un recueil de motifs rédigé par Erich Gamma,Richard Helm, Ralph Johnson et John Vlissides
• Ces design patterns permettent de trouver rapidement une architecture adaptée à un problème courant
ROBERT C MARTIN - 1995
PRINCIPES DE CONCEPTION OBJET
• Oncle Bob apport deux idées fondamentales :
• Les « Rotten design » qui liste les principaux défauts des applications programmées en objet
• Les principes « SOLID » qui sont une liste de bonnes pratiques à respecter pour limiter l’occurence des « Rotten design »
FRAMEWORKS, ETC.
• On s’en fou, on fait du Symfony….
• Je te fais en cinq minutes avec Expressive…
• J’ai déjà tout dans Laravel…
• Hop un petit composer update et roule ma poule…
PRINCIPE DE BASE
TELL DON’T ASK
• Encapsulation : on ne doit pas connaitre l’état d’un autre objet
• L’objet qui agit est celui qui possède les données
• Les objets se commandent entre-eux.
« Demander au balai de faire le ménage »
INTÉRÊTS / PROMESSES DE LA POE
• L’état des objets reste masqué un maximum
• On n’a pas à traiter les retours. Moins de boulot.
• Moins d’erreur due au typage des retours de méthodes
• Beaucoup plus facile à tester car les « mocks » ne retournent rien.
• Moins de couplages.
• Celui qui réalise l’action est celui qui possède les données.
RÉSERVER UNE CHAMBRE DANS UN HÔTEL
EXEMPLE EN PHP
provideRoomTo(sophie,’M’,3)
orderRoomTo(hotel)
101 / S / 1302 / M / 3 267 / L / 2
setRoomNumber(302)
bookIfSuitable(‘M’,3)
bookIfSuitable(‘M’,3)
bookIfSuitable(‘M’,3)
bookRoom(302)
L’IDÉE DE BASE
UN PEU DE CODE
$sophie = new Customer(Room::SIZE_M,3);$ibis = new Hotel();$sophie->orderRoomTo($ibis);
CUSTOMER
UN PEU DE CODE
class Customer{ protected $roomSize; protected $minFloor; protected $hotel; protected $roomNumber;
public function orderRoomTo(Hotel $hotel) { $this->hotel = $hotel; $hotel->provideRoomTo($this,$this->roomSize,$this->minFloor); return $this; } public function setRoomNumber(int $number) { $this->roomNumber = $number; return $this; }}
HOTEL
UN PEU DE CODE
class Hotel{ protected $rooms = []; protected $currentCustomer; public function provideRoomTo(Customer $customer, string $roomSize, int $minFloor) { $this->currentCustomer = $customer; foreach ($this->rooms as $room) { $room->bookIfSuitable($roomSize,$minFloor); } return $this; }
public function bookRoom(int $number) { $room = $this->rooms[$number]; $room->book(); $this->currentCustomer->setRoomNumber($number); return $this; }
}
ROOM
UN PEU DE CODE
class Room{ const SIZE_S = 's'; const SIZE_M = ‘m'; const SIZE_L = ‘l';
protected $number; protected $size; protected $floor; protected $available = true; protected $hotel;
public function bookIfSuitable(string $roomSize, int $minFloor) { if ( ! $this->available) return $this; if ($this->floor < $minFloor) return $this; if ($this->size != $roomSize) return $this; $this->hotel->bookRoom($this->number); return $this; }
public function book() { $this->available = false; return $this; }}
POUR UNE VIE DE DÉVELOPPEUR MEILLEURE
CONCLUSIONS
• Revenez à l’essence de l’objet
• KISS
• Méditez sur les textes des fondateurs
• Faites du sport
• Mangez sain
• Souriez !
• Restez positifs !