Besoin d'aide pour la compréhension d'une application

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis débutant et j’ai un exercice à réaliser mais je ne comprends pas comment m’y prendre pour le réaliser et j’aurais besoin d’aide pour m’aiguiller.

Voici les différents codes sur lesquels je dois travailler :

package com.openclassrooms.magicgithub.api;

import com.openclassrooms.magicgithub.model.User;
import java.util.List;
import static com.openclassrooms.magicgithub.api.FakeApiServiceGenerator.generateUsers;

public class FakeApiService implements ApiService {

    private final List<User> users = generateUsers();

    /**
     * Return a list of {@link User}
     * Those users must be generated by {@link FakeApiServiceGenerator}
     */
    @Override
    public List<User> getUsers() {
        // TODO: A modifier
        return null;
    }

    /**
     * Generate a random {@link User} and add it {@link FakeApiService#users} list.
     * This user must be get from the {@link FakeApiServiceGenerator#FAKE_USERS_RANDOM} list.
     */
    @Override
    public void generateRandomUser() {
        // TODO: A modifier
        
    }

    /**
     * Delete a {@link User} from the {@link FakeApiService#users} list.
     */
    @Override
    public void deleteUser(User user) {
        // TODO: A modifier
        
    }
}
package com.openclassrooms.magicgithub.repository;

import com.openclassrooms.magicgithub.api.ApiService;
import com.openclassrooms.magicgithub.model.User;

import java.util.List;

public class UserRepository {

    private final ApiService apiService; // TODO: A utiliser
    private Object User;

    public UserRepository(ApiService apiService) {
        this.apiService = apiService;
    }

    public List<User> getUsers() {
        // TODO: A modifier
        return null;

    }

    public void generateRandomUser() {
        // TODO: A modifier
        
    }

    public void deleteUser(User user) {
        // TODO: A modifier
       
    }
}
package com.openclassrooms.magicgithub.model;

import java.util.Objects;
import java.util.Random;
import androidx.annotation.Nullable;
import static com.openclassrooms.magicgithub.api.FakeApiServiceGenerator.FAKE_USERS_RANDOM;

public class User {

    private final String id;
    private final String login;
    private final String avatarUrl;

    public User(String id, String login, String avatarUrl) {
        this.id = id;
        this.login = login;
        this.avatarUrl = avatarUrl;
    }

    // --- GETTERS ---
    public String getId() { return id; }
    public String getLogin() { return login; }
    public String getAvatarUrl() { return avatarUrl; }

    /**
     * Generate random user
     */
    public static User random(){
        return FAKE_USERS_RANDOM.get(new Random().nextInt(FAKE_USERS_RANDOM.size()));
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if (obj == null) return false;
        if (obj == this) return true;
        if (!(obj instanceof User)) return false;
        return (((User) obj).avatarUrl == this.avatarUrl && ((User) obj).login == this.login);
    }

    @Override
    public int hashCode() {
        return Objects.hash(login, avatarUrl);
    }
}
package com.openclassrooms.magicgithub.api;

import com.openclassrooms.magicgithub.model.User;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

public abstract class FakeApiServiceGenerator {


    static List<User> generateUsers() {
        return new ArrayList<>(FAKE_USERS);
    }

    public static List<User> FAKE_USERS = Arrays.asList(
            new User("001", "Jake", "https://api.adorable.io/AVATARS/512/1.png"),
            new User("002", "Paul", "https://api.adorable.io/AVATARS/512/2.png"),
            new User("003", "Phil", "https://api.adorable.io/AVATARS/512/3.png"),
            new User("004", "Guillaume", "https://api.adorable.io/AVATARS/512/4.png"),
            new User("005", "Francis", "https://api.adorable.io/AVATARS/512/5.png"),
            new User("006", "George", "https://api.adorable.io/AVATARS/512/6.png"),
            new User("007", "Louis", "https://api.adorable.io/AVATARS/512/7.png"),
            new User("008", "Mateo", "https://api.adorable.io/AVATARS/512/8.png"),
            new User("009", "April", "https://api.adorable.io/AVATARS/512/9.png"),
            new User("010", "Louise", "https://api.adorable.io/AVATARS/512/10.png"),
            new User("011", "Elodie", "https://api.adorable.io/AVATARS/512/11.png"),
            new User("012", "Helene", "https://api.adorable.io/AVATARS/512/12.png"),
            new User("013", "Fanny", "https://api.adorable.io/AVATARS/512/13.png"),
            new User("014", "Laura", "https://api.adorable.io/AVATARS/512/14.png"),
            new User("015", "Gertrude", "https://api.adorable.io/AVATARS/512/15.png"),
            new User("016", "Chloé", "https://api.adorable.io/AVATARS/512/16.png"),
            new User("017", "April", "https://api.adorable.io/AVATARS/512/17.png"),
            new User("018", "Marie", "https://api.adorable.io/AVATARS/512/18.png"),
            new User("019", "Henri", "https://api.adorable.io/AVATARS/512/19.png"),
            new User("020", "Rémi", "https://api.adorable.io/AVATARS/512/20.png")
    );

    public static List<User> FAKE_USERS_RANDOM = Arrays.asList(
            new User("021", "Lea", "https://api.adorable.io/AVATARS/512/21.png"),
            new User("022", "Geoffrey", "https://api.adorable.io/AVATARS/512/22.png"),
            new User("023", "Simon", "https://api.adorable.io/AVATARS/512/23.png"),
            new User("024", "André", "https://api.adorable.io/AVATARS/512/24.png"),
            new User("025", "Leopold", "https://api.adorable.io/AVATARS/512/25.png")
    );
}
package com.openclassrooms.magicgithub.api;

