SlideShare une entreprise Scribd logo
Javascript


    La POO
Bonnes pratiques




       Jean-pierre VINCENT (indépendant)
Qui ça ?
     Jean-pierre VINCENT

braincracking.org (veille techno)
@theystolemynick

12 ans de Web
Expertise technique, formateur,
consultant
Function   oop - bonnes pratiques ms tech days
Voici John l'ingénieur
Lvl 1 : décorateur de page
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Lvl 1 : décorateur de page

<script>
$('#id').randomPlugin();
</script>
Démo plugin easySlider
Moralité


JavaScript ça se copie / colle
Lvl 2 : scripteur
Lvl 2 : scripteur
<script>
function init( id ) {
    $(id).randomPlugin();
};

$(document).ready( function() {
    init( '#main' );
    init( '#side' );
});
</script>
Lvl 2 : scripteur débogueur
Ajouts :

●
 Pubs
●
 Widgets sociaux
●
 Trackers
●
 Autres plugins
●
 Autres scripts maison
Lvl 2 : scripteur débogueur
Ajouts :

●
 Pubs
●
 Widgets sociaux
●
 Trackers
●
 Autres plugins
●
 Autres scripts maison
Lvl 2 : scripteur débogueur
<script>
function init( id ) {
    $(id).randomPlugin();
};

// init se fait écraser
$(document).ready( function() {
    init( '#main' );
    init( '#side' );
});
</script>
Pollution globale
Pollution globale
2 exemples complètement au hasard
●Gmail : 33 variables globales (450K lignes
de code)


●   Lemonde.fr : 480 variables globales
Actions
✓pattern module anonyme + var

✗ Function action() {}
✓ var action = function() {
      var myVariable;
  }

✓namespaces
Création d'un scope
Rappel
(function(){ // début de scope local
     var private = true;

    // ici je suis chez moi

})(); // fin de scope local
Lvl 3 : scripteur prudent
Correction 1
(function(){ // début de scope local
     var init = function( id ) {
          $(id).randomPlugin();
     };
     $(document).ready( function() {
         init( '#main' );
         init( '#side' );
     });
})(); // fin de scope local
Namespaces
var MY = {};
Namespaces
var MY = {};

MY.init = function() {};
Namespaces
var MY = {};

MY.init = function() {};

MY.utils = {};
Namespaces
var MY = {};

MY.init = function() {};

MY.utils = {};

MY.utils.XHR = function() {};
Namespaces
var MY = {};

MY.init = function() {};

MY.utils = {};

MY.utils.XHR = function() {};

MY.utils.XHR.instances = {};
Namespaces - astuce

récupérer ou créer un namespace

MY = window.MY || {};

MY.utils = MY.utils || {};
Lvl 4 scripteur organisé
(function(){
     MY = window.MY || {};
     MY.init = function( id ) {
         $(id).randomPlugin();
    };
})( );
$(document).ready( function() {
    MY.init( '#main' );
    MY.init( '#side' );
});
Lvl 4 scripteur organisé


Démo code final namespaces
Lvl 5 : développeur
Programmation
Orienté
Objet
POO Classique
new, class, static, public,
private, __construct,
$this, const, self::,
extends, protected,
parent::, abstract, final,
interface, implements,
instanceof
POO JS
    EcmaScript 3

new (optionnel)
this (particulier)
instanceof
POO JS

new (optionel)
this (particulier)
instanceof

  Rien n'est littéral
  Tout est simulable
Le choix

Prototype ou closure ?
Le choix
Prototype ou closure ?

●   Prototype :
       • The JS way
       • performance (grand nombres)

●   Closure :
       • variables privées
       • plus lisible ?
Closure
myClass = function () {
  var privateVariable = 0;
  // public methods




};
Closure
myClass = function () {
   var privateVariable = 0;
   // public methods
   return {
     decrement:function() {
        console.log( --privateVariable );
     },
     increment:function() {
        console.log( ++privateVariable );
     }
   }
};
Renvoi d'objets
myClass = function () {
   return {
     decrement:function() {   },
     increment:function() {   }
   }
};
myObject = myClass();
myObject.decrement(); // -1
myObject.decrement(); // -2
myObject2 = myClass();
myObject2.increment(); // 1
myObject2.increment(); // 2
Lvl 5 : développeur


 Démo « interface publique »
Implémentation d'un « next »
Lvl 6 : développeur
Développeur
    DHTML
    AJAX
    2.0
    HTML5 !
Lvl 6 : programmation
     événementielle


Démo « événements »
Tout est émulable
●   Pattern factory
Statiques
myClass = function () {
   return {
     publicMethod:function() {}
   }
};
myClass.staticMethod = function() {};
Statiques
myClass = function () {
   return {
     publicMethod:function() {}
   }
};
myClass.staticMethod = function() {};

myObject = myClass();
MyClass .staticMethod();    // OK
MyObject .publicMethod();   // OK
Statiques
myClass = function () {
   return {
     publicMethod:function() {}
   }
};
myClass.staticMethod = function() {};

myObject   = myClass();
MyClass    .staticMethod();   //   OK
MyObject   .publicMethod();   //   OK
MyObject   .staticMethod();   //   Error
MyClass    .publicMethod();   //   Error
Factory



Démo « factory »
Lvl 6 : développeur objet
Tout est émulable
● programmation évènementielle
● patterns classiques :

   ● MVC,


   ● observer,


   ● facade, proxy,


   ● singleton, factory ...
Librairies

 Frameworks divers :
● Tests U

● Events

● MVC

● Data-bindings
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech days
Librairies
Conclusion

●   Javascript est différent, apprenez le

●   OOP réutilisable
Questions ?

Jean-pierre VINCENT
braincracking.org
@theystolemynick

RDV maintenant :
stand Generative Objects
(N° 55 à côté HP)
Function.prototype
Tout est objet
"abc".indexOf('a'); // 0

[1,2,3].slice(1); // [2, 3]

13.3714 .toFixed(1); // "13.4"

/[0-9]/g.test('10/11/2011'); // true
Function.prototype
Tout est objet
var myFunction = function() {};

myFunction.prototype; // object
Function.prototype
var myClass = function () {
   // pas de variable privée
   this.publicVariable = 0;
};
myClass.prototype = {
   decrement:function() {
      console.log( --this.publicVariable );
   },
   increment:function() {
      console.log( ++this.publicVariable );
   }
};
Héritage
var subClass = function() {
     this.publicVariable = 10;
};

subClass.prototype = myClass.prototype;
Héritage
var subClass = function() {
     this.publicVariable = 10;
};

subClass.prototype = myClass.prototype;
subClass.prototype.constructor= subClass;
Héritage
var subClass = function() {
     this.publicVariable = 10;
};

subClass.prototype = myClass.prototype;
subClass.prototype.constructor= subClass;


myObject2 = new subClass();
myObject2.increment(); // 11
myObject2.increment(); // 12
Héritage
var subClass = function() {
     this.publicVariable = 10;
};

subClass.prototype = myClass.prototype;
subClass.prototype.constructor= subClass;
subClass.prototype.square = function(){}

myObject2 = new subClass();
myObject2.square(); // 100
Héritage
var subClass = function() {
     this.publicVariable = 10;
};

subClass.prototype = myClass.prototype;
subClass.prototype.constructor= subClass;
subClass.prototype.square = function(){}

myObject2 = new subClass();
myObject2.square(); // 100

Contenu connexe

ODP
Patterns et bonnes pratiques autour de JavaScript
PDF
Notions de base de JavaScript
ODP
Introduction à JavaScript
PPTX
Cours javascript v1
PDF
Programmation Orientée Objet et les Traits en PHP 5.4
PPTX
JavaScript prise en main et fondamentaux
PDF
PHP 7 et Symfony 3
PDF
Fondamentaux portée - contexte - function ms tech days
Patterns et bonnes pratiques autour de JavaScript
Notions de base de JavaScript
Introduction à JavaScript
Cours javascript v1
Programmation Orientée Objet et les Traits en PHP 5.4
JavaScript prise en main et fondamentaux
PHP 7 et Symfony 3
Fondamentaux portée - contexte - function ms tech days

Tendances (20)

PPTX
Javascript un langage supérieur
KEY
Exploiter php 5
PDF
Programmation orientée objet en PHP 5
PDF
Nouveautés php 7
PDF
PPTX
Présentation de ECMAScript 6
PPTX
Javascript - Fonctions : que fait ce code ?
PPTX
Javascript objet : que fait ce code ?
PPTX
Javascript - Tableaux : que fait ce code ?
PDF
Javascript les générateurs (generators)
PDF
Javascript
PPTX
Symfony2 - Un Framework PHP 5 Performant
PPTX
php2 : formulaire-session-PDO
PPTX
Change mind about JS
PPTX
Nouveautés JavaScript dans le monde Microsoft
PPTX
Requêtes HTTP synchrones et asynchrones
PPT
Introduction à JavaScript
PDF
Communications Réseaux et HTTP avec PHP
PDF
PHP 7.0 : aperçu des nouveautés
PPTX
Introduction au Jquery
Javascript un langage supérieur
Exploiter php 5
Programmation orientée objet en PHP 5
Nouveautés php 7
Présentation de ECMAScript 6
Javascript - Fonctions : que fait ce code ?
Javascript objet : que fait ce code ?
Javascript - Tableaux : que fait ce code ?
Javascript les générateurs (generators)
Javascript
Symfony2 - Un Framework PHP 5 Performant
php2 : formulaire-session-PDO
Change mind about JS
Nouveautés JavaScript dans le monde Microsoft
Requêtes HTTP synchrones et asynchrones
Introduction à JavaScript
Communications Réseaux et HTTP avec PHP
PHP 7.0 : aperçu des nouveautés
Introduction au Jquery
Publicité

En vedette (6)

PDF
Effective memory management
PDF
Introduction à la webperf
PDF
Accélération des pages Web : les bases en exemple
PDF
Xamarin.android memory management gotchas
PDF
Techniques d'accélération des pages web
PDF
Codeware
Effective memory management
Introduction à la webperf
Accélération des pages Web : les bases en exemple
Xamarin.android memory management gotchas
Techniques d'accélération des pages web
Codeware
Publicité

Similaire à Function oop - bonnes pratiques ms tech days (20)

PDF
Javascript : fondamentaux et OOP
ODP
Ecriture de classes javascript
PDF
Javascript pour les développeurs Java : quels sont les pièges à éviter ?
PDF
Javascript ne se limite pas à jquery
PPTX
Présentation Javascript à l'ESI (Alger)
PDF
JavaScript pour le développeur Java
PDF
Cours JavaScript
PPTX
Formation JavaScript - Guide de démarrage rapide
PPTX
Présentation JavaScript
PDF
JavaScript pour le développeur Java
PPTX
Javascript proprement
PDF
Algo poo ts
PDF
Johnny-Five : Robotique et IoT en JavaScript
PDF
Javascript mémo.pdf
PPTX
OOP & Design Pattern - Algiers Developers Meetup August 2015
PPTX
OOP and Design Patterns
PPTX
JavaScript pour les développeurs .NET
PDF
Javascript pour le développeur Java
PDF
Qualité de code et bonnes pratiques
Javascript : fondamentaux et OOP
Ecriture de classes javascript
Javascript pour les développeurs Java : quels sont les pièges à éviter ?
Javascript ne se limite pas à jquery
Présentation Javascript à l'ESI (Alger)
JavaScript pour le développeur Java
Cours JavaScript
Formation JavaScript - Guide de démarrage rapide
Présentation JavaScript
JavaScript pour le développeur Java
Javascript proprement
Algo poo ts
Johnny-Five : Robotique et IoT en JavaScript
Javascript mémo.pdf
OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP and Design Patterns
JavaScript pour les développeurs .NET
Javascript pour le développeur Java
Qualité de code et bonnes pratiques

Plus de Jean-Pierre Vincent (15)

PPTX
Mesurer la performance : onload, pages
PPTX
Les Performance de rendu sur mobile
PDF
La performance sur mobile
PDF
Performances web - quoi de neuf ?
PPTX
Techniques accélération des pages web #kiwiparty
ODP
Le monitoring de la performance front
PDF
Les performances Web mobile
PDF
Retours sur le concours Webperf 2010
ODP
Télés connectées et développement Web
ODP
Html5 bonnes-pratiques
PDF
Inclure du Javascript de manière performante
PDF
HTML5 maintenant partie 3 : multimedia
PDF
HTML5 maintenant partie 2 : APIs
PDF
HTML5 maintenant partie 1 : la sémantique
PDF
Html5 now light
Mesurer la performance : onload, pages
Les Performance de rendu sur mobile
La performance sur mobile
Performances web - quoi de neuf ?
Techniques accélération des pages web #kiwiparty
Le monitoring de la performance front
Les performances Web mobile
Retours sur le concours Webperf 2010
Télés connectées et développement Web
Html5 bonnes-pratiques
Inclure du Javascript de manière performante
HTML5 maintenant partie 3 : multimedia
HTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 1 : la sémantique
Html5 now light

Function oop - bonnes pratiques ms tech days

  • 1. Javascript La POO Bonnes pratiques Jean-pierre VINCENT (indépendant)
  • 2. Qui ça ? Jean-pierre VINCENT braincracking.org (veille techno) @theystolemynick 12 ans de Web Expertise technique, formateur, consultant
  • 5. Lvl 1 : décorateur de page
  • 8. Lvl 1 : décorateur de page <script> $('#id').randomPlugin(); </script>
  • 11. Lvl 2 : scripteur
  • 12. Lvl 2 : scripteur <script> function init( id ) { $(id).randomPlugin(); }; $(document).ready( function() { init( '#main' ); init( '#side' ); }); </script>
  • 13. Lvl 2 : scripteur débogueur Ajouts : ● Pubs ● Widgets sociaux ● Trackers ● Autres plugins ● Autres scripts maison
  • 14. Lvl 2 : scripteur débogueur Ajouts : ● Pubs ● Widgets sociaux ● Trackers ● Autres plugins ● Autres scripts maison
  • 15. Lvl 2 : scripteur débogueur <script> function init( id ) { $(id).randomPlugin(); }; // init se fait écraser $(document).ready( function() { init( '#main' ); init( '#side' ); }); </script>
  • 17. Pollution globale 2 exemples complètement au hasard ●Gmail : 33 variables globales (450K lignes de code) ● Lemonde.fr : 480 variables globales
  • 18. Actions ✓pattern module anonyme + var ✗ Function action() {} ✓ var action = function() { var myVariable; } ✓namespaces
  • 19. Création d'un scope Rappel (function(){ // début de scope local var private = true; // ici je suis chez moi })(); // fin de scope local
  • 20. Lvl 3 : scripteur prudent Correction 1 (function(){ // début de scope local var init = function( id ) { $(id).randomPlugin(); }; $(document).ready( function() { init( '#main' ); init( '#side' ); }); })(); // fin de scope local
  • 22. Namespaces var MY = {}; MY.init = function() {};
  • 23. Namespaces var MY = {}; MY.init = function() {}; MY.utils = {};
  • 24. Namespaces var MY = {}; MY.init = function() {}; MY.utils = {}; MY.utils.XHR = function() {};
  • 25. Namespaces var MY = {}; MY.init = function() {}; MY.utils = {}; MY.utils.XHR = function() {}; MY.utils.XHR.instances = {};
  • 26. Namespaces - astuce récupérer ou créer un namespace MY = window.MY || {}; MY.utils = MY.utils || {};
  • 27. Lvl 4 scripteur organisé (function(){ MY = window.MY || {}; MY.init = function( id ) { $(id).randomPlugin(); }; })( ); $(document).ready( function() { MY.init( '#main' ); MY.init( '#side' ); });
  • 28. Lvl 4 scripteur organisé Démo code final namespaces
  • 29. Lvl 5 : développeur
  • 31. POO Classique new, class, static, public, private, __construct, $this, const, self::, extends, protected, parent::, abstract, final, interface, implements, instanceof
  • 32. POO JS EcmaScript 3 new (optionnel) this (particulier) instanceof
  • 33. POO JS new (optionel) this (particulier) instanceof Rien n'est littéral Tout est simulable
  • 35. Le choix Prototype ou closure ? ● Prototype : • The JS way • performance (grand nombres) ● Closure : • variables privées • plus lisible ?
  • 36. Closure myClass = function () { var privateVariable = 0; // public methods };
  • 37. Closure myClass = function () { var privateVariable = 0; // public methods return { decrement:function() { console.log( --privateVariable ); }, increment:function() { console.log( ++privateVariable ); } } };
  • 38. Renvoi d'objets myClass = function () { return { decrement:function() { }, increment:function() { } } }; myObject = myClass(); myObject.decrement(); // -1 myObject.decrement(); // -2 myObject2 = myClass(); myObject2.increment(); // 1 myObject2.increment(); // 2
  • 39. Lvl 5 : développeur Démo « interface publique » Implémentation d'un « next »
  • 40. Lvl 6 : développeur Développeur DHTML AJAX 2.0 HTML5 !
  • 41. Lvl 6 : programmation événementielle Démo « événements »
  • 42. Tout est émulable ● Pattern factory
  • 43. Statiques myClass = function () { return { publicMethod:function() {} } }; myClass.staticMethod = function() {};
  • 44. Statiques myClass = function () { return { publicMethod:function() {} } }; myClass.staticMethod = function() {}; myObject = myClass(); MyClass .staticMethod(); // OK MyObject .publicMethod(); // OK
  • 45. Statiques myClass = function () { return { publicMethod:function() {} } }; myClass.staticMethod = function() {}; myObject = myClass(); MyClass .staticMethod(); // OK MyObject .publicMethod(); // OK MyObject .staticMethod(); // Error MyClass .publicMethod(); // Error
  • 47. Lvl 6 : développeur objet
  • 48. Tout est émulable ● programmation évènementielle ● patterns classiques : ● MVC, ● observer, ● facade, proxy, ● singleton, factory ...
  • 49. Librairies Frameworks divers : ● Tests U ● Events ● MVC ● Data-bindings
  • 57. Conclusion ● Javascript est différent, apprenez le ● OOP réutilisable
  • 58. Questions ? Jean-pierre VINCENT braincracking.org @theystolemynick RDV maintenant : stand Generative Objects (N° 55 à côté HP)
  • 60. Tout est objet "abc".indexOf('a'); // 0 [1,2,3].slice(1); // [2, 3] 13.3714 .toFixed(1); // "13.4" /[0-9]/g.test('10/11/2011'); // true
  • 61. Function.prototype Tout est objet var myFunction = function() {}; myFunction.prototype; // object
  • 62. Function.prototype var myClass = function () { // pas de variable privée this.publicVariable = 0; }; myClass.prototype = { decrement:function() { console.log( --this.publicVariable ); }, increment:function() { console.log( ++this.publicVariable ); } };
  • 63. Héritage var subClass = function() { this.publicVariable = 10; }; subClass.prototype = myClass.prototype;
  • 64. Héritage var subClass = function() { this.publicVariable = 10; }; subClass.prototype = myClass.prototype; subClass.prototype.constructor= subClass;
  • 65. Héritage var subClass = function() { this.publicVariable = 10; }; subClass.prototype = myClass.prototype; subClass.prototype.constructor= subClass; myObject2 = new subClass(); myObject2.increment(); // 11 myObject2.increment(); // 12
  • 66. Héritage var subClass = function() { this.publicVariable = 10; }; subClass.prototype = myClass.prototype; subClass.prototype.constructor= subClass; subClass.prototype.square = function(){} myObject2 = new subClass(); myObject2.square(); // 100
  • 67. Héritage var subClass = function() { this.publicVariable = 10; }; subClass.prototype = myClass.prototype; subClass.prototype.constructor= subClass; subClass.prototype.square = function(){} myObject2 = new subClass(); myObject2.square(); // 100

Notes de l'éditeur