Partie 1: OOP, OOP, vocabulaire, et UML

Sommaire
Partie 1: OOP, OOP, vocabulaire, et UML
Partie 2: Métodologies et Unified Process
Partie 3: Résumé, aller plus loin, et commentaires

Nous allons voir les généralités de la programmation par objet (Object-Oriented Programming ou OOP) (sans se fixer sur un langage de programmation particulier). On commencera par voir déjà ce qu'est la programmation objet, puis quelques méthodes de développement qui permettent de programmer par objet (tel que Unified Process). Il est supposé que vous sachiez déjà comment programmer, si possible dans un langage orienté objet (tel que C++/Java/C#).

Après avoir lu cet article vous devriez avoir les notions de bases et vous aurez des références pour étendre votre champ de compétences afin de programmer des logiciels complexe en respectant des délais.

Avant-propos

Quasi tous les nouveaux langages de programmation sont orienté objet. L'un des plus répandu reste encore le C++. Utiliser un langage orienté objet ne veut pas dire que l'on fait de la programmation par objet correcte. Il est tout à fait possible de faire de la programmation traditionnelle avec des classes qui sont en fait des fonctions sur des objets qui s'apparentent plus à des structures (Struct en C++). Notre but ici est premièrement de définir ce qu'est un objet, la programmation par objet, et voir une méthode pour l'appliquer.

Pourquoi programmer par objet

La programmation par objet s'oppose à la programmation traditionnelle. Dans la programmation traditionnelle on créé des fonctions qui opèrent sur des données. L'un des problèmes de cette approche est que les fonctions varient plus souvent que les données. Quand on fait un logiciel ainsi, on voit le fonctionnement global du logiciel, puis on partitionne en fonctions qui vont traiter nos données. La réutilisation de fonctions est difficile, mais le plus gros problèmes est qu'il faut connaître toute la structure du logiciel avant de pouvoir en modifier qu'une partie.

La programmation par objet c'est créer des méthodes qui autour d'une groupe de données. Nous verrons plus loin ce qu'est un objet et une méthode plus en détail. Pour l'instant considérez une méthode comme une fonction agissant sur le groupe de données de l'objet. L'un des principes de la programmation objet est d'avoir un couplage faible (loose coupling); cela veut dire que chaque objet utilise peu d'autres objets. De plus chaque objet est comme une boîte noire dont on peut modifier l'intérieur sans en modifier les propriétés ni le comportement. Cela implique que n'importe qui peut directement implémenter un objet (programmer cet objet) sans rien savoir sur les autres objets ni sur le l'application globale.

Pour résumer de façon simple, la programmation par objet facilite le développement de programmes complexes, facilite leur maintenance, et améliore la réusabilité du code. Par dessus cela et afin de programmer par objet on a des méthodologies de développement logiciel.

Vocabulaire: Qu'est qu'un objet, une classe...

De façon paradoxale la programmation objet, et principalement durant l'analyse, évite toute attache à un langage particulier ou à des spécifications techniques de programmation.

On verra à cependant chaque fois un exemple en C++ pour illustrer la définition.

Objet

Un objet est un item/objet/unité/entité (réel ou abstrait) unique et identifiable avec un rôle bien défini (chaque objet se focalise sur un ensemble de responsabilités bien défini). Ils sont persistant et changent d'état.

Persistant: À la différence des données transitoires, un objet doit persister et avoir une histoire durant sa vie. Un objet est créé à un certain moment, subit des changements d'états, et il est seulement détruit suite à une requête directe d'un utilisateur ou via un objet autorisé. Il doit avoir une identité propre.

Exemple: Personne john;, ici john est un objet de classe Personne.

Classe

Une classe est un ensemble d'objets qui ont une structure commune et un comportement commun. Un objet est une instance d'une classe. Une classe représente la matrice abstraite d'un objet avant sont instanciation.

Maintenant que vous avez entendu la version abstraite, voici la version plus pratique: Pour créer un objet on fait un MaVariable = new MaClasse();. MaVariable est ici un objet (c'est une instance de MyClasse), MyClasse est la classe de l'objet.

Exemple: class Personne {}; Personne john = new Personne();, ici john est un objet de classe Personne et l'on créé une nouvelle instance de Personne que l'on associe à john. John est une personne. Chaque "personne" à certains attributs communs (comme le sexe, l'âge...).

Attribut

Un attribut est une propriété observable des objets d'une classe.

Exemple: On ajoute un attribut Age à Personne (privé ici, donc inaccessible pour l'instant depuis l'extérieur de la classe). class Personne { private: int Age; };

Méthode

Une méthode est une opération qui peut changer la valeur des certains attributs d'un objet.

Exemple: On va ajouter une méthode publique pour accéder à l'âge (donc une méthode qui ne change pas les attributs de notre objet), et une autre pour modifier cet âge. Ces deux méthodes sont communément appelée getter and setter. class Personne { private: int Age; public: int GetAge() { return Age; } public: void SetAge(int nouvelAge) { Age = nouvelAge; } };

Opération

On voit aussi fréquent le terme d'opération. Ce terme signifie une méthode qui n'est pas un getter/setter mais réellement une opération à effectuer sur l'objet.

Exemple: Ici on ajoute une opération qui va permettre de trouver l'âge de la personne à une année donnée. class Personne { private: int Age; public: int GetAge() { return Age; } public: void SetAge(int nouvelAge) { Age = nouvelAge; } public: int CalculerAgeEn(int annee) { int anneeEnCours = localtime(time(NULL))->tm_year; int anneeDeNaissance = anneeEnCours - Age; return (annee - anneeDeNaissance); } };

Carte CRC

Avant de nous attaquer à des éléments plus complexes et afin de consolider les bases, nous allons voir un moyen de décrire un objet de façon très simple sans utiliser un langage particulier: Les cartes CRC. Elles ont été inventées pour faciliter l'apprentissage de la programmation objet.

Une carte CRC est tout simple un morceau de carton de taille environ 8x13cm ressemblant à ceci:

Carte CRC

On indique le nom de la classe, ainsi que les responsabilités et si il y a, les collaborations. Une responsabilité est tout comportement dont la classe est responsable. Une responsabilité dénote l'obligation pour un objet d'avoir un certain comportement. Pour effectuer certaines responsabilités, il se peut que la classe ai besoins d'une autre classe. On note dans la colonne des collaborateurs ces autres classes.

Analyse

L'analyse orienté objet (OOA) a pour but de modéliser le champ du problème, le problème que nous souhaitons résoudre en développant notre système orienté objet.

Durant l'analyse on oublis tout ce qui concerne l'implémentation concrète de l'application (ou plus globalement du système logiciel). On reste totalement hors de tout langage spécifique. On décrit ce que le logiciel doit faire, les classes et leurs attributs dans un langage humain avec des mots du domaine de l'utilisateur. L'utilisateur étant ici la personne qui va utiliser le logiciel.

Pour décrire un objet on peut utiliser des diagrammes UML (voir plus loin) ou des cartes CRC.

Exemple: La carte CRC ci-dessus.

Les limites entre la phase d'analyse et de design restent quand même un peu flou généralement quand on utilise une méthodologie itérative comme RUP.

Design

Le Design orienté objet (OOD) est l'activité qui consiste à trouver des solutions logiques pour résoudre un problème.

Une fois qu'on a analysé et capturé le problème, on cherche à le résoudre. Cette fois on se fixe à un langage et l'on décrit en détail les différentes classes, leurs interactions, leurs méthodes, leurs attributs selon les normes qu'on s'est fixé.

Exemple: "Calculer l'âge" devient "int CalculerAge(int annee)".

L'Unified Modelling Language (UML)

L'UML est une norme pour comprendre et dessiner différents types diagrammes pour la programmation objet. Chaque type de diagramme permet de modéliser un aspect ou un point de vue particulier de nos objets, des besoins utilisateur, des contraintes du système, etc. Apprendre l'UML demande du temps et apprendre à l'utiliser en demande tout autant si ce n'est plus.

L'UML n'est pas une méthode de programmation objet. Il ne décrit aucunement comment l'utiliser.

L'un des type de diagramme les plus connus est le Class Diagram (aussi appelé Structure Diagram):

Class Diagram

Le digramme ci-dessus est un diagramme de classe. De façon très simple maintenant que vous avez vu les cartes CRC, chaque rectangle correspond à une carte CRC. Les 3 compartiments correspondent respectivement au nom de la class, ses attributs, ses méthodes.

Même si l'UML permet de mettre sous forme visuelle assez claire tout un tas d'éléments pour décrire notre système, il faut savoir qu'il ne permet pas de modéliser tout ce dont on peut avoir besoins. Par exemple il ne permet par de décrire l'interface utilisateur ou l'ordinogramme de l'interface utilisateur pour n'en citer que deux.

Partie suivante Métodologies et Unified Process

Parties : 1, 23Suivante