Première partie

Connaissances requises

Objectifs d'apprentissage

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

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.

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.
public class Utils {

    /**
     * Returns a copy of the array in where each word occurring in the array
     * 'what' has been replaced by the word occurring in the same position
     * in the array 'with'.
     *
     * @param in an array of Strings;
     * @param what an array of words to be replaced;
     * @param with an array of replacement words;
     * @return a new array idententical to 'in' except that all the occurrences of words
     * found in 'what' have been replaced by the corresponding word from 'with'.
     */

    public static String[] findAndReplace(String[] in, String[] what, String[] with) {

        String[] out = null; // The new array to be returned
	boolean valid = true; // True if the pre-conditions are satistified

	// Testing pre-conditions

	if (in == null || what == null || with == null) {
	    valid = false;
	} else {
	    //more or less 16 lines missing
	}

	if (valid) {
	    out = new String[in.length];
	    for (int i=0; i<in.length; i++) {
		//more or less 10 lines missing
	    }
	}

        // Returning a reference to the newly created array that
        // contains the same entries as 'in' except that all the
        // occurrences of words from 'what' have been replaced by
        // their corresponding occurrence from 'with'.

        return out;
    }

}

Deuxième partie

Validation de programmes à l’aide de tests

Objectifs d'apprentissage

  • Utiliser des tests prédéfinis

Bien que «testing shows the presence, not the absence of bugs»¹, 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 outils. 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 interagis avec 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"
    }     
}

Constructeur

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 les variables d’instance. La méthode doit avoir le même nom que la classe et ne pas avoir de type de retour.

public class Person {
	private String firstName; // This variable is private
	private String lastName; // This variable is private
        // ...
	static int numberOfPersons = 0
        // ...
	// Example of a constructor
	public Person(String firstName, String lastName) {
	    this.firstName = firstName;
	    this.lastName = lastName;
	}
	// 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 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 « setters », 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 ce nombre avec celui passé en paramètre.

2.4 plus

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 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 commence 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 :

  • @autor : indique l’auteur du code
  • @param : doit ê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
* 
* 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; 
     // ...
     /**
      * This is the constructor method
      * its assigns the first and last name to the instance variables.
      *
      * @param firstName The first name of the person
      * @param lastName The last name of the person
      */
      public Person(String firstName, String lastName) {
      	  this.firstName = firstName;
      	  this.lastName = lastName;
      }
      /**
       * This is a getter method it is use 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 use 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

Quiz (1 point)

Pour la classe Counter ci-dessous, le mot clé this peut être omis (absent) sans affecter la compilation ou l'exécution du programme.
Vrai ou Faux

public class Counter { 
    private int value = 0; 
    public Counter(int initialValue) { 
        this.value = initialValue; 
    } 
}

Soumettez votre réponse sur Brightspace, dans la fenêtre de commentaires :

Table of Contents
======= Fullscreen Pageflip Layout with BookBlock

Première partie

Connaissances requises

Objectifs d'apprentissage

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

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.

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.

public class Utils {

    /**
     * Returns a copy of the array 'in' where each word occurring in the array
     * 'what' has been replaced by the word occurring in the same position
     * in the array 'with'.
     *
     * @param in an array of Strings;
     * @param what an array of words to be replaced;
     * @param with an array of replacement words;
     * @return a new array idententical to 'in' except that all the occurrences of words
     * found in 'what' have been replaced by the corresponding word from 'with'.
     */

    public static String[] findAndReplace( String[] in, String[] what, String[] with ) {

        String[] out = null; // The new array to be returned
	boolean valid = true; // True if the pre-conditions are satistified

	// Testing pre-conditions

	if ( in == null || what == null || with == null ) {
	    valid = false;
	} else {
	    //more or less 16 lines missing
	}

	if ( valid ) {
	    out = new String[ in.length ];
	    for ( int i=0; i<in.length; i++ ) {
		//more or less 10 lines missing
	    }
	}

        // Returning a reference to the newly created array that
        // contains the same entries as 'in' except that all the
        // occurrences of words from 'what' have been replaced by
        // their corresponding occurrence from 'with'.

        return out;
    }

}
  

 

Deuxième partie

Validation de programmes à l’aide de tests

Objectifs d'apprentissage

  • Utiliser des tests prédéfinis

Bien que «testing shows the presence, not the absence of bugs»1, 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 interagis 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.

1. Edsger W. Dijkstra

 

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.


public class Person {
	private String firstName; //this variable is private
	private String lastName; //this variable is private
  [...]
	static int numberOfPersons = 0
  [...]
	//example of a constructor
	public Person(String firstName, String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}
	//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 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 « setters », 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 ce nombre 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 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 commence 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 : doit ê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;
       [...]

        /**
        *this is the constructor method
        *it assigns the first and last name to the instance variables
        *@param firstName The first name of the person
        *@param lastName The last name of the person
        */
  		public Person(String firstName, String lastName){
        	this.firstName = firstName;
        	this.lastName = lastName;
        }
        /**
        *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

Quiz (1 point)

Pour la classe Counter ci-dessous, le mot clé this peut être omis (absent) sans affecter la compilation ou l'exécution du programme.
Vrai ou Faux

public class Counter {
    private int value = 0;
    public Counter( int initialValue ) {
       this.value = initialValue;
    }
}

Soumettez votre réponse sur Brightspace:

 

Table of Contents
>>>>>>> e08f567195417a28166e952bcd2362df312aa8ff