IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Gestion d'un panier assez spécial


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur web et mobile (PHP et Java principalement)
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web et mobile (PHP et Java principalement)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Par défaut Gestion d'un panier assez spécial
    Ohayo minna-kun!

    Alors, je débute en Android. Je bricole plus qu'autre chose.

    Je fais une app pour un resto/fast-food, permettant de commander à distance.
    La gestion d'un panier classique, je pense pouvoir le mettre en place sans trop de problème.

    Ici, dans le panier, je dois pouvoir contenir des produits, du style burger, boissons, etc.
    Là où je bloque un peu, c'est au niveau des menus, qui sont aussi des produits, mais qui contiennent d'autres produits. Les menus doivent évidemment être aussi contenus dans le panier.

    De plus, le prix d'un menu dépend du plat (la boisson ne change rien au prix)

    Alors pour ce qui est du diagramme de classe, j'ai trouvé une solution (pas encore terminée mais bon): "Menu" qui hérite de "Produit", et un "Panier" contient une "Map<CategorieProduit, Integer>" (Integer = quantité)
    => Héritage et polymorphisme qui règle mon problème lol
    Je vais sûrement modifier ça plus tard, c'était une solution provisoire à présenter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Produit {
     
        private long id;
        private String nom;
        private CategorieProduit categorie;
        private CategorieMenu categorieMenu;
        private double prix;
        private String imageReference;
        private long position;
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class Menu extends Produit {
     
        private static final float PRIX_SAUCE = 0.40f;
     
        private Produit boisson;
        private Produit plat;
        private Produit sauce;
     
        public Menu(Produit boisson, Produit plat) {
            setBoisson(boisson);
            setPlat(plat);
        }
     
        public Menu(Produit boisson, Produit plat, Produit sauce) {
            this(boisson, plat);
            setSauce(sauce);
        }
     
        // Getter & Setter
     
        public void setPrix () {
            if ((plat != null) && (boisson != null))
                setPrix(plat.getCategorieMenu().getPrix() + (sauce != null ? PRIX_SAUCE : 0f));
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class Panier {
     
        private Map<CategorieProduit, Integer> map;
     
        public Panier() {
            map = new HashMap<>();
        }
     
        public void addProduit(Produit produit, int quantity) throws Exception {
            if (produit == null)
                throw new Exception();
     
            int initQuantity = 0;
            if (map.containsKey(produit.getCategorie())) {
                initQuantity = map.get(produit.getCategorie());
            }
            quantity += initQuantity;
            map.put(produit.getCategorie(), quantity);
        }
     
        public void addProduit(Menu menu, int quantity) throws Exception {
            if ((menu.getBoisson() == null) ||
                    (menu.getPlat() == null))
                throw new Exception();
        }
     
    }
    Mon problème, c'est du côté base de données. Comment je dois transposer ça?

    J'ai fait un mini schéma. Il manque des tas d'infos, je le sais, ce sont les relations qui m'intéressent ici.
    Dans ce schéma, je n'ai mis que les produits, pas les menus... Le "type_menu" est associé aux simples produits.
    Comme le prix d'un menu dépend du plat qui est choisi, alors je stocke un type directement dans le produit, type que je récupère pour fixer le prix d'un menu.

    Voici le schéma
    Nom : mld_app.png
Affichages : 1078
Taille : 18,7 Ko

    Voilà mon problème, je ne sais pas comment représenter ça côté DB. Des idées? ^^

    J'ai encore un autre problème, mais que je présenterai plus tard peut-être, il est moins urgent x)

    Dans tous les cas, merci d'avance à tous ceux qui essaieront de m'aider ^^

    Ridounet

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Menu ne peut pas hériter de produit. Tu es ici dans le cas d'une composition , pas d'un héritage.

    Pour moi un menu est un produit que tu peux acheter comme n'importe quel autre. Ce qu'il y'a dedans n'as pas d'intérêt programmatiquement parlant.
    Quand tu ajoute un burger à ton panier , tu ajoutes pas un steak, du pain , etc ... si ?
    Quand tu met un PC dans ton panier sur ldlc , tu met un pc , pas ses composants.

    Le seul cas qui pourrait nécessiter de gérer les menus comme des produits composés d'autres produits serait si tu as besoin de personnaliser les menu.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur web et mobile (PHP et Java principalement)
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web et mobile (PHP et Java principalement)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Par défaut
    Merci beaucoup pour la réponse ^^

    Effectivement, je n'ai pas été assez clair dans la description:
    Un menu est justement personnalisable, l'utilisateur peut choisir n'importe quel burger ou autre plat possible, avec n'importe quelle boisson, et même n'importe quelle sauce. Du coup, si je devais stocker tous les menus possibles, je me retrouve devant plusieurs centaines de possibilités pour chaque menu ^^'

    En comptant aussi le fait qu'il y ait plusieurs types de menus qui diffèrent sur base de critères comme leur taille (Medium et XL par exemple), mais aussi sur d'autres critères (un menu pour enfant ne laissant pas le choix de la boisson par exemple).

    En conclusion, c'est la raison pour laquelle j'ai géré les Menu via un héritage: Car ce sont AUSSI des produits, mais qui contiennent d'autres produits, qui sont variables pour un même menu, dans la même commande... J'avais prévenu que c'était tordu =p

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pourquoi ne pas simplement dire qu'un produit a 2 tarifs : un normal (hors menu) et un "en menu". Ensuite, une commande (un panier) peut se gérer par association avec un attribut qui dit que le produit est dans un menu ou pas (un lien sur le type de menu s'il faut pouvoir afficher le type de menu). S'il y'a plusieurs tarifs différents selon les types de menu, au lieu de 2 propriétés sur le menu, on a une association produit-menu avec un attribut tarif pour ce menu (avec un menu spécial qui désigne le menu "hors menu", filtré dans les listes de menus sélectionnables).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur web et mobile (PHP et Java principalement)
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web et mobile (PHP et Java principalement)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Par défaut
    J'ai pensé à une solution du genre "2 tarifs", c'est l'idée du "type_menu" dans la DB. Une fois un menu composé, on recherche le "type_menu" du produit "plat" et on retrouve le prix.

    Mais maintenant que tu as posé la question, j'y réfléchis plus en détails et je me rends compte que ce n'est pas bon -_-'
    Pour un produit donné (la table est fixe et non variable), il y a un "type_menu" alors qu'un même produit peut-être dans plusieurs types de menus (le XL étant évidemment plus cher que le Medium par exemple)... Donc avec ma solution, on ne récupère qu'un prix, alors qu'un même plat peut donner plusieurs prix de menus différents... ><'

    Vraiment casse-tête ce machin-là...


    D'un autre côté, je crois que je suis pas clair depuis le début ^^' je m'en excuse.

    Voici la solution à laquelle j'avais pensé côté Java (qu'il faudra donc adapter):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Produit {
     
        private long id;
        private String nom;
        private CategorieProduit categorie;
        private CategorieMenu categorieMenu;
        private double prix;
        private String imageReference;
        private long position;
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public enum CategorieProduit {
     
        MENU(0, "Menu"),
        BURGER(1, "Burger"),
        // ...
        DESSERT_MILKSHAKE(11, "Milkshake"),
        DESSERT_DOUCEUR(12, "Douceur");
     
        private int id;
        private String label;
     
        CategorieProduit(int id, String label) {
            this.id = id;
            this.label = label;
        }
     
    	// Getter & Setter
     
        public static CategorieProduit valueOf(int id) {
            switch (id) {
                case 0: return CategorieProduit.MENU;
                case 1: return CategorieProduit.BURGER;
    			// ...
                case 11: return CategorieProduit.DESSERT_MILKSHAKE;
                default: return CategorieProduit.DESSERT_DOUCEUR;
            }
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public enum CategorieMenu {
     
        BURGER_SMALL("Burger", 0, 1.50),
        BURGER_MIDDLE("Burger", 1, 1.70),
        BURGER_HIGH("Burger", 2, 1.90),
    	// ...
        OTHER("Autre", 8, 0);
     
        private String label;
        private int id;
        private double prix;
     
        private CategorieMenu(String label, int id, double prix) {
            this.label = label;
            this.id = id;
            this.prix = prix;
        }
     
    	// Getter & Setter
     
        public static CategorieMenu valueOf(int id) {
            switch (id) {
                case 0: return BURGER_SMALL;
                case 1: return BURGER_MIDDLE;
                case 2: return BURGER_HIGH;
    			// ...
                default: return OTHER;
            }
        }
     
    }
    => "CategorieMenu" = "type_menu" dans la DB
    Cet enum servait à dire que CE produit vaut autant une fois en menu (mais du coup, faut le modifier...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class Menu extends Produit {
     
        private static final float PRIX_SAUCE = 0.40f;
     
        private Produit boisson;
        private Produit plat;
        private Produit sauce;
     
        public Menu(Produit boisson, Produit plat) {
            setBoisson(boisson);
            setPlat(plat);
        }
     
        public Menu(Produit boisson, Produit plat, Produit sauce) {
            this(boisson, plat);
            setSauce(sauce);
        }
     
        // Getter & Setter
     
        public void setPrix () {
            if ((plat != null) && (boisson != null))
                setPrix(plat.getCategorieMenu().getPrix() + (sauce != null ? PRIX_SAUCE : 0f));
        }
     
    }
    Voilà, avec les catégories, ça paraît plus clair je pense.
    Je précise que je ne tiens pas spécialement à garder CE code-là, je veux dire que je suis prêt à modifier le code Java pour faciliter la structure de la DB.
    Pour ce qui est du panier, je dois encore le travailler côté code de toute façon, mais dans tous les cas il contiendra une liste (List, Set ou Map, encore à voir).

    Je retravaille le côté code maintenant, et je reviens vers vous avec une nouvelle solution (j'espère), en attendant, je bloque toujours côté DB donc si des idées, n'hésitez pas! ^^


    Désolé pour le tout, et merci d'essayer de m'aider ^^'

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur web et mobile (PHP et Java principalement)
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web et mobile (PHP et Java principalement)
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Par défaut
    Pour être plus clair, voici un exemple:

    On a un burger A, et un burger B
    On a un menu Medium, et un menu XL

    Le menu Medium coûterait 5€ si on choisissait le burger A, mais 6€ si on choisissait le burger B
    Le menu XL coûterait 6€ si on choisissait le burger A, mais 7€ si on choisissait le burger B.

    Donc le prix dépend du type de menu et du plat sélectionné
    Le prix NE DÉPEND PAS de la boisson ou sauce choisies.


    L'idée que j'avais avec la catégorie menu, c'est que comme plusieurs plats ont le même prix une fois en menu (quel que soit le menu, ils ont exactement le même prix à chaque fois), je pensais les regrouper en catégorie, ce qui me simplifiait la vie plutôt que de stocker une info pour CHAQUE produit.

Discussions similaires

  1. [Sécurité] gestion d'un panier
    Par kluck3000 dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 16h40
  2. [SQL 2005] Requette LIKE assez spéciale
    Par frechy dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/02/2008, 20h36
  3. Gestion d'un panier: session et bouton précédent
    Par renaud26 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2006, 18h31
  4. tuto sur gestion d'un panier
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2006, 13h39
  5. Aide pour requête de Tri assez spécial (Oracle)
    Par Chips dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/04/2005, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo