Programmation orienté objet : Introduction : Les langages de programmation vus jusqu’à présent (C et C++) ne supportent pas la programmation orientée objet contrairement à d’autres langages comme le Java. Un cycle est une succession des étapes à mener à bien pour arriver au terme du projet, la programmation a une position centrale dans un cycle. On va chercher à coder en un minimum de lignes, et prévoir de nombreuses maintenances qui pourront être réalisées par des gens externes au groupe de développement. Maitrise d’ouvrage : Paye les coûts de développement et rédige le cahier des charges Maitre d’œuvre : Groupe ou individu à qui on confie le projet. Cycle de vie en V : Cahier des charges UML Unified Modeling Language Analyse Conception Programmation (Java) Normalement si on a bien travaillé on obtient 17 diagrammes différents, groupés en 3 lots : - Diagrammes structurels - Diagrammes comportementaux - Diagrammes d’interaction Désormais en on ne passera plus par le main, il ne servira qu’à lancer le programme (10 lignes maximum). Le paradigme objet : Un paradigme : Modèle théorique de pensée qui oriente la recherche et la réflexion scientifique. Ensemble cohérent de concepts, utilisés pour une programmation efficace et rapide. Les développeurs peuvent considérer le programme comme une collection d’objets en interaction. Termes en Java : Malloc = new C/C++ Java TAD (=structure) Classe Free (fait automatiquement) Instance d’un TAD Objet Char* = string Fonction Méthode Les procédures sont des fonctions particulières donc ce sont aussi des méthodes. Le langage Java a quelques particularités qui n’existent pas en dans des langages procéduraux. 1. L’encapsulation : Pour expliquer on utilise un exemple, les variables d’une fonction C sont encapsulées dans la fonction (elles ne peuvent pas être appelées hors de la fonction). Le principe est le même mais élargi, on va pouvoir rendre invisible une classe et on va cacher tous ses attributs. On peut trouver dans deux classes différentes des méthodes avec le même nom. 2. Le polymorphisme : A l’intérieur d’une classe on peut avoir la même signature formelle 3. La généricité : Pouvoir réutiliser une classe pour un autre projet (par exemple une grille d’un jeu d’échec pour un jeu de dames) 4. La persistance : Sauvegarder le travail ou la partie, et pouvoir la rouvrir tel quel plus tard. Faisable très facilement en Java (1 ligne). 5. L’héritage : Permet de récupérer les attributs d’une classe et d’en rajouter, par exemple en utilisant une classe pour faire une fenêtre (cadre, boutons en haut à droite, etc) puis en ajoutant d’autres fonctionnalités (menus, etc). Structuration logique : • Toute application est une partition de classes • Chaque classe est la description complète d’une entité fonctionnelle du problème à traiter (TAD en C/C++, TABLE en SQL) • Les entités sont identifiées en phase d’analyse (UML) • Les attributs sont les propriétés de chaque entité (Champs de TAD en C, Colonnes en SQL) • Les méthodes sont les opérations (comportements) de chaque entité décrite (fonctions en C/C++) • Un diagramme de classes UML rassemble et relie entre elles toutes les classes du problème traité Module M213 / Langage Java : • Le mot clé class remplace struct • Introduction spécificateurs de portée (private/public) • Masquage implicite de la définition de type (typedef) • Pas d’accessibilité externe aux champs (private) • Moyens standards de construction (constructeurs) • Allocation dynamique des instances (objets) • Consultation/modification des champs par accesseurs • Encapsulation des fonctions (méthodes) Exemple : TAD Point : C/C++ Java struct Spoint { double abscisse; double ordonnee ; }; typedef struct Spoint point; point creerpoint(double uneAbs, double uneOrd); public class Point { private double abscisse; private double ordonnee; public Point (double uneAbs, double uneOrd) { abscisse= uneAbs; ordonnee= uneOrd; } public double getAbscisse() {return abscisse;} public double getOrdonnee() {return ordonnee;} public String toString() { return "(" + abscisse + " , " + ordonnee + ")" ; } public double distance(Point unB) { double deltaX= abscisse - unB.abscisse; double deltaY= ordonnee - unB.ordonnee; return Math.sqrt(deltaX*deltaX + deltaY*deltaY); } } Constructeur char* toString(point unA); double distance(point unA, point unB); - Toutes les variables sont dans la Pile Tous les objets sont dans le TAS Les ruptures sont marquées par des majuscules Les méthodes sont en minuscules Un constructeur a toujours le nom de la classe Chaque classe décrit toutes les propriétés et toutes les opérations Tous les modèles sont encapsulés (visibilité limitée !) toString : Outil d’aide aux test unitaires (il s’agissait d’une fonction maintenant il s’agit d’une méthode). (Elle produit une forme externe de toutes instances du TAD) Le return est identique au C, les + permettent la concaténation. Ici le toString retournera une chaine de caractères (string) du type "(abscisse , ordonnée)", exemple : (1 , 0.7). distance : public double distance(Point unB), on a juste un seul paramètre. Il y a en réalité deux objets, il s’agit d’un objet dit objet support, il est implicite, c’est sur lui qu’est appliqué la méthode. get : Permet de récupérer les valeurs des attributs (car ils sont privés) set (à la même manière qu’un get) : Permet de modifier les attributs Dans l’exemple ci-dessus, on pourra récupérer l’abscisse ou l’ordonnée mais les modifier. En Java, il n’y a pas de compilation « séparé » (pas de prototypes), Java compile chaque classe séparément et en totalité. Le main est une méthode comme une autre, placée dans une ou plusieurs classes choisies par le développeur (il faudra alors préciser laquelle lancer). Le cas des constructeurs : - Pas de mention du retour (ni type, ni void) JavaBeans - Constructeur par défaut (sans paramètres), il est obligatoire d’après les règles de codage - Constructeurs normaux (signatures différentes) - Possibilité d’invoquer un constructeur dans le corps de la définition d’un autre constructeur Exemple pour un objet de la classe Point : public Point() { Valeurs par défaut, abscisse= 0.; Constructeur par défaut précisées dans le ordonnee= 0.; constructeurs } public Point(double x, double y) { abscisse= x; Constructeur normal ordonnee= y; } - Mot clé new pour invoquer un constructeur Exemple pour un objet de la classe Point : Point p0= new Point(); Point p1= new Point(1.5, -2.7); Appeler une méthode : Opérateur d’application - support.méthode(); Objet implicite - Avec plusieurs supports : p1.p2.méthode(); Avec plusieurs paramètres p1.méthode(p2,p3); Chaine de production de programme : En C : fichier Fait disparaitre et traite les # (les directives) point.c Editeur de texte Programmeur Préprocesseur (lint) Compilateur (gcc) Papiers où sont écris de la programmation C Editeur de liens (links) Le chargeur (loader) point.obj (.o pour linux) Fichier contenant du binaire translatable (Ce fichier ne se produit pas s’il y a des erreurs de compilation) point.exe Utilise les .obj et les bibliothèques (.lib sous Windows et .a sous Linux/CodeBlocs) Système d’Exploitation Processus (le chargeur, l’ordonnanceur (gestionnaire de tâches), le filemanager, l’allocateur mémoire,…) Applications TAS Piles En Java : Editeur de texte Programmeur Compilateur (javac) Programmation Java P majuscule obligatoire car c’est une classe JVM : Java Virtuel Machine (java) Processus qui lit ligne par ligne le P code et l’exécute Point.java En byte code (ou code intermédiaire ou encore P code) Point.class JavaDoc : Permet de faire des balises avec un éditeur de texte (comme bloc-notes par exemple), à la manière de l’HTML. Elle commence toujours par des « @ », exemple : @author Alain Thuaire - Universite de Nice/IUT - Departement informatique @version 1.0.0 : version initiale Lorsqu’on suit ce « chemin » de production on utilise l’invite de commande windows, en appelant le compilateur avec comme argument « –help » on peut voir qu’il existe de nombreuses options qui ne sont pas gérées par les IDE. (exemple : matches qui permet de gérer des expression régulières comme avec un grep). Rappel : ls (linux) dir (windows)