PROGRAMME EN LANGAGE OBJET Collection de classes qui « se répartissent » les opérations à effectuer PROGRAMME EN LANGAGE OBJET pour programmer en langage objet, il faut décrire une ou plusieurs classes un programme est un ensemble de descriptions de classes. Il comprend (au moins) une classe principale : classe « d’amorce » qui permet le lancement du programme lorsque l’utilisateur exécute le programme, c’est une méthode de cette classe qui est lancée cette méthode crée des instances des autres classes du programme et leur « passe la main » pour faire les calculs ! en java, c’est la méthode main : public static void main(String[] args){…} PROGRAMME EN JAVA En java, les ensemble de classes regroupées en un package Le source de chaque classe contient en première ligne le nom du package (en minuscules) dans lequel elle s'inscrit ! package <nom package> PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } package p; class C1 { Variables et méthodes void m1(…) { C3 troisieme=new C3(); } C1(…) { m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Regroupement logique : chaque fichier référence le package PROGRAMME EN JAVA un fichier par classe Son nom est celui de la classe avec l'extension .java les fichiers des classes sont regroupées dans un dossier dont le nom correspond à celui du package ! coursjava/programme/exemples pour coursjava.programme.exemples PROGRAMME EN JAVA coursjava programme exemples coursjava.programme.exemples package p; public class C1 { package p; void M1() { System.out.println("Lancement de M1"); C3 Troisième=new C3(); } public C1() { System.out.println("Création d'une instance de C1"); M1(); } public class C1 { void M1() { System.out.println("Lancement de M1"); C3 Troisième=new C3(); } public C1() { System.out.println("Création d'une instance de C1"); M1(); } package p; public class C1 { void M1() { System.out.println("Lancement de M1"); C3 Troisième=new C3(); } public C1() { System.out.println("Création d'une instance de C1"); M1(); } } } ex1.java ex2.java } ex3.java package p; package p; public class C1 { public class C1 { void M1() { System.out.println("Lancement de M1"); C3 Troisième=new C3(); } public C1() { System.out.println("Création d'une instance de C1"); M1(); } void M1() { System.out.println("Lancement de M1"); C3 Troisième=new C3(); } public C1() { System.out.println("Création d'une instance de C1"); M1(); } } } ex4.java ex6.java Regroupement physique PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } package p; class C1 { Variables et méthodes void m1(…) { C3 troisieme=new C3(); } C1(…) { m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Lancement de classe principale via sa méthode main PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Création d’une instance de C1 PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Lancement du constructeur de l’instance PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Exécution de la méthode m1 invoquée dans le constructeur PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } troisieme package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C3 variables et méthodes C3(…){…} { }Variables et méthodes C3(…){…} } Création d’une instance de C3 PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } troisieme package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C3 variables et méthodes C3(…){…} { }Variables et méthodes C3(…){…} } Exécution du constructeur de l’instance créée PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } troisieme package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C3 variables et méthodes C3(…){…} { }Variables et méthodes C3(…){…} } Création d’une instance de C1 PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } troisieme package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C3 variables et méthodes C3(…){…} { }Variables et méthodes C3(…){…} } Fin de l’exécution du constructeur PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } troisieme package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C3 variables et méthodes C3(…){…} { }Variables et méthodes C3(…){…} } Suppression de l’instance de C3 et fin de l’exécution de m1 PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Fin de l’exécution du constructeur de l’instance de C1 PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } package p; class C2 { Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Retour à la classe principale PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } deuxieme package p; { classVariables C2 et méthodes { C2(…){…} } Variables et méthodes C2(…){…} } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Exécution de la deuxième ligne de la méthode main PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } deuxieme package p; { classVariables C2 et méthodes { C2(…){…} } Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Création d’une instance de C2 PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } deuxieme package p; { classVariables C2 et méthodes { C2(…){…} } Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Exécution du constructeur de l’instance PROGRAMME EN JAVA Package P premier package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } deuxieme package p; { classVariables C2 et méthodes { C2(…){…} } Variables et méthodes C2(…){…} } package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Retour à la méthode main PROGRAMME EN JAVA Package P package p; class Main { Variables et méthodes static void main(String[] args) { C1 premier=new C1(…); C2 deuxieme=new C2(…); } } deuxieme package p; { classVariables C2 et méthodes { C2(…){…} } Variables et méthodes C2(…){…} } premier package p; { class C1 Variables et méthodes { void m1(…) Variables et méthodes { void m1(…) C3 troisieme=new C3(); { } troisieme=new C3(); C3 C1(…) } C1(…) { m1(…); { } m1(…); } } package p; class C3 { Variables et méthodes C3(…){…} } Fin du programme. Les instances ne sont plus référencées COMPOSITION/UTILISATION D’OBJETS Des objets peuvent être définis à partir d’autres objets RÉFÉRENCEMENT (UTILISATION) D’UN OBJET PAR UN AUTRE Un attribut a d’un objet (instance) O1 de la classe C1 peut contenir une valeur d’un type simple (en java, int, double, char…) mais aussi référencer (déjà vu) un autre objet O2 de la classe C2 RÉFÉRENCEMENT (UTILISATION) D’UN OBJET PAR UN AUTRE Techniquement : il contient l’adresse de cet autre objet, et pas l’objet lui-même l’attribut a pour type le nom de la classe C2 Le type de a est dit : type objet… par opposition aux types simples COMPOSITION/UTILISATION D’OBJETS class Segment { Point extremite1,extremite2; } class Disque { Point centre; double rayon; } type objet class Personne { String nom,prenom; Date dateNaissance; Adresse principale, secondaire; boolean isSalarie; int tailleCentimetres; } Exemples RÉFÉRENCEMENT (UTILISATION) D’UN OBJET PAR UN AUTRE Conceptuellement : O1 est défini par O2… entre autres ! pour connaître O1, il faut connaître O2 Cela peut vouloir dire que l’objet que représente O2 est un composant (physiquement) de l’objet que représente O1 ! Mais ça veut surtout dire que la description de la classe C1 utilise la classe C2 : Il y a un lien d’utilisation entre ces classes. COMPOSITION/UTILISATION D’OBJETS Exemples : un Livre est composé (physiquement) d’une suite de Chapitres, qui sont composés de Paragraphes… Un Disque est défini par son rayon et son Point central Un Segment est défini par deux Points PRINCIPE DE DÉLÉGATION Chacun fait sa part du boulot mais pas plus PRINCIPE DE DÉLÉGATION Le principe de délégation est une bonne pratique pour programmer correctement. Il est analogue au principe de subsidiarité qui régit le fonctionnement institutionnel de l’union européenne. PRINCIPE DE DÉLÉGATION 1 - Un objet doit « travailler avant tout sur lui-même » : ! Chacun s’occupe de ses affaires ses méthodes opèrent toujours sur les valeurs de ses attributs… ! Il n’y a pas de paramètre pour eux parce qu’ils sont directement accessibles avec un éventuel un apport d’informations extérieure ! qui doit être fait via les paramètres des méthodes PRINCIPE DE DÉLÉGATION 1 - Un objet doit « travailler avant tout sur lui-même » : ! Chacun s’occupe de ses affaires ses méthodes opèrent toujours sur les valeurs de ses attributs… ! Il n’y a pas de paramètre pour eux parce qu’ils sont directement accessibles ! cas de la plupart des getXXX()… sauf s’il faut chercher une information dans une collection, un groupe. Auquel cas, il faut préciser la localisation de l’information dans le groupe. Ex : getXXX(int i) PRINCIPE DE DÉLÉGATION 1 - Un objet doit « travailler avant tout sur lui-même » : ! Chacun s’occupe de ses affaires ses méthodes opèrent toujours sur les valeurs de ses attributs… avec un éventuel un apport d’informations extérieure ! exemple du setXXX(<informaAonapportée>) PRINCIPE DE DÉLÉGATION II - Un objet composite (composé d’autres objets) ne doit pas se substituer à ses composants si ceux-ci peuvent « faire le travail » tout seuls ! L’union européenne ne doit pas se substituer à l’un des pays qui la constitue pour traiter de ce qui le concerne seul Si un composant a assez d’informations pour traiter un problème à son niveau, il ne faut pas le traiter à un niveau plus global (celui du composite) l’objet composite gère ce qui nécessite l’interaction entre composants (les niveaux inférieurs) pour être traité ou ce qui concerne son seul niveau ! il peut faire appel à ses composants pour traiter des sous problèmes et faire la synthèse des solutions PRINCIPE DE DÉLÉGATION Exemples : nombre de mots d’un livre = somme des nombres de mots des chapitres du livre ! le livre n’accède pas aux contenus des chapitres pour compiler leur nombre de mots ; ! il demande à chaque chapitre de calculer lui-même son nombre de mots et somme les résultats. nombre de mots d’un chapitre = nombre de mots des paragraphes du chapitre ! qui est demandé à ces paragraphes de la même manière que pour le livre nombre de mots d’un paragraphe = ! C’est le nombre de mots de la chaîne de caractères qui représente le contenu textuel du paragraphe PRINCIPE DE DÉLÉGATION Exemples : Pour calculer son périmètre, Un triangle ne fait pas le calcul de la distance entre ses sommets pris deux à deux, puis la somme de ces distances Il demande à ses segments leur longueur et fait la somme de ces longueurs