II. Principes généraux Instanciation Éléments de vocabulaire (rappel) Identificateur : c'est un mot significatif d'un programme. Certains identificateurs sont prédéfinis pour un langage donné (par exemple, en java : int, println, class, ) et d'autres sont définis (déclarés) par un programmeur. Déclaration d'un identificateur : c'est l'association entre un type et un identificateur choisi par le programmeur qui est alors défini. En java, le type précède l'identificateur. Paramètres effectifs (arguments) d'une fonction : ce sont les arguments de la fonction lors de son appel. Par exemple, dans l'appel : System.out.println("le résultat est "+res); le paramètre effectif de println est l'expression «"le résultat est "+res» qui est de type String. De même, dans l'appel : echange(i,j,t); de la fonction echange dont le rôle est d'échanger les contenus des cases d'indices i et j dans le tableau de décimaux t, les paramètres effectifs sont les expressions limitées aux variables i, j et t. Paramètres formels d'une fonction : ce sont les variables qui permettront de recevoir les paramètres effectifs de la fonction lors de son appel. Il faut un paramètre formel pour chaque donnée utile lors de l'exécution de la fonction. Par exemple, en java, pour les fonctions vues précédemment, on pourrait avoir respectivement : et : println(string S) S est le seul paramètre formel de println. echange(int a,int b,double[] t) les paramètres formels ont des noms propres à la fonction, indépendants de ceux des paramètres effectifs. Type de retour d'une fonction : c'est le type de la valeur renvoyée par la fonction. Il peut être vu comme la déclaration de l'identificateur qui représente le nom de la fonction et le précède donc. Il vaut void si la fonction ne renvoie rien (ne comporte pas d'instruction return). Signature (ou en-tête) d'une fonction : c'est la ligne importante à connaître pour l'utilisateur de la fonction car elle donne le «mode d'emploi» de la fonction (le nom, les paramètres d'entrée et le type de sortie). Elle est formée de la déclaration de l'identificateur de la fonction suivie, entre parenthèses, par la liste de ses paramètres formels séparés par des virgules. Par exemple, en java : void println(string s) demande une chaîne et ne renvoie rien, double random() ne demande rien et fournit un décimal, void echange(int a, int b, double[] t) nécessite deux entiers ainsi que la référence à un tableau d'entiers et ne renvoie rien. PAGE 1 SUR 7
Éléments de cours : vision intensive ou extensive d'une classe Les propriétés des objets sont complètement spécifiées : tous les attributs d un objet ont une valeur. Plusieurs objets de même catégorie peuvent avoir les mêmes attributs (la même structure de description) avec des valeurs différentes. void int valeur void Chrono void int pas valeur : 4 valeur : 10 valeur : 0 Chrono 3 Chrono 6 Chrono 5 pas : 2 pas : 1 Chrono 1 pas : 1 valeur : 201 Chrono 4 valeur : 201 Chrono 2 pas : 3 pas : 1 définition intensive valeur : 1036 pas : 2 (partie de la) définition extensive Définitions d'une classe. La description d'une classe regroupe des propriétés qui peuvent être vues comme des contraintes à respecter ; c'est la définition intensive de la classe exprimée ici dans un formalisme proche de java. Les objets qui respectent ces contraintes sont des instances de la classe. L'ensemble des instances d'une classe est la définition extensive de la classe. Le lien entre chaque instance et la classe est appelé lien. Dans un langage objet (orientée objet), ce ne sont pas les objets qui sont décrits mais les classes, qui sont les catégories abstraites auxquelles appartiennent les objets de structures de description identiques 1. Les objets appartenant à une classe sont dits des instances de la classe, dès lors qu elles la spécifient totalement 2. Une classe peut être vue de deux manières : 1. Vision intensive (description). Une classe est un modèle ou schéma (frame) pour des objets (les instances). La classe est alors définie par sa description, c est-à-dire l ensemble des contraintes posées sur la description de ces objets. Cet ensemble de contraintes est la définition intensive ou intension de la classe. En java, cette définition est la description de la classe, qui contient tout ce que définit le programmeur. Elle comprend l ensemble des attributs et des méthodes qui seront partagés par les instances. La description de l'instance doit alors s'unifier avec celle de void void void Chrono Chrono 1 int valeur int pas valeur : 0 pas : 1 1 Dans un langage quelconque, un programme est toujours abstrait. Les données sont fournies au cours de l utilisation du programme. Dans un langage objet, les données seront les valeurs des attributs des instances et des valeurs supplémentaires apportées par l utilisateur. 2 «instance» est un anglicisme. En anglais, une instance d une entité générique abstraite est un exemple, une occurrence de cette entité, c est-à-dire une entité spécifique, précise, qui satisfait aux contraintes posées sur l entité générique. PAGE 2 SUR 7
la classe, c'est-à-dire que, à chaque propriété de l'instance : un couple attribut-valeur, doit correspondre un couple attribut-type dans la description de la classe, tel que les noms des attributs soient les mêmes et que la valeur corresponde au type. Voir ci-dessus. 2. Vision extensive (population). La classe est aussi définie par l ensemble non délimité d objets qui respectent la définition intensive de la classe. Cet ensemble est dit définition extensive ou extension de la classe. Le lien entre une instance I et une classe C à laquelle elle appartient est le lien. On dit que I C (dans l'exemple pour chaque i, chrono i Chrono). Il est représenté par une flèche de l'instance à la classe (Ce sont les flèches qui figurent dans la figure précédente). Application en java Description d'une classe Voilà un exemple de description de classes : class Disque { Point centre; double rayon; double getperimetre() { return 2*Math.PI*this.rayon; } double getsurface() { return Math.PI*this.rayon*this.rayon; } // modifie la taille du cercle d'un facteur donné void echelle(double facteur) { rayon=this.rayon*facteur; } } Disque.java définition d'attributs définition de méthodes class Point Point.java { double absc,ord; } Description d'une classe. La définition de chaque membre (attribut ou méthode) passe par l'association d'un identificateur à un type (déclaration). Le type peut être un type de base (int, double, char ) ou le nom d'une classe. Pour un attribut, le type représente le domaine (de valeurs) de l'attribut, c'est-à-dire l'ensemble de ses valeurs possibles (son domaine de définition). Pour une méthode, comme pour une fonction, le type est celui de la donnée qu'elle renvoie (void si aucune donnée n'est renvoyée.). Éléments importants sur la description des classes en java noms de la classe et du fichier qui la contient. Le fichier qui contient une classe doit être nommé comme cette classe en ajoutant l'extension java. Dans l'exemple ci-dessus, les fichiers contenant les classes Disque et Point sont respectivement stockées dans des fichiers Disque.java et Point.java. À noter que cette contrainte est invisible dans l'environnement BlueJ qui prend en charge la gestion des fichiers sans que l'utilisateur ait à faire un quelconque choix. portée 1 des membres. Les identificateurs des membres sont utilisables dans toute la classe, quel que soit l'ordre dans lequel ils sont déclarés. Il est donc possible d'intercaler les définitions d'attributs et de méthodes ou d'utiliser un membre dans une partie de la description de la classe qui précède sa définition (voir ci-contre). paramètres formels des méthodes. Comme pour les fonctions, il ne faut mettre en paramètre formel d'une class Disque { Point centre; double getperimetre() { return 2*Math.PI*rayon; } double rayon; 1 La portée ou visibilité d'un identificateur est la zone où il est connu, donc utilisable. PAGE 3 SUR 7
méthode que les données nécessaire à son fonctionnement. De ce fait, dans les exemples ci-dessus, la plupart des méthodes ne nécessitent pas de paramètre car elle utilisent uniquement les attributs. La méthode echelle est un cas particulier dès lors qu'elle nécessite la donnée d'un facteur d'échelle qui ne figure pas dans la classe. Les paramètres formels des méthodes ne comportent donc que les informations nécessaires qui sont extérieures à la classe et doivent être fournies par l'utilisateur de la méthode. Instanciation d'une classe Une fois qu'une classe a été compilée avec succès, il est possible de créer des instances de cette classe. L'instruction de création est new. Elle permet de réserver de la mémoire pour stocker le nouvel objet et renvoie l'adresse du début de la zone allouée. Dans le cadre de l'exemple précédent, en java, on peut avoir par exemple la suite d'instructions suivantes : Point p1=new Point(); p1.absc=1;p1.ord=1; Disque d=new Disque(); d.rayon=1; d.centre=p1; création d'une nouvelle instance de la classe Point affectation des abscisses et ordonnées du nouveau point création d'un nouveau disque affectation du rayon du nouveau disque affectation au centre du point créé. Utilisation d'une instance. La création d'une instance en java se fait toujours grâce à l'instruction new sauf pour certains objets particuliers, les String et les tableaux, dont les instances peuvent directement être écrites avec une syntaxe particulière. Par ailleurs, nous verrons qu'il est possible de spécifier des paramètres à la création d'une instance (nous pourrions par exemple avoir «new Point(1,1)» en spécifiant directement les abscisse et ordonnée initiales du nouveau point). Pour ce faire, nous utiliserons la notion de constructeur qui sera introduite plus tard. Exercices Faites un compte-rendu en format numérique qui contient vos réponses aux questions posées. Vous n'êtes pas tenu de le faire dans une seule séance mais n'en passez pas plus de deux. Ne faites pas tout si vous n'avez pas le temps ; privilégiez la qualité à la quantité. Une fois ce compte-rendu rédigé, envoyez-le moi (joel.savelli@u-bourgogne.fr) en n'oubliant pas de spécifier LPSIL et CI3 dans l'objet du message (n'oubliez pas non plus d'écrire votre nom dans le document). Exercice 1. Manipulation de BlueJ Utilisez BlueJ pour construire dans un même projet Geom les classes Disque et Point données plus haut en exemple (Description d'une classe). classe Main Pour utiliser les classes ainsi créées, il est possible de définir une classe (par exemple une classe Main) comportant une méthode main comme celle vue à la première séance. Le corps de cette méthode peut contenir un code comme celui de la figure précédente (Utilisation d'une instance). 1. En utilisant le menu contextuel associé à l'icone de la classe Disque, tentez d'exécuter les méthodes getsurface, getperimetre et echelle. Que se passe t-il? (ou plutôt que ne se passe t-il pas?). Expliquez cette situation. Si vous n'y parvenez pas, demandez de l'aide. 2. Écrivez dans un fonction main d'une classe Main le code qui permet de représenter la situation de la figure «Définition d'objets à partir d'autres objets» de la fiche «II. Principes généraux ; encapsulation (base)». Testez ce code en lançant la fonction Main.main("") à l'aide de la souris. 3. En utilisant aussi la souris, exécutez directement la méthode new associée à une classe pour créer une instance de cette classe. La machine propose PAGE 4 SUR 7
un nom, modifiable pour l'instance (en fait, les instances n'ont pas de nom ; il s'agit plutôt d'une variable qui référence l'instance). Créez ainsi une instance de Point et de Disque. Remarquez la zone de l'interface BlueJ (zone de dépôt d'objets) dans laquelle les icones de ces instances apparaissent (en bas à droite de la page précédente). Faites afficher les contenus de ces instances en cliquant sur leur icone. 4. Dans cette situation, tentez d'exécuter à nouveau les méthodes getsurface, getperimetre et echelle. Déduisez-en le contexte dans lequel ces méthodes peuvent être exécutées. Expliquez pourquoi. Demandez de l'aide si vous n'y parvenez pas. Code Pad (partie qui n'a pas à figurer dans le compte-rendu) Le «Code Pad» est une zone qui figure en bas à droite de l'interface de BlueJ. Elle permet d'évaluer des expressions et d'exécuter des lignes de code sans compilation. Plus précisément, il est possible d'effectuer les actions suivantes : 1. Évaluer une expression java ; ci-contre une expression numérique). Faites quelques essais de calcul numérique y compris mettant en jeu des fonctions sophistiquées (par exemple : Math.sin(Math.PI/2) ou Math.random()). Notez qu'il n'y a pas de «;» à placer en fin de ligne dès lors que c'est une expression que l'on calcule et pas une instruction que l'on exécute (le «;» est un terminateur d'instruction). Code Pad 2. Il est aussi possible de calculer des expressions mettant en jeu des objets et des classes. Par exemple, dans l'exemple ci-contre l'évaluation de l'expression : new Point() renvoie une valeur qui est l'adresse de l'instance de la classe Point créée. Le Code Pad n'affiche pas cette adresse mais plutôt la référence à cette instance représentée par une icône (en tout petit à droite). Il est alors possible de faire glisser cette icône dans la zone de dépôt d'objets et d'utiliser le menu contextuel de l'icone de l'instance pour lancer ses méthodes. Faites des essais de création d'instances et d'exécution de leurs méthodes par cette méthode. En utilisant cette technique, tentez de réaliser l'équivalent de la suite d'instructions de l'encadré «u- tilisation d'une instance». Notez que les affectations des valeurs aux attributs des instances sont des instructions et qu'elles doivent être suivies d'un «;». Notez aussi que les instances qui apparaissent dans la zone de dépôt d'objet peuvent être référencées dans le Code Pad par le nom que vous leur avez donné. Exercice 2. Plusieurs exemples En utilisant le modèle de l'exemple «Description d'une classe» et votre travail du TD précédent, utilisez BlueJ pour construire complètement (avec le corps des méthodes) les classes relatives aux situations suivantes. Vous devez faire un projet par situation, qui peut contenir une ou plusieurs classes suivant les besoins. Compilez les classes au fur et à mesure. En utilisant soit une classe Main, soit le Code Pad et la zone de dépôt d'objets, faites des essais d'exécution que vous intégrerez à votre compte-rendu. une planète. Les méthodes doivent permettre de donner les caractéristiques d'une planète et de les restituer globalement. PAGE 5 SUR 7
une personne, une calculatrice. Elle doit comporter un attribut représentant l'affichage, les méthodes qui permettent d'entrer les données, de faire les calculs et celle qui restitue le contenu de l'affichage. un automate distributeur de boissons. On doit pouvoir entrer des pièces de divers montants (avec vérification que le montant en question correspond à une valeur réelle). Il doit pouvoir être possible de choisir sa boisson, de signaler si la somme d'argent introduite est insuffisante, de signaler sinon que la boisson a été distribuée, et d'afficher le crédit restant. un parking (on s'intéresse à la gestion du parking). une bibliothèque (on s'intéresse à la gestion des livres qu'elle contient), une date. Vous devez au moins construire les méthodes qui vérifient que : l'année de la date est ou non bissextile (il ne faut pas afficher le résultat mais renvoyer une valeur booléenne). Vous pouvez vous documenter sur internet pour savoir comment faire. la date est valide. Critiques Comme précédemment, indiquez dans votre compte-rendu ce qui vous paraît incorrect, incomplet ou simplement surprenant dans la partie de cours abordée dans ce TD. Indiquez là aussi ce que vous trouvez peu clair. Pour aller plus loin. Bonne représentation Il peut y avoir des difficultés pour choisir de représenter telle ou telle propriété ou notion et de telle ou telle manière. Voilà quelques exemples de problèmes de représentation qui peuvent subvenir : 1. Attribut ou méthode? Dans l'exemple ci-dessus «Description d'une classe», le choix a été de faire apparaître les notions de centre et de rayon sous forme d'attributs et la surface sous forme de méthode. Pourtant, ce sont trois éléments qui définissent l'état d'un disque et pas son comportement. La raison en est qu'il est suffisant de définir un disque par son centre et son rayon ; ce sont ses propriétés essentielles. Les autres propriétés peuvent être dérivées à partir de ces propriétés de base et doivent même l'être (tout ce qui peut être automatisé doit l'être). La méthode d'accès à la surface n'est pas un comportement de l'objet mais bien une fonction qui lui est applicable. Par ailleurs, dans la suite du cours, tous les accès aux informations sur les objets se feront grâce à des méthodes particulières appelées accesseurs. Pour l'utilisateur, il n'y aura alors plus de différence visible entre les attributs essentiels et dérivables. 2. Limites de la représentation. Dans un cadre informatique, comme dans celui de n'importe quelle modélisation, il ne s'agit pas de représenter exhaustivement le réel. La représentation formelle (modèle) que représente la description d'une classe est effectuée dans des perspectives précises. L'étendue de la représentation doit être limitée par ces perspectives. Par exemple, s'il s'agit de gérer un parking uniquement pour connaître le nombre de places disponibles pour de nouveaux entrants, il est inutile de prévoir la description des voitures contenues dans le parking. Le nombre de voitures est une donnée suffisante. 3. Représentation ou gestion. Une classe ou une instance a deux fonctions : représenter un objet réel (qui peut être abstrait). La classe ou l'instance comprend alors des attributs ou méthodes qui correspondent à des propriétés de l'objet réel. Par exemple, un PAGE 6 SUR 7
disque comprend des attributs pour représenter son centre et son rayon et des méthodes pour calculer son périmètre et sa surface. gérer l'objet informatique. La création d'une instance, l'affichage de ses propriétés, l'accès à ses attributs, sont des fonctions d'une classe ou d'une instance qui n'ont pas de sens dans la réalité, mais elles sont nécessaires pour que le programme fonctionne. Il est nécessaire d'ajouter des attributs ou des méthodes pour répondre à ces besoins mais il est nécessaire de bien les distinguer des attributs ou méthodes de représentation. PAGE 7 SUR 7