import com.openclassrooms.magicgithub.model.User;
import java.util.List;
import androidx.annotation.Nullable;

public interface ApiService {
    List<User> getUsers();
    void generateRandomUser();
    void deleteUser(User username);
}

Dans le premier code j’ai 3 fonctions a modifier La première fonction doit retourner la liste d’utilisateur donc je suppose qu’il faut utiliser la variable users en faisant return users La deuxième fonction dois générer un utilisateur aléatoirement, j’utilise à nouveau la variable users en faisant users.add(User.random()), j’utilise la fonction random() de la classe User pour générer un utilisateur aléatoire et j’utilise la fonction add() pour ajouter l’utilisateur à la liste dans users Pour la troisième fonction je suppose que ç’est users.remove(user) mais je ne comprends pas le lien entre deleteUser(User user) de la classe FakeApiService avec la classe User et l’interface ApiService où la fonction est deleteUser(User username)

Dans le deuxième code je comprends que je dois utiliser la variable apiService mais je ne comprends pas quoi faire.

Et je ne comprends pas que fais ce bout de code, même si je sais que c’est un constructeur.

public UserRepository(ApiService apiService) {
        this.apiService = apiService;
    }

Merci d’avance pour votre aide

+0 -0

Bonjour,

La première fonction doit retourner la liste d’utilisateur donc je suppose qu’il faut utiliser la variable users en faisant return users

Oui.

La deuxième fonction dois générer un utilisateur aléatoirement, j’utilise à nouveau la variable users en faisant users.add(User.random()), j’utilise la fonction random() de la classe User pour générer un utilisateur aléatoire et j’utilise la fonction add() pour ajouter l’utilisateur à la liste dans users

Oui

Pour la troisième fonction je suppose que ç’est users.remove(user) mais je ne comprends pas le lien entre deleteUser(User user) de la classe FakeApiService avec la classe User et l’interface ApiService où la fonction est deleteUser(User username)

La signature de la fonction de l’interface est void deleteUser(User username); et la signature de ta fonction est public void deleteUser(User user), il n y a pas de problème, les deux signature sont compatible, le type du paramètre ici User est respecté, ainsi que le nom de la fonction, tout comme le type de retour de la fonction. La seule chose qui change est le nom du paramètre, ce n’est pas obligatoire d’avoir le même nom de paramètre pour implémenter la fonction de l’interface.

Dans le deuxième code je comprends que je dois utiliser la variable apiService mais je ne comprends pas quoi faire.

Si tu regarde le code des trois fonctions, elle correspondent chacune aux fonction décrite dans l’interface de ApiService. Il te suffit donc d’appeler dans chacune des fonctions les bonnes méthodes. Par exemple la fonction getUsers() de UserRepository tu peux simplement retourner le résultat de apiservice.getUsers().

Tu dois vois a classe UserRepository comme une abstraction qui te permet de récupérer une liste d’utilisateurs, d’en ajouter un et dans supprimer un, en se basant sur une api qui implémente l’interface ApiService.

Et je ne comprends pas que fais ce bout de code, même si je sais que c’est un constructeur.

C’est le constructeur que tu va appeler quand tu voudra créer un UserRepository, ça te permettra d’écrire le code suivant plus tard pour manipuler tes utilisateurs.

// on initialise un service API
ApiService apiService = new FakeApiService();
// on crée de quoi gérer nos utilisateurs en indiquant l'API qu'on souhaite utiliser
UserRepository userRepository = new UserRepository(apiService);

Merci pour ta réponse et ton aide.

Je débute tout juste la programmation, j’ai donc à l’heure actuelle très peu de notions.

Pour ce qui est de la classe UserRepository je n’ai pas tout compris. Je ne comprends pas le fait de devoir appeler des methodes dans d’autres methodes

Que veux tu dire par abstraction ?

l’api qui implémente l’interface ApiService c’est FakeApiService ?

Tu veux dire que le lien entre UserRepository et FakeApiService se fait via ApiService vu que FakeApiService implémente ApiService et que UserRepository importe ApiService ?

Je ne comprends pas l’utilité de la classe UserRepository.

Je débute tout juste la programmation, j’ai donc à l’heure actuelle très peu de notions.

Ce n’est pas un problème, on a tous débuté un jour. ^^

Pour ce qui est de la classe UserRepository je n’ai pas tout compris. Je ne comprends pas le fait de devoir appeler des methodes dans d’autres methodes

C’est normal de ne pas voir l’intérêt d’une classe de ce type dans un exercice comme celui-ci ou tes méthodes se contente d’appeler d’autres méthode.

Le but d’un pattern repository en Java est de te permettre de gérer/manipuler proprement une collection de données afin que ton code puisse résister aux changements avenir (au départ on était parti pour utiliser l’api FakeAPIService, et puis on décide de rajouter une nouvelle API à gérer) sans gros efforts.

Tu retrouveras ce pattern dans beaucoup d’application Java modernes, et je pense que le but de ton exercice est de t’apprendre à le reconnaître et à l’utiliser.

l’api qui implémente l’interface ApiService c’est FakeApiService ?

Oui

Tu veux dire que le lien entre UserRepository et FakeApiService se fait via ApiService vu que FakeApiService implémente ApiService et que UserRepository importe ApiService ?

Oui.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte