SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
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
Voici John l'ingénieur
Lvl 1 : décorateur de page
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
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

Tendances

Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Kristen Le Liboux
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6Julien CROUZET
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Javascript objet : que fait ce code ?
Javascript objet : que fait ce code ?Ruau Mickael
 
Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Javascript - Tableaux : que fait ce code ?
Javascript - Tableaux : que fait ce code ?Ruau Mickael
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)Julien CROUZET
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
PHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésPHP 7.0 : aperçu des nouveautés
PHP 7.0 : aperçu des nouveautésDidcode
 

Tendances (20)

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

En vedette

Effective memory management
Effective memory managementEffective memory management
Effective memory managementDenis Zhuchinski
 
Accélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleAccélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleJean-Pierre Vincent
 
Xamarin.android memory management gotchas
Xamarin.android memory management gotchasXamarin.android memory management gotchas
Xamarin.android memory management gotchasAlec Tucker
 
Techniques d'accélération des pages web
Techniques d'accélération des pages webTechniques d'accélération des pages web
Techniques d'accélération des pages webJean-Pierre Vincent
 

En vedette (6)

Effective memory management
Effective memory managementEffective memory management
Effective memory management
 
Introduction à la webperf
Introduction à la webperfIntroduction à la webperf
Introduction à la webperf
 
Accélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exempleAccélération des pages Web : les bases en exemple
Accélération des pages Web : les bases en exemple
 
Xamarin.android memory management gotchas
Xamarin.android memory management gotchasXamarin.android memory management gotchas
Xamarin.android memory management gotchas
 
Techniques d'accélération des pages web
Techniques d'accélération des pages webTechniques d'accélération des pages web
Techniques d'accélération des pages web
 
Codeware
CodewareCodeware
Codeware
 

Similaire à Function oop - bonnes pratiques ms tech days

Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web5pidou
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptRaphaël Semeteys
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture zaghir
 
Javascript pour les développeurs Java : quels sont les pièges à éviter ?
Javascript pour les développeurs Java : quels sont les pièges à éviter ?Javascript pour les développeurs Java : quels sont les pièges à éviter ?
Javascript pour les développeurs Java : quels sont les pièges à éviter ?FlorianBoulay
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Corinne Schillinger
 

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

Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture
 
Javascript pour les développeurs Java : quels sont les pièges à éviter ?
Javascript pour les développeurs Java : quels sont les pièges à éviter ?Javascript pour les développeurs Java : quels sont les pièges à éviter ?
Javascript pour les développeurs Java : quels sont les pièges à éviter ?
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
 
IF-RMI.pdf
IF-RMI.pdfIF-RMI.pdf
IF-RMI.pdf
 

Plus de Jean-Pierre Vincent

Mesurer la performance : onload, pages
Mesurer la performance : onload, pagesMesurer la performance : onload, pages
Mesurer la performance : onload, pagesJean-Pierre Vincent
 
Les Performance de rendu sur mobile
Les Performance de rendu sur mobileLes Performance de rendu sur mobile
Les Performance de rendu sur mobileJean-Pierre Vincent
 
Performances web - quoi de neuf ?
Performances web - quoi de neuf ?Performances web - quoi de neuf ?
Performances web - quoi de neuf ?Jean-Pierre Vincent
 
Techniques accélération des pages web #kiwiparty
Techniques accélération des pages web #kiwipartyTechniques accélération des pages web #kiwiparty
Techniques accélération des pages web #kiwipartyJean-Pierre Vincent
 
Le monitoring de la performance front
Le monitoring de la performance frontLe monitoring de la performance front
Le monitoring de la performance frontJean-Pierre Vincent
 
Retours sur le concours Webperf 2010
Retours sur le concours Webperf 2010Retours sur le concours Webperf 2010
Retours sur le concours Webperf 2010Jean-Pierre Vincent
 
Télés connectées et développement Web
Télés connectées et développement WebTélés connectées et développement Web
Télés connectées et développement WebJean-Pierre Vincent
 
Inclure du Javascript de manière performante
Inclure du Javascript de manière performanteInclure du Javascript de manière performante
Inclure du Javascript de manière performanteJean-Pierre Vincent
 
HTML5 maintenant partie 3 : multimedia
HTML5 maintenant partie 3 : multimediaHTML5 maintenant partie 3 : multimedia
HTML5 maintenant partie 3 : multimediaJean-Pierre Vincent
 
HTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsHTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsJean-Pierre Vincent
 
HTML5 maintenant partie 1 : la sémantique
HTML5 maintenant partie 1 : la sémantiqueHTML5 maintenant partie 1 : la sémantique
HTML5 maintenant partie 1 : la sémantiqueJean-Pierre Vincent
 

Plus de Jean-Pierre Vincent (15)

Mesurer la performance : onload, pages
Mesurer la performance : onload, pagesMesurer la performance : onload, pages
Mesurer la performance : onload, pages
 
Les Performance de rendu sur mobile
Les Performance de rendu sur mobileLes Performance de rendu sur mobile
Les Performance de rendu sur mobile
 
La performance sur mobile
La performance sur mobileLa performance sur mobile
La performance sur mobile
 
Performances web - quoi de neuf ?
Performances web - quoi de neuf ?Performances web - quoi de neuf ?
Performances web - quoi de neuf ?
 
Techniques accélération des pages web #kiwiparty
Techniques accélération des pages web #kiwipartyTechniques accélération des pages web #kiwiparty
Techniques accélération des pages web #kiwiparty
 
Le monitoring de la performance front
Le monitoring de la performance frontLe monitoring de la performance front
Le monitoring de la performance front
 
Les performances Web mobile
Les performances Web mobileLes performances Web mobile
Les performances Web mobile
 
Retours sur le concours Webperf 2010
Retours sur le concours Webperf 2010Retours sur le concours Webperf 2010
Retours sur le concours Webperf 2010
 
Télés connectées et développement Web
Télés connectées et développement WebTélés connectées et développement Web
Télés connectées et développement Web
 
Html5 bonnes-pratiques
Html5 bonnes-pratiquesHtml5 bonnes-pratiques
Html5 bonnes-pratiques
 
Inclure du Javascript de manière performante
Inclure du Javascript de manière performanteInclure du Javascript de manière performante
Inclure du Javascript de manière performante
 
HTML5 maintenant partie 3 : multimedia
HTML5 maintenant partie 3 : multimediaHTML5 maintenant partie 3 : multimedia
HTML5 maintenant partie 3 : multimedia
 
HTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsHTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIs
 
HTML5 maintenant partie 1 : la sémantique
HTML5 maintenant partie 1 : la sémantiqueHTML5 maintenant partie 1 : la sémantique
HTML5 maintenant partie 1 : la sémantique
 
Html5 now light
Html5 now lightHtml5 now light
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
  • 3.
  • 5. Lvl 1 : décorateur de page
  • 6.
  • 7.
  • 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
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 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

  1. 2/7/12
  2. 2/7/12
  3. 2/7/12
  4. 2/7/12
  5. 2/7/12
  6. 2/7/12
  7. 2/7/12
  8. 2/7/12
  9. 2/7/12
  10. 2/7/12
  11. 2/7/12
  12. 2/7/12
  13. 2/7/12
  14. 2/7/12
  15. 2/7/12
  16. 2/7/12
  17. 2/7/12
  18. 2/7/12
  19. 2/7/12
  20. 2/7/12
  21. 2/7/12
  22. 2/7/12
  23. 2/7/12
  24. 2/7/12
  25. 2/7/12
  26. 2/7/12
  27. 2/7/12
  28. 2/7/12
  29. 2/7/12
  30. 2/7/12
  31. 2/7/12
  32. 2/7/12
  33. 2/7/12
  34. 2/7/12
  35. 2/7/12
  36. 2/7/12
  37. 2/7/12
  38. 2/7/12
  39. 2/7/12
  40. 2/7/12
  41. 2/7/12
  42. 2/7/12
  43. 2/7/12
  44. 2/7/12
  45. 2/7/12
  46. 2/7/12
  47. 2/7/12
  48. 2/7/12
  49. 2/7/12
  50. 2/7/12
  51. 2/7/12
  52. 2/7/12
  53. 2/7/12
  54. 2/7/12
  55. 2/7/12
  56. 2/7/12
  57. 2/7/12
  58. 2/7/12
  59. 2/7/12
  60. 2/7/12
  61. 2/7/12
  62. 2/7/12
  63. 2/7/12
  64. 2/7/12
  65. 2/7/12
  66. 2/7/12
  67. 2/7/12