Première partie

Encore des types références

Objectifs d'apprentissage

  • Distinguer « == » et « equals ».
  • Manipuler des tableaux et des références.

La méthode equals

Comme vous le savez, la classe Object déclare une méthode equals.

                  
public class Object {

    // ...

    public boolean equals(Object obj) {
        return this == other;
    }

}
                

Puisqu'en Java, toutes les classes héritent des caractéristiques de la classe Object. Toutes les classes possèdent donc une méthode boolean equals(Object obj). C'est vrai pour les classes prédéfinies, mais aussi pour toutes les classes que l'on crée soi-même.

On utilise la méthode equals afin de comparer les objets désignés par des variables références. Étant donné deux variables référence a et b, et les objets désignés:

  • Pour comparer l'identité des objets (est-ce que a et b désignent le même objet ou non?), on utilise l'opérateur de comparaison «==» (donc «a == b»);
  • Pour comparer le contenu des deux objets (est-ce que le contenu des objets désignés est logiquement équivalent?), on utilise la méthode «equals» (donc a.quals(b)).

1 FindAndReplace

Complétez l'implémentation de la méthode de classe (static) String[] findAndReplace(String[] in, String[] what, String[] with) de la classe Utils. Cette méthode retourne une copie du tableau désigné par la référence in où tous les mots se trouvant le tableau désigné par what ont été remplacés par le mot se trouvant à la même position dans le tableau with. Le tableau désigné par in demeure inchangé par un appel à la méthode. Il n'y a pas des doublons dans le tableau what.

Plus tard, nous traiterons les exceptions. Il s'agit d'un formalisme pour le traitement d'erreurs. En attendant, la méthode findAndReplace retourne la valeur null lorsque l'un de ces préalables n'est pas rencontré:

  • En particulier, la valeur des paramètres formels ne peut être null.
  • La valeur des éléments des tableaux ne peut être null.
  • Les tableaux désignés par les références what et with doivent être de même longueur.

Vous allez soumettre cet exercice. Téléchargez et complétez le fichier de démarrage ici: Utils.java.

 

Deuxième partie

Validation de programmes à l’aide de tests

Objectifs d'apprentissage

  • Utiliser des tests prédéfinis

Bien que les tests démontrent la présence et non l'absence d'erreurs («testing shows the presence, not the absence of bugs» - Edsger W. Dijkstra), la validation des programmes est une activité importante du développement de logiciels.

Les tests sont une partie essentielle du développement de logiciels. Il est donc important de se familiariser à les utiliser. Bien qu’il soit possible de tester de petits programmes manuellement, plus votre programme est complexe, plus l’utilisation de test automatique est importante. Le principe des tests automatiques est de créer un bloc de code —un test— qui interagit avec votre programme en effectuant un ou plusieurs scénarios possibles dont on connait la réponse logique, et de s’assurer que la réponse de notre programme correspond à la réponse logique que l’on s’attend à obtenir. Il existe certains outils qui peuvent vous aider à tester votre code tel que JUnit.

Utilisez la classe de test TestFindAndReplace.java pour tester votre programme.

Effectuez tous les changements nécessaires afin que la méthode findAndReplace passe tous les tests.

 

Troisième partie

Encore des objets

Objectifs d'apprentissage

  • Approfondir les notions liées à la programmation orientée objet
  • Résoudre des problèmes à l'aide de Java

Rappel :

Variable d’instance vs variable de classe

Les variables d’instance sont liées à une instance de la classe. Ainsi, à chaque fois que l’on crée une nouvelle instance de la classe (un nouvel objet), une nouvelle copie de cette variable d’instance est créée.

Les variables de classe (aussi connu sous le nom de variable static) sont associées à la classe elle-même. Il n'en existe qu’une seule copie qui est partagée par toutes les instances (objets) de cette classe.


public class Person {
       String firstName; //instance variable
       String lastName; //instance variable
  [...]
       static int numberOfPersons = 0 //class variable
  }  

Variable privée

Une variable privée (private) est une variable qui ne peut être accédée que par la classe elle-même. Elle ne peut pas être accédée par une autre classe. Il faut donc utiliser des « setters » et des « getters » afin de pouvoir interagir avec cette variable. L'utilisation de variables privées est une bonne pratique à suivre. Il est donc important que vous déclariez vos variables d'instance « private » dans vos devoirs et dans vos examens si vous ne voulez pas perdre de points.

Note : Parfois, un paramètre peut avoir le même nom qu’une variable d’instance. Pour faire la différence entre les deux, on utilise le mot clé this afin de faire référence à la variable de classe ; this indique l’objet dans lequel le code est exécuté


public class Person {
	private String firstName; //this variable is private
	private String lastName; //this variable is private
  [...]
	static int numberOfPersons = 0
  [...]
	//example of a getter
	public String getFirstName(){
		return firstName; //Here we do not need to use "this"
	}

	//example of a setter
	public void setFirstName(String firstName){
		this.firstName = firstName; //Here we need to use the keyword "this"
	}
}  

Constructeurs

Un constructeur est une méthode unique qui est appelée lorsqu’une instance de la classe est créée (à aucun autre moment, le constructeur n'est appelé). Cette méthode permet d’initialiser la classe et les variables d’instance nécessaires. La méthode doit avoir le même nom que la classe et ne pas avoir de type de retour.

Une classe peut avoir plusieurs constructeurs dont le nombre de paramètres diffère (l'arité). Les constructeurs peuvent également être appelés explicitement à partir d'un constructeur différent, à l'aide du mot-clé this. Cette appel doit toujours être la première instruction dans le constructeur.


public class Person {
  private String firstName; //this variable is private
  private String lastName; //this variable is private
  private String username; //this variable is private
  [...]
  static int numberOfPersons = 0;
  [...] 
  //example of a constructor with a default value
  public Person(String firstName, String lastName){
          //no code before this call
          this(firstName, lastName, firstName + "." + lastName);
          //possibly more code here
  }
  //example of a constructor
  public Person(String firstName, String lastName, String username){
    this.firstName = firstName;
    this.lastName = lastName;
    this.username = username;
  }
  //example of a getter
  public String getFirstName(){
    return firstName; //Here we do not need to use "this"
  }
  //example of a setter
  public void setFirstName(String firstName){
    this.firstName = firstName; //Here we need to use the keyword "this"
  }
}

2. Rational

Vous allez soumettre cet exercice. Téléchargez et complétez le fichier de démarrage ici: Rational.java.

Vous devez implémenter une classe Rational afin de représenter des nombres rationnels. Un nombre rationnel comporte un numérateur et un dénominateur, tous deux de type int. Puisque chaque nombre possède son propre numérateur et dénominateur, ces variables sont des variables d'instance. De plus, nous prenons la bonne habitude de déclarer ces variables privées.

2.1 Constructeurs

La class Rational possède deux constructeurs. L'un d'eux a deux paramètres formels, dont les valeurs servent pour l'initialisation des variables d'instance. L'autre constructeur n'a qu'un paramètre, il s'agit du numérateur ; la valeur du dénominateur est alors 1.

2.2 Méthodes d'accès

Implémentez des méthodes d'accès « getters », en lecture seulement, afin de retourner la valeur du numérateur et la valeur du dénominateur respectivement. Un objet qui n'a pas de méthodes d'accès en écriture, « setters », et aucune autre méthode afin de changer l'état de l'objet, est dit immuable. C'est une propriété fort intéressante. Discutez-en avec vos voisins et votre démonstrateur.

2.3 plus

Implémentez la méthode d'instance plus. Cette méthode n'a qu'un paramètre formel, de type Rational. La méthode retourne un nouvel objet Rational qui représente la somme de l'objet rational « this » avec celui passé en paramètre.

2.4 plus (partie 2)

Implémentez la méthode de classe plus. Cette méthode possède deux paramètres formels, tous les deux de type Rational. La méthode retourne un nouvel objet représentant la somme des deux valeurs.

2.5 gcd

Implémentez une méthode de classe privée afin de calculer le plus grand diviseur commun de deux nombres passés en paramètres.

2.6 reduce

Implémentez une méthode d'instance privée que vous nommerez reduce et qui transforme cette instance en sa forme réduite. (ex: 18/4 -> 9/2)

2.7 reduce (partie 2)

Effectuez les changements nécessaires pour que la classe sauvegarde toujours le nombre rationnel sous sa forme réduite.

2.8 equals

Implémentez la méthode d'instance public boolean equals( Rational o) qui retourne vrai si cette fraction et celle désignée par le paramètre représentent la même fraction au sens logique, et faux sinon.

2.9 toString

Implémentez une méthode public String toString() qui retourne une chaîne de caractères représentant cette fraction. Le format sera numérateur suivi de « / » suivi du dénominateur, ou encore, simplement le numérateur, si le dénominateur est 1.

2.10 compareTo

Implémentez la méthode d'instance int compareTo( Rational o). Celle-ci compare cet objet (this) et celui désigné par le paramètre « o » et retourne un entier négatif, si cette fraction est plus petite que celle désignée par le paramètre, 0 si elles sont égales, et un entier positif sinon.

 

Quatrième partie

Documentation : JavaDoc

Objectifs d'apprentissage

  • Expliquer en vos propres mots JavaDoc
  • Représenter vos commentaires à l'aide de JavaDoc
  • Produire des pages Web à partir de spécifications JavaDoc

La documentation des programmes est une autre activité importante. JavaDoc est un ensemble de règles pour les commentaires de vos programmes et un ensemble d'outils afin de produire des pages Web. En ITI1521, nous vous demandons de commenter tous vos programmes (variables, méthodes, etc.) à l'aide de JavaDoc.

La documentation JavaDoc est une série de commentaires avec une syntaxe spéciale. Ces commentaires JavaDoc sont une description du programme ou d’une méthode et commencent par « /** », toutes les lignes suivantes commencent par « * », et le bloc de commentaire est ferme avec « */ ». Si l’on veut changer de paragraphe, on utilise « <p> ».

Une fois la description finie, on doit utiliser les « block tags », les tags commencent par le symbole « @ ». Il existe plusieurs tags, mais nous allons nous concentrer sur ceux si :

  • @author : indique l’auteur du code
  • @param : dois être suivi du nom d’un paramètre de la méthode à laquelle il est relié, puis d’une description de ce paramètre
  • @return : est suivi d’une description de ce que retourne la méthode

Pour plus d’information, veuillez consulter la documentation de JavaDoc

Exemple :


/**
* this class represents a person
* <p>
* Note: Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
*
* @author  Bob Smith
*/
public class Person {
       private String firstName;
       private String lastName;
       private String username;
       [...]

        /**
        * Constructor method initializing the first and last name.
        * Sets the default value for the username as "firstName.lastName".
        *@param firstName The first name of the person
        *@param lastName The last name of the person
        */
      public Person(String firstName, String lastName){
          //no code before this call
          this(firstName, lastName, firstName + "." + lastName);
          //possibly more code here
       }
        /**
        * Constructor method initializing the first name, last name and the username.
        *@param firstName The first name of the person
        *@param lastName The last name of the person
        *@param username The preferred username of the person
        */
      public Person(String firstName, String lastName, String username){
        this.firstName = firstName;
        this.lastName = lastName;
        this.username = username;
      }
        /**
        *this is a getter method
        *it is used to get the value of the variable firstName
        *@return String this returns the person's first name
        */
      public String getFirstName(){
          return firstName; //Here we do not need to use "this"
        }
        /**
        *this is a setter method
        *it is used to change the value of the variable firstName
        *@param firstName The value to assign to the instance variable firstName
        */
        public void setFirstName(String firstName){
          this.firstName = firstName; //Here we need to use the keyword "this"
        }
  }
  

Vous devez ajouter des commentaires en format JavaDoc au fichier Utils.java.

  1. Documentez la méthode findAndReplace à l'aide de la syntaxe JavaDoc. Il doit y avoir une brève description de la méthode, des paramètres, ainsi que de la valeur de retour, et ce, à l'aide de la syntaxe JavaDoc.
  2. Commentez la classe Utils à l'aide de la syntaxe JavaDoc, assurez-vous d'y inclure le nom de l'auteur de la classe (vous).

Produisez des fichiers HTML automatiquement, soit à l'aide de votre environnement de programmation favori (DrJava, Eclipse, Netbeans, etc.), ou encore à l'aide de la commande javadoc dans un shell, les paramètres sont -d doc suivi d'une liste de fichiers sources à traiter :

> javadoc -d doc Utils.java

Lorsqu’il y a plusieurs fichiers à traiter simultanément, utilisez * à la place des noms de fichiers.

> javadoc -d doc *

 

Cinquième partie

Créer et soumettre un fichier zip (1 point)

Directives

  • Créez un répertoire que vous nommerez lab3_123456, où vous remplacerez 123456 par votre numéro d'étudiant. Notez que le nom du répertoire est en minuscules, incluant la lettre «l».
  • Dans ce répertoire, placer les fichiers pour les exercices Utils and Rational. N'y ajoutez que le code source, les fichiers .java. En particulier, ne soumettez pas les fichiers .class.
  • Dans ce répertoire, créez aussi un fichier texte nommé README.txt, qui devra contenir votre nom, numéro d'étudiant, ainsi qu'une brève description du contenu (en français ou en anglais, c'est votre choix) :
    
    Nom d'etudiant(e): Marc Tremblay
    Numero d'etudiant: 123456
    Code de cours: ITI1121
    Section de lab: B-2
    
    Cette archive contient les 3 fichiers de lab 3, c'est-à-dire, ce fichier (README.txt),
    puis les fichiers Utils.java et Rational.java.
  • Créez un fichier zip lab3_123456.zip à partir du répertoire lab3_123456.
  • Assurez-vous que cette archive comprend tous les fichiers nécessaires. Pour ce faire, copiez le fichier zip quelque part, ouvrez-le et assurez-vous que les fichiers et les répertoires espérés s'y trouvent.
  • Soumettez l'archive sur https://uottawa.brightspace.com/

Remarques importantes!

Nous utilisons des scripts automatisés pour tester et évaluer votre soumission de laboratoire. Par conséquent, vous devez suivre ces instructions à la lettre. En particulier:
  • Les noms de tous les fichiers et méthodes doivent être exacts. Utilisez le code de démarrage fourni pour éviter des problèmes.
  • Il faut soumettre un fichier .zip; pas de fichiers individuels; pas un .rar, pas un .7z, ni rien d’autre.
  • Tous les fichiers de java doivent être présents et compiler avec succès (autrement dit, l’exécution de javac *.java ne doit générer aucune erreur), même si vous n’êtes pas capable de compléter un exercice.
  • Notez si le code ne sera pas compilé en raison d'erreurs de syntaxe, vous n'obtiendrez pas de marque. Même si vous ne pouvez pas à résoudre complètement cet exercice, vous devez déposer un fichier contenant les méthodes intactes qui compilent correctement (vous pouvez mettre "return 0" si vous avez abandonné).
  • Votre travail doit être soumis au plus tard à 23h30 le mardi de la semaine prochaine.

JUnits

Pour vous assurer que votre code est correct, nous avons préparé quelques tests unitaires. Consultez le fichier Readme.txt dans le fichier zip pour obtenir des informations supplémentaires.

Resources

Table of Contents