Table of Contents

Concept de l'ACOO (Analyse et Conception Orientées Objet)

Récapitulatif des informations issues du livre L'ACOO de la collection Tête la Première des éditions O'Reilly. Il est basé sur le langage Java.

Qu'est-ce qu'un bon logiciel ?

Analyse et Conception UML

Cas d'utilisation

Pour concevoir une application, il faut commencer par dresser le cas d'utilisation (il peut y en avoir plusieurs si l'application fait plusieurs choses). Il contient un chemin principal et peut contenir un ou plusieurs chemins alternatifs. C'est la transcription ordonnée et en français des exigences du client.

Diagramme des cas d'utilisation

Dans le cas d'une grosse application, dégager la vision d'ensemble avec un diagramme des cas d'utilisation (le plan directeur de notre système) et ensuite dresser les cas d'utilisation. On va du général au particulier.

Diagramme de classe

Ensuite seulement, il faut dresser le diagramme de classe UML. Il est plus facile à trouver puisqu'avec l'analyse textuelle du cas d'utilisation on se rend compte qu'en général les sujets donnent des classes et les verbes donnent les méthodes.

Composition

La composition vous permet d'utiliser le comportement d'une famille d'autres classes et de changer ce comportement pendant le fonctionnement de l'application. Avec la composition, l'objet composé des autres comportements possède ces comportements. Quand l'objet est détruit, tous ses comportements le sont aussi.

Agrégation

L'agrégation désigne le fait qu'une classe est utilisée comme une partie d'une autre classe, mais continue à exister en dehors de cette autre classe. La crème glacée, la banane et les cerises existent en dehors du banana split. Enlevez la jolie coupe en verre et vous avez toujours les composants séparés.

Composition ou agrégation ?

Le moyen le plus simple : Est-ce que l'objet dont je veux utiliser le comportement existe en dehors de l'objet qui utilise son comportement ?

Éléments de la programmation objet

Les types enumérés

Les types enumérés permettent de définir des constantes à utiliser à la place de valeurs un peu aléatoires. Cependant, il faut que les données ne soient pas trop importantes. Par exemple, faire correspondre des majuscules et des minuscules de façon à éviter les fautes de frappes. On met un switch dans la méthode toString() en java.

L'encapsulation

La délégation

La délégation, c'est quand un objet a besoin de réaliser une certaine tâche, et plutôt que de faire cette tâche directement, il demande à un autre objet de s'en occuper. La délégation protège vos objets des changements de mise en oeuvre des autres objets de votre logiciel.

Elle rend le code plus facile à réutiliser. Elle permet d'avoir des objets qui s'occupent de leur propre fonctionnalité plutôt que de disséminer le code qui gère le comportement d'un objet unique un peu partout dans l'application. L'exemple le plus courant en Java est la méthode equals(). Au lieu de faire une méthode qui compare deux objets, elle appelle equals() et on obtient simplement une réponse vrai ou faux.

Une application lâchement couplée

La délégation aide l'application à rester lâchement couplée. Cela signifie que les objets sont indépendants les uns des autres. Les changements d'un objet n'obligent pas à faire tout un tas de changement dans d'autres objets.

L'héritage

On met en place l'héritage afin de factoriser des champs et des méthodes pour plusieurs sous-classes. On créé une sous-classe parce que le comportement de la sous-classe est différent de la super-classe. Si un Instrument est différent d'une guitare, il faut sous-classer Guitare. Par contre, si le comportement d'un Instrument est identique par rapport à une Guitare, il faut penser à ne pas mettre en place l'héritage et ne faire qu'une seule classe.

Classe abstraite

La classe abstraite définit un comportement et les sous-classes implémentent ce comportement.

L'interface

La collection (List, Vector, Map..)

Si vous avez un ensemble de propriétés qui varient selon vos objets, utilisez une collection, une Map par exemple, pour conserver ces propriétés de façon dynamique. Vous enlèverez beaucoup de méthodes de vos classes et vous n'aurez plus à modifier votre code quand les nouvelles propriétés seront ajoutées à votre application. Ceci peut même enlever des notions d'héritages qui semblaient pourtant intéressantes mais au final qui ne le sont pas (Instrument–>Guitare ou Instrument–>Mandoline donne juste Instrument par exemple).

Classe cohésive

Une classe cohésive fait une chose vraiment bien et n'essaie par de faire ou d'être quelque chose d'autre. La cohésion est une raison unique pour qu'une classe change. Un logiciel fortement cohésif est lâchement couplé.

Les méthodes des classes doivent être liées au nom de la classe. Si ce n'est pas le cas, elle est peut-être à déplacer dans une autre classe.

Cas de tests

Conseils importants

Pour un gros projet

Principes de conception

Le principe d'ouverture-fermeture ou OCP (Open-Closed Principle)

L'objectif est de permettre le changement, mais sans avoir à modifier du code existant. Les classes doivent être ouvertes à l'extension et fermées à la modification. Par exemple, la super-classe a une méthode qui n'est pas changeable, par contre les sous-classes peuvent récrire cette même méthode pour l'adapter à un besoin particulier. Autre exemple, si on a plusieurs méthodes privées dans une classe, elle sont fermés à la modification. On peut ajouter des méthodes publiques qui invoquent ces méthodes privées. On étend le comportement des méthodes privées sans les changer.

Le principe de non duplication ou DRY (Don't Repeat Yourself)

Le principe de responsabilité unique ou SRP (Single Responsability Principle)

Chaque objet de votre système ne doit avoir qu'une seule responsabilité et tous les services de cet objet doivent s'efforcer d'assumer cette unique responsabilité. Synonyme : la cohésion. Vous avez implémenté le principe de responsabilité unique correctement si chacun de vos objets n'a qu'une seule raison de changer. Pour analyser le principe de responsabilité unique d'une classe, il faut réaliser le test suivant : Le/la/l' NOMCLASSE NOMMETHODE lui/elle-même.

Cette méthode mémo-technique permet de déceler si une classe respecte le principe de responsabilité unique. Par exemple avec un classe Automobile et les méthodes suivantes :

demarrer(), arreter(), changerPneus(), conduire(), getHuile()

Si on applique le test : L' AUTOMOBILE demarre elle-même. –>oui L' AUTOMOBILE change ses pneus elle-même. –>non …

Attention cette méthode n'est pas infaillible. L'expérience et le bon-sens est de mise.

Le principe de substitution de Liskov ou LSP (Liskov Substitution Principle)

Les sous-types doivent pouvoir être substitués à leurs types de base. Tout le principe de substitution de Liskov tourne autour d'une bonne conception de l'héritage. Quand vous héritez d'une classe de base (Plateau), vous devez pourvoir lui substituer les sous-classes (Plateau3D) de cette classe de base (Plateau) sans que cela tourne à la catastrophe. Sinon, l'utilisation de l'héritage n'est pas bonne. Ici la classe Plateau3D ne peut pas être substituée à Plateau parce qu'aucune des méthodes de Plateau ne fonctionne correctement dans un environnement 3D.

Exemple avec une classe Plateau et une autre Plateau3D qui hérite de Plateau. Plateau avec : getCase(), addUnite(), removeUnite()

Plateau3D avec les mêmes méthodes appliquées à la 3D : getCase(), addUnite(), removeUnite()

Comme elle hérite, en réalité voici ce qu'on obtiens : Plateau3D avec toutes les méthodes : getCase(), getCase(), addUnite(), addUnite(), removeUnite(), removeUnite()

L'héritage et le principe de substitution de Liskov indiquent que toute méthode de Plateau doit pouvoir être utilisée dans Plateau3D ou d'une autre manière que Plateau3D peut remplacer Plateau sans problème. Plateau plateau=new Plateau3D ne pose pas de problème à la compilation mais si on utilise cette instance Plateau3D comme un Plateau c'est la panade.

Si vous voulez utiliser la fonctionnalité d'une autre classe, mais sans changer cette fonctionnalité, pensez à utiliser la délégation plutôt que l'héritage.

Boîte à outils

Exigences

Analyse et conception

Résoudre de gros problèmes

Principes OO

Pratique de la programmation

Approche de développement

Récapitulatif des étapes d'un projet