Commit d0f339db authored by Gerson Sunyé's avatar Gerson Sunyé
Browse files

Remove duplicate lines

parent 0dc19680
......@@ -20,7 +20,7 @@ est particulièrement utile lorsque l'on souhaite construire des objets complexe
Par exemple, supposons que l'on souhaite construire un objet complexe en créant une instance de son _builder_ (monteur),
en appelant les _setters_ (modificateurs) respectifs, et enfin, en appelant la méthode de construction.
Une fois la méthode de construction exécutée, vous récupérerez l'objet de la classe souhaitée.
Une fois la méthode de construction exécutée, on peut récupérerer l'objet de la classe souhaitée.
```java
EmailMessageBuilder builder = new EmailMessageBuilder();
......@@ -29,7 +29,7 @@ message.setFrom("gerson.sunye@univ-nantes.fr");
message.seTo("licence.informatique@univ-nantes.fr");
message.setSubject("Distanciel");
message.setBody("Au travail !!!");
message.send();
message.build();
```
Ce code semble très simple, mais il y a une difficulté potentielle:
......@@ -42,19 +42,19 @@ Dans ces cas, l'oubli d`initialiser un attribut peut s'avérer très couteux en
Une question se pose:
[quote]
.Question:
Comment aider le développeur à se rappeler de tous les attributs, obligatoires et optionnels?
La réponse est de forcer le développeur à initialiser tous les attributs obligatoires *avant* d'appeler la méthode de construction.
Ainsi, tous les attributs obligatoires seront initialisés et l'objet créé sera complet.
Ainsi, tous les attributs obligatoires seront initialisés et l'objet créé sera complet.
Ce qui soulève une nouvelle question:
[IMPORTANT]
Comment forcer le développeur à initialiser correctement un objet?::
En utilisant le patron _Fluent Builder_.
[quote]
Comment forcer le développeur à initialiser correctement un objet?
La réponse est simple : en utilisant le patron _Fluent Builder_.
L'idée c'est qu'au lieu de précéder chaque appel de méthode par le nom de l'objet, ce qui conduit à un style verbeux, le nom de l'objet reste actif dans toute l'instruction en cours.
L'idée c'est qu'au lieu de précéder chaque appel de méthode par le nom de l'objet --ce qui conduit à un style verbeux-- le nom de l'objet reste actif dans toute l'instruction en cours.
Le code devient ainsi à la fois plus concis et plus clair.
Par exemple:
......@@ -68,13 +68,13 @@ EmailMessage message = EmailMessageBuilder.builder()
```
La réduction de verbosité est semblable à celle de l'expression `with` en Pascal, bien que sur des principes différents.
La réduction de verbosité est semblable à celle de l'expression `with` en Pascal, bien que basée sur des principes différents.
=== Chainage de méthodes
Ce style (ou idiome) de programmation, appelé _chainage de méthodes_ a été introduit par le langage Smalltalk, où par convention les modificateurs retournent l'objet modifié (`this`).
Dans le cas de Java, la logique est semblable: toutes les méthodes de configuration (`from`, `to`, etc.) seront spécifiées dans la `Builder` et retourneront une instance de cette classe.
Dans le cas de Java, la logique est similaire: toutes les méthodes de modification (`from`, `to`, etc.) seront spécifiées dans la `Builder` et retourneront une instance de cette classe.
Par exemple, la méthode `from()` sera mise en oeuvre comme suit:
......@@ -85,7 +85,7 @@ public EmailMessageBuilder from(String sender) {
}
```
Quant à la méthode `to()`, sa mise en oeuvre sera semblable:
Quant à la méthode `to()`, sa mise en oeuvre sera semblable à la précédente:
```java
public EmailMessageBuilder to(String recipient) {
......@@ -100,7 +100,6 @@ Une nouvelle question se pose alors:
[quote]
.Question:
Comment empêcher le développeur d'appeler la méthode de construction avant d'initialiser tous les attributs obligatoires ?
Pour répondre à cette question, nous allons utiliser le chaînage d'interfaces.
......@@ -134,6 +133,7 @@ interface EmailCreator {
}
```
Notez que dans cette suite d'interfaces, chaque modificateur a comme type de retour l'interface suivante dans la suite.
Ainsi, pour atteindre l'interface `EmailCreator`, on doit passer par une suite d'interfaces, ce qui oblige le développeur à appeler différentes méthodes avant de pouvoir accéder à la méthode `build()`.
La question qu'on peut se poser maintenant est : "- Faut-il implémenter toutes ces interfaces par une nouvelle classe ?".
......@@ -169,10 +169,6 @@ Dans cette partie, vous allez appliquer ces notions pour coder une interface flu
=== Préparation
. Effectuez une divergence du projet remote où vous vous trouvez actuellement.
Pour rappel, il suffit d’aller utiliser le bouton correspondant en faut de la page d’accueil du projet.
. Effectuez une *divergence* du projet _distanciel_ où vous vous trouvez actuellement.
Pour rappel, il suffit d'aller utiliser le bouton correspondant en faut de la page d'accueil du projet.
. Configurez votre nouveau projet Gitlab obtenu via la divergence de la manière suivante :
......@@ -188,7 +184,7 @@ DNS _Service Discovery_, ou simplement DNS-SD est un protocole de publication et
Notre objectif ici n'est pas de comprendre le fonctionnement de ce protocole dans les détails, mais seulement de simplifier la publication de services grâce à une interface fluide.
Plus précisément, nous allons nous intéresser à la création d'instances de la classe `ServiceDescription`, dont la signature du constructeur est donné ci-dessous:
Plus précisément, nous allons nous intéresser à la création d'instances de la classe `ServiceDescription`, dont la signature du constructeur est donnée ci-dessous:
```java
public ServiceDescription(String name, int port, String transport,
......@@ -207,7 +203,7 @@ Plus précisément, nous allons nous intéresser à la création d'instances de
}
```
* Comme on peut déduire à partir du constructeur, cette classe possède 8 attributs:
* Comme nous pouvons déduire à partir du constructeur, cette classe possède 8 attributs:
** Seulement 4 sont obligatoires: `name`, `port`, `transport` et `application`.
** La valeur par défaut des attributs `weight` et `priority` est de 0.
......@@ -218,7 +214,7 @@ Plus précisément, nous allons nous intéresser à la création d'instances de
=== Implémentation
* Première étape: mettre en oeuvre la classe monteur, appelée `SimpleServiceDescriptionBuilder`:
** Cette classe doit contenir exactement les mêmes attributs de la classe `ServiceDescription`.
** Cette classe doit contenir exactement les mêmes attributs que la classe `ServiceDescription`.
** Les attributs qui ont une valeur par défaut doivent être initialisés avec cette valeur.
* Deuxième étape: mettre en oeuvre le chaînage d'interfaces:
......@@ -244,7 +240,7 @@ interface ServiceNameModifier {
** Implémenter enfin la méthode `build()` qui doit créer une instance de `ServiceDescription`.
* Quatrième et dernière étape: mettre en oeuvre un test unitaire qui utilise votre APU fluide.
* Quatrième et dernière étape: mettre en oeuvre un test unitaire qui utilise votre API fluide.
** Pensez à vérifier que l'auto-complétion marche correctement.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment