programming_concepts icon indicating copy to clipboard operation
programming_concepts copied to clipboard

Nouvel exercice OOP sur l'observer pattern

Open echatzo opened this issue 4 months ago • 3 comments

echatzo avatar Oct 13 '25 14:10 echatzo

Il faudrait passer tous les comments en anglais. Dans l'entête, il faut expliquer aux étudiants ce qu'ils doivent implémenter dans la classe. Il ne faut pas de System.out.println dans les actions subscribe, etc de ton code. Pas de side effect silencieux. Pas de "instance of", c'est un mauvais design si tu as besoin de ça.

pschaus avatar Oct 13 '25 19:10 pschaus

Tout a été traduit en anglais, j'ai ajouté une nouvelle classe message pour gérer les messages sans print et un log par user sous forme de ArrayList.

Il n'y a plus de instance of

Ce qu'il faut implémenter a été davantage détaillé

echatzo avatar Oct 14 '25 10:10 echatzo

C'est toujours pas OK Edouard, l'API n'est pas bonne.

Il y a une mauvaise utilisation des classes internes (statiques alors qu'elles ne devraient pas par exemple).

Le ChatMessage doit juste contenir le message. Le reste se fait avec les appels à des méthodes. On fait de l'OO objet ici, pas une API rest. Tout doit être statiquement typé et compile safe.

    ChatApp.ChatRoom room = new ChatApp.ChatRoom("general");
    ChatApp.ChatUser alice = new ChatApp.ChatUser("Alice");
    ChatApp.ChatUser bob = new ChatApp.ChatUser("Bob");
    ChatApp.ChatUser john = new ChatApp.ChatUser("John");

    // Subscriptions
    room.subscribe(alice);
    room.subscribe(bob);

    // Alice sends message
    ChatApp.ChatMessage msg = new ChatApp.ChatMessage("post", "general", "Alice", "Salut tout le monde !");
    alice.sendMessage(room, msg);

    List<ChatApp.ChatMessage> aliceLog = alice.getLog();
    List<ChatApp.ChatMessage> bobLog = bob.getLog();
    List<ChatApp.ChatMessage> johnLog = john.getLog();

    // Subscription logs: check type and user fields
    assertTrue(aliceLog.stream().anyMatch(m -> m.getType().equals("join") && m.getUser().equals("Alice")));
    assertTrue(bobLog.stream().anyMatch(m -> m.getType().equals("join") && m.getUser().equals("Bob")));

    // Alice's post should be logged
    assertTrue(aliceLog.stream().anyMatch(m ->
            m.getType().equals("post") && m.getUser().equals("Alice") &&
                    m.getChannel().equals("general") &&
                    m.getContent().contains("Salut tout le monde !")));

    // Bob should have received the message
    assertTrue(bobLog.stream().anyMatch(m ->
            m.getType().equals("receive") && m.getUser().equals("Alice") &&
                    m.getChannel().equals("general") &&
                    m.getContent().contains("Salut tout le monde !")));

    // John should have empty log
    assertTrue(johnLog.isEmpty());

pschaus avatar Oct 14 '25 11:10 pschaus