Skip to content
Snippets Groups Projects
Commit 46194e37 authored by Fabien Delecroix's avatar Fabien Delecroix
Browse files

partie 2 plusieurs analyseurs

parent 772b951b
No related branches found
No related tags found
No related merge requests found
......@@ -34,22 +34,52 @@ Compléter la classe abstraite Observable de manière à pouvoir disposer du mé
Vérifiez la validité de votre implémentation à l'aide des tests fournis.
```java
package fr.univlille.iut.r304.tp4.q1;
package fr.univlille.iut.r304.tp3.q1;
public abstract class Observable {
public void attach(Observer obs){}
public void detach(Observer obs){}
protected void notifyObservers(){}
protected void notifyObservers(Object data){}
public void attach(Observer obs) {
}
public void detach(Observer obs) {
}
protected void notifyObservers() {
}
protected void notifyObservers(Object data) {
}
}
```
## Partie 2 : Application
On souhaite réaliser un premier analyseur de texte simple, qui observes les lignes saisies sur l'entrée standard et se met à jour à chaque nouvelle ligne saisie.
On devra par exemple pouvoir dérouler le scénario suivant :
Nous utiliserons le patron observateurs/observé pour l'implémenter.
On va donc disposer d'une classe Texte, encapsulant un Scanner pour traiter un flux, ici l'enrée standard :
```mermaid
classDiagram
class Texte
Texte : +Texte(InputStream)
Texte : +startReading() void
Texte --> "1" Scanner : #scan
```
ainsi que d'une classe Analyseur, chargée d'afficher au fur et à mesure la progression sur l'objectif donné, ici simplement en terme de lignes à saisir :
```mermaid
classDiagram
class Analyseur{
-objectif : int
}
Analyseur : +do() void
```
On devra par exemple pouvoir dérouler le scénario suivant (pour y parvenir quelques questions ci-dessous pour vous guider) :
```
Temps chrono total (en secondes) : 3247
nombre de lignes : encore 3
Hello
nombre de lignes : encore 2
......@@ -61,22 +91,35 @@ Ah ?
C'est déjà fini
```
Nous utiliserons le patron observateurs/observé pour l'implémenter.
* Qu'est-ce qui sera observable ?
Créer la classes correspondante en pensant bien à la faire hériter d' *Observable*.
* Quel sera l'observateur ?
Créer la classes correspondante en pensant bien à la faire implémenter *Observer*.
* En mode *push*, quelle *data* va-t-on récupérer de l'*Observable* qu'on suit lorsqu'il appellera notre méthode *update(Observable o, Object data)* ?
Faîtes en sorte qu'elle soit bien envoyée par l'objet qui sera observé.
* Qu'est-ce qui est observable ici ? \
Faîtes hériter d' *Observable* la classe correspondante.
* Quel sera l'observateur ? \
Faîtes implémenter *Observer* à la classe correpsondante.
* En mode *push*, quelle *data* va-t-on récupérer de l'*Observable* qu'on suit lorsqu'il appellera notre méthode *update(Observable o, Object data)* ? \
Faîtes en sorte qu'elle soit bien envoyée par l'observable.
* Dans un *Main*, instancier les différentes classes nécessaires à obtenir le scénario ci-dessus en pensant bien à gérer l'abonnement et le désabonnement de l'observateur à l'observable.
On va désormais ajouter un deuxième analyseur utilisant les mêmes saisies mais vérifiant un critère plus fin, qu'un caractère ait été saisi un certain nombre de fois.
### Autres analyseurs
On va désormais ajouter d'autres analyseurs, sur les mêmes saisies, mais vérifiant un critère plus fin, qu'un caractère ait été saisi un certain nombre de fois.
Créer une classe pour ce faire, de manière à mutualiser le plus possible le code avec **Analyseur**.
Note: Des tests sont fournis dans le projet pour que vous vous assuriez que vos classes fonctionnent comme attendu.
Respectez les noms des packages, classes et méthodes
```
nombre de lignes : encore 3
nombre de a : encore 5
Hello
nombre de lignes : encore 2
nombre de e : encore 4
The answer is 42
nombre de lignes : encore 1
nombre de e : encore 2
Sayonara
nombre de lignes atteint
nombre de e : encore 2
The end
nombre de e atteint
Rideau
```
## Partie 3 : Propriétés observables
......@@ -95,7 +138,7 @@ Vous devez réimplémenter ces mécanismes des propriétés.
Outre le fait qu'elle soit observable (attach, detach), cette classe doit avoir une propriété à laquelle on peut accéder :
```java
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
public class ObservableProperty
......@@ -115,7 +158,7 @@ Vérifier la validité de votre implémentation en exécutant les tests associé
**Q2.2** Créez la classe ConnectableProperty qui puisse se connecter de façon mono ou bi-directionnelle :
```java
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
public class ConnectableProperty extends ObservableProperty
......@@ -129,5 +172,3 @@ public void unconnectFrom(ConnectableProperty other) {
}
...
```
**QBonus** : Dans la partie 1 du sujet, ajouter un bouton permettant d'arrêter et redémarrer un chronomètre en particulier à tout moment.
package fr.univlille.iut.r304.tp4.q1;
package fr.univlille.iut.r304.tp3.q1;
public abstract class Observable {
......
package fr.univlille.iut.r304.tp4.q1;
package fr.univlille.iut.r304.tp3.q1;
public interface Observer {
......
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
public class ConnectableProperty extends ObservableProperty {
......
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
import fr.univlille.iut.r304.tp4.q1.Observer;
import fr.univlille.iut.r304.tp3.q1.Observer;
public class ObservableProperty {
......
package fr.univlille.iut.r304.tp4.q1;
package fr.univlille.iut.r304.tp3.q1;
/** ObserverTestStub
* Can tell whether it was notified or not
......
package fr.univlille.iut.r304.tp4.q1;
package fr.univlille.iut.r304.tp3.q1;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
......
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
......@@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import fr.univlille.iut.r304.tp4.q1.ObserverTestStub;
import fr.univlille.iut.r304.tp3.q1.ObserverTestStub;
public class TestQ1 {
protected ObservableProperty prop;
......
package fr.univlille.iut.r304.tp4.q3;
package fr.univlille.iut.r304.tp3.q3;
import static org.junit.jupiter.api.Assertions.assertEquals;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment