Initiation la Programmation Orientée Objet

Created: 20123-01-16 Mon 16:58

1 Principe

Un programme est constitué de données et de fonctions manipulant les données. Les classes sont composées de données et de méthodes qui manipulent les données.

2 Classe et objet

  • Une classe est le TYPE d'un objet.
  • Un objet est une INSTANCE de classe

3 Classes en Java

En Java, tout le code est implémenté sous forme de classes !

4 Packages

Les packages permettent d'organiser les classes (c'est l'équivalent des répertoires pour des fichiers).

On peut utiliser un nom complet qualifié (fully qualified name) java.util.Scanner sc = new Scanner(System.in); ou utiliser des directives import : import java.util.Scanner ou java.util.* en début de fichier.

4.1Mise en pratique

  • Créer une classe dans un package en respectant les règles de nommage
  • Dans un programme existant, utiliser une classe par son nom complètement qualifié, puis utilisez un import spécifique, qui avec un import de tout le contenu d'un package.

5 Interface et implémentation

  • Interface : "que puis-je faire ?" => ce qui est visible
  • Implémentation : "comment ça marche ?" => ce qui est caché

On parle d' Encapsulation.

6 Minimisation de la compléxité

On minimise ce qui est visible : il n'y a pas de dépendance envers ce qui n'est pas visible (→ possibilités d'évolutions).

7 Visibilités

Les différents niveaux de visibilité indiquent quel code a accès à ce qui est qualifié :

qualificatif Classe Package Sous-classe Tout
private      
public
protected  
     

(sous-classe → héritage)

7.1 Pratique

  • Créez une classe MaClasse sans qualificatif de visibilité dans un package fr.formation.test avec une fonction :
static void message(){
System.out.println("Message depuis MaClasse !");
}
  • Créez une classe Main dans un package fr.formation.test avec une fonction public static void main(String[] args) qui essaie d'appeler MaClasse.message().
  • Que se passe-t'il si Main est dans un package fr.formation.test ? Quelle(s) modification(s) faut-il faire ?

8 Mot clé static

Ce qui est qualifié de static concerne la classe (n'est pas créé en cours d'exécution). Cf. public static void main(String[] args).

9 Attributs de classe

On classe possède des données appelées attributs. Celle-ci sont accessibles, selon leur visibilité, comme des variables avec une durée de vie qui est celle du programme. On accède à un attribut d'une classe comme à une fonction (méthode) de classe :

System.out;
Integer.MIN_VALUE;

10 Attributs constants

En fait, pour limiter le couplage on utilise généralement des attributs de classe qui sont déclarés constants :

public static final int NOMBRE_ESSAIS= 5;

10.1 En pratique 1/2

Dans la classe MaClasse, ajouter un attribut de classe SALUT de type String pour remplacer le mot "message" de la classe MaClasse.

10.2 En pratique 2/2

Modifier la classe Quizz pour que la fonction main soit comme suit :

public static void main(String[] args){
 for(int i=0; i != questions.length; ++i){
     System.out.println(questions[i]);
     String answer= in.nextLine();
     if(answer.equals(answers[i])){
         score+= scores[i];
     }
 }
 displayResult();
}

11 Objets

Lorsqu'on veut manipuler différentes valeurs pour un même type composé, on doit instancier la classe décrivant ce type :

public class TestItem {
    String question;
    String answer;
    int points;
}

On utilise le mot-clé new :

TestItem ti= new TestItem();

12 Constructeurs

On initialise les attributs d'un objet à l'occasion de la construction d'un objet. Dans une méthode d'instance (et un constructeur) on peut accéder directement aux attributs de l'instance.

public class TestItem {
    public TestItem(String q, String a, int p){
        question= q;
        answer= a;
        points= p;
    }
}

12.1 mot clé this

On peut aussi préfixer notre attribut avec le mot-clé this :

public class TestItem {
    public TestItem(String question, String answer, int points){
        this.question= question;
        this.answer= answer;
        this.points= points;
    }
}

13 Accesseurs

Généralement, on ne permet pas l'accès direct aux attributs, mais l'on utilise si nécessaire des accesseurs : getter et setter :

public TypeOfXXX getXXX(){
  return xxx;
}
public void setXXX( TypeOfXXX xxx ){
  this.xxx= xxx;
}

14 Méthodes

Une méthode d'instance (non qualifiée par static) :

  • est appelée sur une instance

    System.out.println();
    str.equals("test");
    
  • a accès implicite aux attributs d'instance (Cf. accesseurs)

15 equals et toString

On réimplémente (voir héritage et polymorphisme) généralement au moins les méthodes equals et toString. Cette dernière est appellée automatiquement lors d'une concaténation ou d'un affichage avec println().

16 Références

En fait, tous les objets sont manipulés par références (comme les instances de String, Integer,…).

Cf. implications pour arguments, ==, …

17 Classes immutables

Si tous les attributs d'instance sont constants, il n'y a pas de risques de modifications problématiques.

18 En pratique 1/2

Modifier le programme Quizz pour utiliser des objets d'une classe TestItem.

18.1 Classe QuizzItem immutable

Utiliser une classe QuizzItem immutable, avec une méthode qui retourne le nombre de points obtenus en validant ou non une réponse proposée.

18.2 Classe QuizzItem mutable

Utiliser une classe QuizzItem mutable avec un attribut qui permette de reproposer la question en cas de réponse erronée.

18.3 Instances de la classe Quizz

Modifier la classe Quizz pour que le main instancie un objet paramétré par le nombre d'essais:

public static void main(String[] args){
    Quizz session= new Quizz(nbRetries);
    session.doTest();
    session.displayResults();
}

19 En pratique 2/2

Réarchitecturer ("refactorer") le code de gestion de données sur les aliments avec une architecture Orientée Objet.