GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

[Tutoriel] Présentation rapide de la programmation orientée objet

Aller en bas

[Tutoriel] Présentation rapide de la programmation orientée objet Empty [Tutoriel] Présentation rapide de la programmation orientée objet

Message par beddy Lun 9 Mar 2015 - 14:35

La programmation objet peut sembler comme ça impressionnante mais ne l’est pas vraiment. Vous êtes habitués à la programmation fonctionnelle et donc cette autre façon d’écrire  du code peut sembler rébarbative.
 
Il est vrai que le C++ n’est pas le plus sexy des langages objets, il y a beaucoup d’écriture pour faire des choses simples et j’avoue que ça peut devenir démotivant.
 
Cependant le concept d’objet permet de réaliser de grand projet bien mieux structurés et plus facile à maintenir. 
 
Sur ces bonnes paroles laisser moi vous faire un survole rapide de la programmation objet.  Juste une introduction rapide pour comprendre le concept de l’objet.
 
La programmation fonctionnelle
 
Lorsque que vous programmez en fonctionnelle vous avez vos fonctions, vos variables et vos structures de données. Si vous êtes organisés, votre code est bien commenté, les variables sont judicieusement nommées et si votre langage le permet vous pouvez même le découper dans plusieurs fichiers.
 
Le problème de la programmation fonctionnelle est une grosse marmite dans laquelle on y met tout. Plus le code grossit plus il est difficile de s’y retrouver.
 
Avant de continuer nous allons prendre un exemple de programme qui est destiné à gérer un sprite à l’écran.
 
Mon sprite a :
 
·      Une position sur l’écran
·      Il peut être affiché ou non
·      Il peut passer devant le premier plan ou derrière
 
En fonctionnelle on aurait un code du genre 

Var sprite_position_x=0
Var sprite_position_y=0
Var sprite_affiché = vrai
Var sprite_premier_plan = vrai
 
Fonction principale () {
  bouger_sprite(80,40)
  afficher_Sprite(vrai)
}
Fonction bouger_sprite (x,y){
  sprite_position_x=x
  sprite_position_y=y
}
Fonction afficher_sprite(etat){
  sprite_affiché = etat
}
Fonction sprite_premier_plan(etat) {
  sprite_premier_plan = etat
}
 
Dans une première analyse ce code n’a rien de dramatique. Il est clair, facile à lire et les fonctions sont très explicites. Si je reprend ce code dans 6 mois il sera aisé de le réutilisé.
 
Mais voilà dans un vrai projet englobe bien plus de fonctions et les variables globales du code vont s’accumuler au fil de l’écriture.
 
Mais allons plus loin dans notre code. Ici on parle d’un unique sprite. Si je voulais que mes fonctions gèrent n sprite je devrais modifier mon code :
 
-       créer des variables de positions, d’affichage et de premier plan pour mes n sprites.
-       créer n fonctions (bouger, afficher et premier plan) ou un paramètre précisant de quel sprite je souhaite modifier les attributs.
 
Certains me diront : Nous avons déjà surmonté ce type problème sans soucis en programmation fonctionnelle. Sachez que j'en ai aucun doute mais laissez moi vous présenter la programmation objet et voyons ensemble ses avantages.
 
La programmation objet
 
L’idée est ici de vous introduire le bénéfice de la programmation objet et de vous montrer comment en programmation orientée objet nous aborderions ce type de problème.
 
Avant de commence je voudrais que vous gardiez ce qui suit en tête :
 
En programmation orienté objet, il y a ce qu’on appel l’objet (qui est sa description) et l’instance d’un objet qui est sa matérialisation (en simple la variable/pointeur qui permettra de manipuler son objet).
 
Maintenant voyons comment écrire notre code de manipulation de sprite en programmation orienté objet :
 
 

Objet Sprite {
 
  Var sprite_position_x=0
  Var sprite_position_y=0
  Var sprite_affiché = vrai
  Var sprite_premier_plan = vrai
 
  Constructeur(){
    bouger_sprite(0,0)
    afficher_sprite(vrai)
  }
  Fonction bouger_sprite (x,y){
    sprite_position_x=x
    sprite_position_y=y
  }
  Fonction afficher_sprite(etat){
    sprite_affiché = etat
  }
  Fonction sprite_premier_plan(etat) {
    sprite_premier_plan = etat
  }
}


En terme d’écriture il n’y a pas beaucoup de différence et tant mieux car inutile de réinventer la roue. En revanche cotée structure l’ensemble de code est encapsulé dans une structure objet (qu'on appelle souvent classe dans beaucoup de langage orienté objet).
 
Maintenant la question est comment utilisons nous cette objet dans du code ?
 
De manière générale on décrit toujours un objet principal qui sera le premier objet instancier afin de démarrer le code. En C++ on passe étrangement par la fonction main pour démarrer le code.  Le C++ permet le mélange de fonctionnelle et de programmation objet ce qui peut perturber au départ. 

Objet Principal {
 
  Var sprite1 = new Sprite()
  sprite1.bouger_sprite(80,40)
  sprite1.afficher_sprite(vrai)
 
}


Les attributs et les méthodes
 
Ici la variable sprite1 est une instance de l’objet Sprite. L’ensemble des variables et fonctions de l’objet Sprite sont accessibles via la variable sprite1. Dans le jargon du langage objet les variables sont appelées les attributs et les fonctions des méthodes de l’objet.  L’ensemble est aussi appelé l’interface de l’objet.
 
Le constructeur
 
Le constructeur est une méthode qui est appelé automatique lors de l’instanciation de l’objet :
 

Var sprite1 = new Sprite() //instance de l’objet Sprite
 
A ce moment la méthode constructeur est exécutée. Elle permet l’initialisation de l’objet. Elle peut avoir des paramètres et un objet peut posséder plusieurs constructeurs :

Objet Sprite {
 
  Var sprite_position_x=0
  Var sprite_position_y=0
  Var sprite_affiché = vrai
  Var sprite_premier_plan = vrai
 
  Constructeur(){
    bouger_sprite(0,0)
    afficher_sprite(vrai)
  }
  Constructeur(x,y){
    bouger_sprite(x,y)
    afficher_sprite(vrai)
}


En général le constructeur est une méthode ayant le même nom que l’objet  comme suit :
 
Objet Sprite {
 
  Var sprite_position_x=0
  Var sprite_position_y=0
  Var sprite_affiché = vrai
  Var sprite_premier_plan = vrai
 
  Sprite(){
    bouger_sprite(0,0)
    afficher_sprite(vrai)
  }
  Sprite(x,y){
    bouger_sprite(x,y)
    afficher_sprite(vrai)
}
 
Protection des attributs et des méthodes
 
Il est possible par exemple d’écrire ceci en objet :
 

sprite1.sprite_position_x = 100

Ici on ne passe plus par la fonction bouger_sprite mais directement par la variable de l’objet. Ce point intéressant et me permet d’introduire la notion de visibilité des attributs et des méthodes d’un objet.
 
Imaginons que d’écriture directement dans la variable peut mettre ne danger le bon fonctionnement de notre sprite. Pour cette raison nous voudrions que l’utilisateur de l’objet Sprite soit obligé d’utiliser la méthode bouger_sprite. On peut alors définir les propriétés suivant dans l’objet Sprite :
 
Objet Sprite {
 
  Privé Var sprite_position_x=0
  Privé Var sprite_position_y=0
 

Ici on ajoute le mot clé privé (private dans les langage objet) qui interdit d’accéder directement aux attributs. Le méthode bouger sera l’unique moyen de modifier leurs valeurs et on pourra ajouter des contrôles au niveau de la méthode bouger_sprite :
 
  Fonction bouger_sprite (x,y){
     si ( x>0 et x<256)
       sprite_position_x=x
     si ( y>0 et y<200)
       sprite_position_x=x
  }


Le mot clé privé peut aussi s’appliqué à une méthode. Dans ce cas uniquement les méthode de l’objet pourrons l’appeler mais impossible de l’invoqué en dehors de l’objet.
 
Autre point, si nous voulons instancier n sprites cela devient très simple :
 
Objet Principal {
 
Var mesSprires []
 
  For i = 0 to 10 {      
     mesSprires [ i]= new Sprite() 
     mesSprires .bouger_sprite(80,40)
     mesSprires [i].afficher_sprite(vrai)
  }
      
   mesSprires[3].premier_plan(vrai)
}
[/i]

   
 
L’héritage
 
Autres avantage de l’objet est ce que l’on appel l’héritage. Il permet de créer un objet à partir de la définition d’un autre objet.
 
Créons ici un objet SuperSprite :
 

Objet SuperSprite hérite Sprite{
 
  SuperSprite(){
    bouger_sprite(0,0)
    afficher_sprite(vrai)
  }
  Function flip_Horizontal(){
   …
  }
  Function flip_Vertical(){
   …
  } 
}


Ici l’objet SuperSprite bénéficie des même méthodes que Sprite avec en sus deux nouvelles méthodes : filp_horizontal et flip_vertical. L’exemple est évidemment pédagogique. On aurait bien pu mettre ces méthodes dans l’objet Sprite.
 
Dans les livres il est souvent prit l’exemple d’un objet polygone est avec l’héritage de celui-ci on décrit des objets carré, triangle, etc.
 
Conclusion
 
Donc comme je vous l’ai dit, il s’agit d’une présentation rapide de la programmation objet. Cette présentation et je l’espère suffisamment claire pour que vous vous lancier plus facilement dans ce type de programmation.
 
J’ai longtemps pratiqué le C++ mais pour moi il est loin d’être le plus agréable pour appréhender la programmation objet. Ma préférence se tourne vers le langage Java qui au delà de l’écriture simplifie beaucoup de chose.  
 
Si vous avez des questions n’hésitez pas Wink
 
PS : Désolé, il doit y avoir une multitude de fautes et de coquilles dans ce texte Wink


Dernière édition par beddy le Lun 9 Mar 2015 - 16:12, édité 1 fois
beddy
beddy
Patient contaminé

Masculin Nombre de messages : 196
Age : 54
Localisation : Paris
Date d'inscription : 04/04/2013

http://somanybits.com

Revenir en haut Aller en bas

[Tutoriel] Présentation rapide de la programmation orientée objet Empty Re: [Tutoriel] Présentation rapide de la programmation orientée objet

Message par Invité Lun 9 Mar 2015 - 14:56

Merci Beddy pour ce petit tutoriel !! :)

Même l'assembleur me parait plus clair et compréhensible que ces concepts ...
J'avais commencé à m'y pencher, mais je n'ai aucun intérêt à perdre du temps dans une technologie qui m'apportera plus de problèmes que de solution, surtout concernant mes projets pour lequel le procédural suffit largement.

Mais je pense que mon rapport avec le C, C++, Java et consort révèle une véritable allergie et aversion ... En tout cas, s'il fallait obligatoirement passer par ces technologies, je ne ferai plus de développement en l'état actuel, c'est clair pour moi.
avatar
Invité
Invité


Revenir en haut Aller en bas

[Tutoriel] Présentation rapide de la programmation orientée objet Empty Re: [Tutoriel] Présentation rapide de la programmation orientée objet

Message par beddy Lun 9 Mar 2015 - 15:00

Je comprends ça m'a été très difficile aussi de passer de l'assembleur au C et du C au C++. 
Je n'ai rien contre l'assembleur puisque je suis en train de développer un IDE pour l'assembleur afin de simplifier l'écriture de projets. 

Mais je dois avouer après avoir travaillé sur beaucoup de langages que la programmation objet est vraiment très très pratique.  

Ensuite il n'y a pas de règles ,  on utilise les outils qui correspondent à nos projets. 

De toute façon pour des machines de petites capacités mémoire l'assembleur reste le mieux adapter. Le C ou C++ utilisent beaucoup d'espace mémoire pour les variables et utilise beaucoup la pile ce qui est quand même du luxe sur une machine de 64ko de ram. 

Wink
beddy
beddy
Patient contaminé

Masculin Nombre de messages : 196
Age : 54
Localisation : Paris
Date d'inscription : 04/04/2013

http://somanybits.com

Revenir en haut Aller en bas

[Tutoriel] Présentation rapide de la programmation orientée objet Empty Re: [Tutoriel] Présentation rapide de la programmation orientée objet

Message par Invité Lun 9 Mar 2015 - 16:43

Sympas comme tuto, surtout que j'envisageais de m'y remettre à la prog objet ..
avatar
Invité
Invité


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum