LANGAGE OBJET
PASSÉ, PRÉSENT, FUTUR DU
SOPHIE BEAUPUIS
A MON PROPOS
• CTO chez « Ma résidence »
• @so_php_ie
• Je suis passé par:
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.
LES PRÉCURSEURS
LES RACINES DU LANGAGE OBJET
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
SIMULA + CLASSES DE HOARE
SIMULA 67
• Classe
• Héritage
• Surcharge
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
CONTRIBUTIONS CONTEMPORAINES
LE PRÉSENT
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 »
TOUT ÇÀ POUR ÇÀ…
La diapo suivante peu choquer les plus fragiles…
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…
PROGRAMMATION ORIENTÉE À L’EST
UNE IDÉE POUR LE FUTUR : POE
NON, ORIENTÉ « RETOUR »
ON PROGRAMME À L’OUEST ?
DEMO avec des humains, stylo et papier
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 »
TELL, DON’T ASK
ON REPRENDS….
DEMO avec des humains, stylo et papier
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 !
MERCI !
ET TOUT DOIT FINIR PAR UN
QUESTIONS ?
AVEZ-VOUS DES

Language objet : passé, présent et futur

  • 1.
  • 2.
    SOPHIE BEAUPUIS A MONPROPOS • CTO chez « Ma résidence » • @so_php_ie • Je suis passé par:
  • 3.
    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.
  • 4.
  • 5.
    L’INFORMATIQUE PREND SONESSOR 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
  • 6.
    SIMULA : NYGAARDET 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)
  • 7.
    SIMILITUDES ET LAVARIATIONS 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
  • 8.
    SIMULA + CLASSESDE HOARE SIMULA 67 • Classe • Héritage • Surcharge
  • 9.
    LE « PÈRE » DULANGAGE 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
  • 10.
    SIMULA +++ LANGAGE OBJETSELON 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
  • 11.
  • 12.
    LA CONTRIBUTION DUGOF 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
  • 13.
    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 »
  • 14.
    TOUT ÇÀ POURÇÀ… La diapo suivante peu choquer les plus fragiles…
  • 15.
    FRAMEWORKS, ETC. • Ons’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…
  • 16.
    PROGRAMMATION ORIENTÉE ÀL’EST UNE IDÉE POUR LE FUTUR : POE
  • 17.
    NON, ORIENTÉ « RETOUR » ONPROGRAMME À L’OUEST ? DEMO avec des humains, stylo et papier
  • 18.
    PRINCIPE DE BASE TELLDON’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 »
  • 19.
    TELL, DON’T ASK ONREPRENDS…. DEMO avec des humains, stylo et papier
  • 20.
    INTÉRÊTS / PROMESSESDE 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.
  • 21.
    RÉSERVER UNE CHAMBREDANS 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)
  • 22.
    L’IDÉE DE BASE UNPEU DE CODE $sophie = new Customer(Room::SIZE_M,3); $ibis = new Hotel(); $sophie->orderRoomTo($ibis);
  • 23.
    CUSTOMER UN PEU DECODE 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; } }
  • 24.
    HOTEL UN PEU DECODE 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; } }
  • 25.
    ROOM UN PEU DECODE 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; } }
  • 26.
    POUR UNE VIEDE 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 !
  • 27.
    MERCI ! ET TOUTDOIT FINIR PAR UN
  • 28.