Exercice

Exercice #

A la suite de la réflexion de la section précédente, complétez le code ci-dessous pour réaliser les premières étapes d’une telle réalisation.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// WithResources.java
public interface WithResources {
    List<Resource> resources();
    default List<Resource> commonResourcesWith(WithResources other) {
        /* à compléter */
    }
    default boolean hasCommonResourcesWith(WithResources other) {
        /* à compléter */
    }

    static PendingReservation create(String title, int durationInMinutes) {
        /* à compléter */
    } 
    static PendingReservation create(String title, int durationInMinutes, List<Resource> resources) {
        /* à compléter */
    } 
    static Reservation create(String title, LocalDateTime dateTime, int durationInMinutes, List<Resource> resources) {
        /* à compléter */
    } 
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// PendingReservation.java
public class PendingReservation implements WithResources { 
    /* à compléter */
    public PendingReservation(String title, int durationInMinutes) {
        /* à compléter */
    }
    public PendingReservation(String title, int durationInMinutes, List<Resource> resources) {
        /* à compléter */
    }
    
    public Reservation scheduleAt(LocalDateTime dateTime) {
        /* à compléter */

        if( resouces().isEmpty() ) {
            throw new IllegalStateException("A reseravtion should have at least one resource");
        } 

        /* à compléter */
    }
    public List<Resource> resources() {
        /* à compléter */
    }
    public boolean isInConflictWithIfScheduledAt(Reservation other, LocalDateTime dateTime) {
        /* à compléter */
    }
    /* complétez toString, hashCode et equals */
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Reservation.java

/* NOTE
 * Une réservation doit être immutable. Une fois crée, il doit être impossible de modifier son état 
 */
public class Reservation implements WithResources { 
    /* à compléter */
    public Reservation(String title, LocalDateTime dateTime, int durationInMinutes) {
        /* à compléter */
    }
    public Reservation(String title, LocalDateTime dateTime, int durationInMinutes, List<Resource> resources) {
        this(dateTime, durationInMinutes);
        if (resources.isEmpty()) {
            throw new IllegalStateException("A reseravtion should have at least one resource");
        }
        this.resources = List.copyOf(resources);
    }
    public Reservation moveTo(LocalDateTime dateTime) {
        /* à compléter */
        /* retourne une nouvelle version de la réservation à la date donnée */
    }
    public PendingReservation postpone() {
        /* ajourne la réservation, annule sa planification */
        /* à compléter */
    }
    public Reservation withNewTitle(String newTitle) {
        /* à compléter */
    }
    public Reservation withNewDurationInMinutes(int durationInMinutes) {
        /* à compléter */
    }
    public Reservation withResources(List<Resource> newResources) {
        /* à compléter */
        if (resources.isEmpty()) {
            throw new IllegalStateException("A reseravtion should have at least one resource");
        }
        /* à compléter */
    }
    public List<Resource> resources() {
        /* à compléter */
    }
    public boolean isInConflictWith(Reservation other) {
        /* à compléter */
    }
    /* complétez toString, hashCode et equals */
}

Remarques #

Pour l’instant, le seul état invalide qui ne peut être détecté à la compilation est l’obligation d’une réservation à posséder au moins une ressource. Nous verrons comment faire mieux lorsque nous aborderons les Optional (valeurs optionnelles).

L’avantage d’une classe immutable, pour notre réservation planifée, et de garantir qu’elle sera toujours valide. Il est possible de retourner une version modifiée en chaînant les appels de méthodes: Reservation newVersion = aReservation.withNewTitle("Cours de prog. séq.").moveTo(newDate).withNewDuration(90);












comments powered by Disqus