Comprendre le concept de la Programmation Orientée Objet
Le concept de POO est bien plus simple qu’il n’y parait car il rapproche les notions de programmations de la vie réelle.
Ici, un objet est la représentation en programmation de ce qui est ou pourrait être un objet de la vie réelle, des fois ça va simplement représenter un objet physique, des fois un objet théorique, des fois simplement servir d’outil pour le traitement de données ou de relations.
Qu’est-ce qu’un objet ?
Un objet est une donnée issue d’une classe, la classe définie sa structure/son modèle. Cet objet possède un ensemble de propriétés, qu’on peut aussi appeler attributs, ils lui permettent de spécifier des informations qui lui sont propres dans le cadre définie par la classe.
C’est très similaire aux entrées de table en base de données.
Mais un objet possède aussi un ensemble fonctionnel, des fonctions, qu’on appelle aussi méthodes, elles lui permettent d’agir dans son propre contexte.
Une méthode peut ainsi effectuer une opération sur les propriétés de cet objet et elle peut être la seule à implémenter un algorithme permettant le traitement de cet objet.
Rien de mieux pour comprendre tout ça que quelques exemples.
Mieux comprendre le concept de Programmation Orientée Objet
Nous allons voir ensemble plusieurs exemples pour vous permettre de mieux comprendre cette approche de la programmation.
Une Personne
Michel est un objet de classe Person et possède les propriétés firstname, lastname, gender et birthdate.
L’ensemble des propriétés de Michel, son prénom, son nom, son sexe et sa date de naissance lui sont propres, cet objet ne représente donc qu’une seule personne.
La classe Person permet de calculer l’âge de Michel, car on a une propriété date de naissance mais pas âge. La méthode getAge() de Person permettra donc de déduire l’âge de Michel à partir de sa date de naissance.
1 2 3 4 5 6 7 8 9 10 11 12 |
class Person { string firstname; string lastname; string gender; Date birthDate; function getAge() { return convertInYear(currentDate()-birthDate); } } |
Un Fichier
La classe File représente un fichier qu’on peut avoir sur son disque dur, elle possède les propriétés path, size, type et createDate.
Le fichier est donc bien sur le disque dur mais l’objet File que nous allons créer va le représenter en programmation et va nous permettre de le manipuler. On pourra ainsi avoir une méthode copy() pour copier ce fichier, une méthode move() pour le déplacer, une méthode getContents() pour en récupérer le contenu, etc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class File { string path; int size; string type; Date createDate; function copy(string to) { copy(path, to); } function move(string to) { move(path, to); this.path = to; } function getContents() { return file_get_contents(path); } } |
Une connexion à la base de données
La classe DatabaseConnection gère la connexion à la base de données et permet de communiquer avec elle via ses méthodes. On instancie notre objet avec ses paramètres de connexion et il se connecte tout seul dès que besoin, effectue la requête demandée et vous renvoie le résultat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class DatabaseConnection { resource connection; string host; int port; string user; string password; function DatabaseConnection() { } function connect() { if( this.isConnected() ) { return false; } // Implémenter la connexion à la base de données // Utiliser host, port, user et password return true; } function disconnect() { if( !this.isConnected() ) { return false; } // Déconnexion de la base de données return true; } function isConnected() { return connection != null; } function request(string query) { // Connexion automatique this.connect(); // Utiliser query pour envoyer une requête à la base de données } } |
Une collection
La classe Collection est une classe permettant la manipulation d’une collection de données, ici des chaînes de caractères. Ses méthodes permettent d’ajouter ou de supprimer des éléments de la collection.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Collection implements Iterable { string[] data; function add(item) { data[] = item; } function remove(item) { unset(data[this.indexOf(item)]); } function indexOf(item) { for( int k in data ) { if( data[k] == item ) { return k; } } } } |
L’héritage
L’héritage est un concept merveilleux qui a été inventé pour la programmation orientée objet. Une classe peut hériter d’une autre, elle implémente donc naturellement, les mêmes attributs et méthodes que la classe mère, elle peut aussi écrire ses propres fonctions mais le meilleur est qu’elle peut ré-écrire les méthodes de la classe mère.
Un objet de la classe fille aura la particularité d’être un objet de cette classe fille mais aussi de la classe mère, elle est entièrement compatible par nature et reconnue comme un objet de cette classe tout autant que de la classe fille. On peut évidemment hériter une classe qui hérite elle-même d’une autre classe, sans vraiment de limite.
En programmation, on peut ainsi déclarer une variable comme étant d’une certaine classe A mais en vrai, elle pourra contenir un objet d’une classe B héritant de la classe A, on ne pourra alors appeler que les méthodes connues de A mais la machine exécutera celles de B.
On appelle cela le polymorphisme.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class A { function test() { echo "Je suis un A"; } } class B extends A { function test() { echo "Je suis un B"; } } A var1 = new A(); var1.test(); // Affiche "Je suis un A" B var2 = new B(); var2.test(); // Affiche "Je suis un B" A var3 = new B(); var3.test(); // Affiche "Je suis un B" |
La visibilité
La visibilité limite l’accès à un attribut ou une méthode au contexte qu’on désire. Quand je parle d’accès, pour un attribut, c’est lire, définir et surcharger cet attribut, pour une méthode, c’est l’appeler et la surcharger.
La visibilité a communément 3 valeurs possibles :
- public : Bien souvent la valeur par défaut, n’importe quelles sources peuvent accéder aux méthodes et attributs publiques d’un objet.
- protected : Seule la classe elle-même et une classe héritant de celle-ci peuvent accéder aux propriétés et méthodes publiques. C’est généralement apprécier pour un usage interne mais elle permet l’héritage et le polymorphisme.
- private : Là l’accès est carrément limité à la classe elle-même, généralement bien pour un usage interne uniquement.
Pour conclure…
La programmation objet existe depuis bien longtemps et elle a imprégné de nombreux langages de programmation. Son utilité va bien plus loin que cet aperçu, elle permet de mettre en place des bonnes pratiques, de conserver l’intégrité des données et d’appliquer de nombreux patron de conception.