1 une appli bien conçue qui assure Un bon logiciel commence ici J’ai du mal à m’en remettre, Solange, mais depuis que j’ai commencé à utiliser ACOO, je me sens un autre homme... un autre homme, crois-moi ! Alors comment écrit-on vraiment un bon logiciel ? Il n’est jamais facile de décider par où commencer. Est-ce que l’application fait effectivement ce qu’elle est censée faire ? Et que dire du code dupliqué ? Est-ce mauvais signe ? Il est toujours difficile de choisir sur quoi travailler en premier, tout en s’assurant de ne pas compromettre le reste de l’opération. Mais pas de souci. Quand vous aurez fini ce chapitre, vous saurez comment écrire un bon logiciel et vous aurez fait un grand pas en avant pour améliorer définitivement le développement de vos applications. Pour finir, vous comprendrez pourquoi vous avez tout intérêt à connaître l’ACOO. voici un nouveau chapitre le son du bois et des cordes Le Rock’n’roll, c’est pour la vie ! Il n’y a rien de mieux que le son d’une guitare de rêve dans les mains d’un grand musicien. Les Guitares d’Éric est le magasin tout indiqué pour trouver l’instrument idéal quand on est connaisseur. Nous vous proposons un choix hallucinant. Entrez, ditesnous quel genre de guitare vous aimez et nous vous trouverons l’instrument parfait, c’est garanti ! guitare Voici Éric, aficionado de lasin de ga ma n et propriétaire d’u guitares haut de gamme. Il y a tout juste quelques mois, Éric a décidé de se débarrasser de son vieux système de gestion sur papier et de commencer à utiliser un système informatique pour faire son inventaire. Il a contacté une entreprise de programmation renommée, Codage Pur et Dur. Ils lui ont créé une application de gestion d’inventaire. L’entreprise lui a même fabriqué un nouvel outil de recherche pour l’aider à trouver l’instrument idéal pour chaque client. chapitre 1 une application bien conçue qui assure La toute nouvelle application d’Éric... Voici l’application que l’entreprise de programmation a créée. Ils ont élaboré un système pour remplacer toutes les notes écrites par Éric et l’aider à associer un client à une guitare idéale. Voici le diagramme de classe UML qu’ils ont donné à Éric pour lui montrer ce qu’ils ont fait : Voici l’inventaire complet d’Éric, ainsi qu’un moyen de chercher des guitares. Chaque guitare de est l’inventaire d’Éric e représentée par un classe. instance de cette Inventaire Guitare Voici les variables de la classe Guitare. Ce sont les méthodes pour la classe Guitare. numSerie : String prix : double fabricant : String modele : String type : String boisFond : String boisTable : String getNumSerie() : String getPrix() : double setPrix(float) getFabricant() : String getModele() : String getType() : String getBoisFond() : String getBoisTable() : String L’inventaire conserve uneres liste de toutes les guita qu’Éric a à disposition. guitares : List addGuitare(String, double, String, String, String, String, String) getGuitare(String) : Guitare chercher(Guitare) : Guitare Cette méthode rentre tous e od le th s détails mé e tt Ce prend le numéro de elC’est la méthode de recherche ; d’une guitare, série d’une guitare cl le prend la guitare idéale d’un crée un objet et renvoie l’objet l’i ient et renvoie une guitare de Guitare et de cette guitare. aunventaire d’Éric qui correspond l’ajoute à x critères du client l’inventaire . d’Éric. les attributs qui Éric a décidé qugue itare sont : le numéro de définissent une fabricant et le modèle, le Nous avons une petite série, le prix, lee ou électrique) et les bois surprise à votre attention dans l’Annexe B. Je type (acoustiqu guitare. un œil avant de contteinuz-y utilisés pour la l’UML ou la programmater si OO sont nouveaux pour ion vous. Nouveau à Objectville ? m phis mor Pol y ge a Hérit n sulatio Encap Si vous découvrez la programmation orientée objet, et que vous n’avez jamais entendu parler d’UML, ou si vous vous posez des questions sur le diagramme ci-dessus, ne vous en faites pas ! Nous avons préparé un petit dossier spécial « Bienvenue à Objectville » pour vous aider à commencer. Rendez-vous à la fin du livre et lisez l’Annexe B, vous ne le regretterez pas. Puis revenez à cette page et tout sera beaucoup plus clair pour vous. vous êtes ici 4 le début du code de l’application d’Éric Voici ce à quoi ressemble le code de Guitare.java Vous avez vu le diagramme de classe pour l’application d’Éric à la page précédente ; regardons maintenant à quoi ressemble concrètement le code de Guitare.java et Inventaire.java. public class Guitare { Ce sont toutes propriétés que noles avons vues dans leus diagramme de pour la classe Gcluiasse tare. private String numSerie, fabricant, modele, type, boisFond, boisTable; private double prix; public Guitare(String numSerie, double prix, String fabricant, String modele, String type, String boisFond, String boisTable) { this.numSerie = numSerie; this.prix = prix; Les diagrammes de classes UML ne this.fabricant = fabricant; montrent pas les constructeurs ; le this.modele = modele; constructeur de Guitare ne fait this.type = type; cependant rien d’exceptionnel : il met this.boisFond = boisFond; en place toutes les propriétés initiales this.boisTable = boisTable; pour une nouvelle Guitare. } public String getNumSerie() { return numSerie; } public double getPrix() { return prix; } public void setPrix(float nouveauPrix) { this.prix = nouveauPrix; Vous pouvez voir } public String getFabricant() { que le diagramme de return fabricant; classe correspond } bien aux méthodes public String getModele() { du code de la classe return modele; Guitare. } public String getType() { return type; } public String getBoisFond() { return boisFond; } public String getBoisTable() { return boisTable; } chapitre 1 Guitare numSerie : String prix : double fabricant : String modele : String type : String boisFond : String boisTable : String getNumSerie() : String getPrix() : double setPrix(float) getFabricant() : String getModele() : String getType() : String class getBoisFond() : String{Guitare getBoisTable() : String Guitare() } Guitare.java une appli bien conçue qui assure Et Inventaire.java... public class Inventaire { private List guitares; les Attention, nous avons retnirépour déclarations d’importatio économiser de l’espace. public Inventaire() { guitares = new linkedList(); } public void addGuitare(String numSerie, double prix, String fabricant, String modele, String type, String boisFond, String boisTable) { Guitare guitare = new Guitare(numSerie, prix, fabricant, modele, type, boisFond, boisTable); addGuitare() réunit guitares.add(guitare); tous les attributs requ } is po ur public Guitare getGuitare(String numSerie) { créer une nouvelle in st an for (Iterator i = guitares.iterator(); i.hasNext(); ) { ce de Guitare, la crée Guitare guitare = (Guitare)i.next(); et l’ajoute à l’inventa if (guitare.getNumSerie().equals(numSerie)) { ire. return guitare; } } return null; } public Guitare chercher(Guitare chercherGuitare) { méthode est un peu en for (Iterator i = guitares.iterator(); i.hasNext(); ) { Cette fouillis... Elle compare chaquedans Guitare guitare = (Guitare)i.next(); // Ignore le numéro de série puisqu’il est unique attribut de l’objet Guitare et // Ignore le prix puisqu’il est unique lequel elle passe à chaque obj ric. String fabricant = chercherGuitare.getFabricant(); Guitare dans l’inventaire d’É if ((fabricant != null) && (!fabricant.equals(“”)) && (!fabricant.equals(guitare.getFabricant()))) continue; String modele = chercherGuitare.getModele(); if ((modele != null) && (!modele.equals(“”)) && (!modele.equals(guitare.getModele()))) continue; String type = chercherGuitare.getType(); if ((type != null) && (!chercherGuitare.equals(“”)) && (!type.equals(guitare.getType()))) continue; String boisFond = chercherGuitare.getBoisFond(); Inventaire if ((boisFond != null) && (!boisFond.equals(“”)) && guitares : List (!boisFond.equals(guitare.getBoisFond()))) continue; addGuitare(String, double, String, String boisTable = chercherGuitare.getBoisTable(); String, String, String, String) if ((boisTable != null) && (!boisTable.equals(“”)) && getGuitare(String) : Guitare (!boisTable.equals(guitare.getBoisTable()))) class continue; chercher(Guitare) : Guitare Inven{ taire } cherreturn null; cher() } } Inventaire.java vous êtes ici 4 le cas de la guitare manquante Mais c’est là qu’Éric a commencé à perdre des clients... On dirait que peu importe qui est le client et ce qu’il aime, le nouveau programme de recherche ne parvient presque jamais à trouver une guitare qui correspond. Pourtant Éric sait qu’il a les guitares que ses clients désirent... alors que se passe-t-il ? TrouverGuitareTest.jav maintenant un jour ordia simule naire pour Éric... un client entr dit ce qu’il veut et Éric e, lui cherche dans son inventaire. public class TrouverGuitareTest { public static void main(String[] args) { // Dresse l’inventaire des Guitares d’Éric Inventaire inventaire = new Inventaire(); initialiserInventaire(inventaire); Irène cherche une guitare Fender lne. « Strat » en au Guitare prefIrene = new Guitare(“”, 0, “fender”, “Stratocaster”, “électrique”, “aulne”, “aulne”); Guitare guitare = inventaire.chercher(prefIrene); if (guitare != null) { System.out.println(“Irène,peut-être aimerez-vous cette guitare” + guitare.getFabricant() + “ ” + guitare.getModele() + “ ” guitare.getType() + “ en :\n ” + guitare.getBoisFond() + “ pour le corps,\n ” + guitare.getBoisTable() + “ pour la table.\n Elle est à vous pour seulement ” + guitare.getPrix() + “ € !”); } else { System.out.println(“Désolé, Irène, nous n’avons rien pour vous.”); } } private static void initialiserInventaire(Inventaire inventaire) { // Ajoute des guitares dans l’inventaire... class } ChercherGui} tare { } main() TrouverGuitareTest.java Fichier Édition Fenêtre Aide C7#5 %java TrouverGuitareTest Désolé, Irène, nous n’avons rien pour vous. and Irène Voilà ce qui se passesinqud’Éric et qu’il entre dans le maga r une guitare. essaie de lui trouve chapitre 1 Je suis navrée Éric, mais il ne me reste plus qu’à aller dans l’autre magasin, à l’autre bout de la ville. une appli bien conçue qui assure Pourtant je sais que j’ai une magnifique guitare Fender Strat. Tenez, la voilà : inventaire.addGuitare(“V95693”, 1499.95, “Fender”, “Stratocaster”, “électrique”, “aulne”, “aulne”); Voici un morceau du code qui dresse l’inventaire d’Éric. Vous voyez qu’il a une guitare parfaite pour Irène. À vos crayons Ces critères semblent correspondre exactement à ce qu’a demandé Irène... alors que se passe-t-il ? Comment changer l’application d’Éric ? Regardez bien les trois dernières pages, avec le code de l’application d’Éric et les résultats que l’on obtient lors d’une recherche. Quels problèmes voyez-vous ? Qu’est-ce que vous changeriez ? Écrivez ci-dessous la PREMIÈRE chose que vous feriez pour améliorer l’application d’Éric avant de tourner la page. vous êtes ici 4 comment écrire un bon logiciel ? Quelle est la PREMIÈRE chose que vous changeriez ? Il est évident que l’application d’Éric a des problèmes, mais il est plus difficile de décider par où commencer pour la modifier. Et il semble que les opinions ne manquent pas : Regardez toutes ces chaînes ! C’est abominable... On ne pourrait pas utiliser des constantes ou des objets à la place ? Whoa... ces notes du propriétaire disent qu’il veut que ses clients aient un large choix. Est-ce que la méthode chercher() ne devrait pas renvoyer une liste de correspondances ? Guitare numSerie : String prix : double fabricant : String modele : String type : String boisFond : String boisTable : String getNumSerie() : String getPrix() : double setPrix(float) getFabricant() : String getModele() : String getType() : String getBoisFond() : String getBoisTable() : String nt Jacques est relativeme mmation, ra og pr la nouveau dans isan mais c’est un fervent .part du code orienté objet François est dans le coin depuis un bail et il connaît vraiment bie n OO et ses modèles de conc ses principes eption. chapitre 1 Inventaire guitares : List addGuitare(String, double, String, String, String, String, String) getGuitare(String) : Guitare chercher(Guitare) : Guitare Ce modèle est une catastrophe ! Les classes Inventaire et Guitare dépendent trop l’une de l’autre et je ne vois pas comment on pourrait construire quoi que ce soit sur cette architecture. Il faut restructurer. on de Julie a la réputatiac tement ex r toujours livre ce que veut le client. Que feriez-vous en premier ? une appli bien conçue qui assure Comment suis-je censé savoir par où commencer ? J’ai l’impression qu’à chaque nouveau projet, tout le monde a une opinion différente sur ce que l’on doit faire en premier. Parfois j’y arrive, parfois je finis par retravailler toute l’application parce que j’ai commencé au mauvais endroit. Je veux juste écrire un bon logiciel ! Alors qu’est-ce que je dois faire pour l’application d’Éric ? Comment est-ce qu’on écrit un bon logiciel à tous les coups ? vous êtes ici 4 qu’est-ce que cela veut dire un bon logiciel ? Attendez une seconde... Je ne voudrais pas vous interrompre, mais qu’est-ce ça veut dire « un bon logiciel » ? C’est pas le genre de terme vague qu’on lance un peu en l’air ? Bonne question... et il y a beaucoup de réponses différentes : Le programmeur « orienté client » dit : « Un bon logiciel fait toujours ce que le client veut. De sorte que même si les clients pensent à de nouvelles façons de l’utiliser, il ne plante pas ou ne donne pas de résultats inattendus. » Le programmeur orienté objet dit : Guitare numSerie: String prix: double pref: PrefGuitare getNumSerie(): String getPrix(): double setPrix(float) getPref(): PrefGuitare Inventaire PrefGuitare fabricant: Fabricant modele: String type: Type boisFond: Bois boisTable: Bois guitares: Guitare [*] addGuitare(String, double, Fabricant, String, Type, Bois, Bois) getGuitare(String): Guitare chercher(PrefGuitare): Guitare [*] getFabricant(): Fabricant getModele(): String getType(): Type getBoisFond(): Bois getBoisTable(): Bois Fabricant toString(): String Type toString(): String Bois toString(): String Les bons programmeurs OO cherchent toujours à rendre leur code plus souple. Vous n’êtes pas certainiede? ce que tout cela signif vous Ne vous en faites pas... choses apprendrez toutes ces nts. dans les chapitres suiva 0 chapitre 1 Cette approche à cherche uniquementient s’assurer que le cl que est content de ce n. fait son applicatio « Un bon logiciel, c’est du code orienté objet. Donc il n’y a pas beaucoup de code dupliqué, et chaque objet contrôle à peu près son propre comportement. C’est aussi plus extensible parce que votre structure est vraiment solide et souple. » Cette approche ce sur la conception opnttirée le code pour l’extensiomise et la réutilisation et n avantage des modèles tire de conception et techniques OO étabdelies s. Le programmeur gourou de la conception dit : « Un bon logiciel, c’est quand vous utilisez des modèles et des principes de conception testés et approuvés. Vous avez gardé vos objets couplés lâchement et votre code ouvert à l’extension, mais fermé à la modification. Cela aide aussi à rendre le code plus recyclable, donc vous n’avez pas à tout retravailler pour réutiliser des parties de votre application. »