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

avec Java Discussion :

Protéger un model


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Protéger un model
    Bonjour à tous,

    J'ai une classe principale qui possède un modèle. Cette classe peut lire et modifier les attributs de son modèle. Voici un exemple minimaliste du modèle :
    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 MonModel {
    	private TblService service;
    	private Date dateJour;
     
     
    	public MonModel (TblService service, Date dateJour) {
    		this.service = service;
    		this.dateJour = dateJour;
    	}
     
    	public TblService getService() {
    		return service;
    	}
     
    	public Date getDateJour() {
    		return dateJour;
    	}
     
    	public void setService(TblService service) {
    		this.service = service;
    	}
     
    	public void setDateJour(Date dateJour) {
    		this.dateJour = dateJour;
    	}
    }
    Ensuite j'ai une SOUS classe dans laquelle je transmets en paramètre la référence à ce modèle. Je voudrais que cette SOUS classe accède uniquement aux méthodes "getService" et "getDateJour". Je souhaiterai interdire l'accès en écriture sur ce modèle.

    J'espère avoir été assez clair dans l'énoncé de mon problème, qu'elle est la meilleure façon de procéder?

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    Ensuite j'ai une SOUS classe dans laquelle je transmets en paramètre la référence à ce modèle. Je voudrais que cette SOUS classe accède uniquement aux méthodes "getService" et "getDateJour". Je souhaiterai interdire l'accès en écriture sur ce modèle.

    J'espère avoir été assez clair dans l'énoncé de mon problème, qu'elle est la meilleure façon de procéder?

    Merci
    c'est impossible avec une sous classe. Par définition de l'héritage, si elle hérite de MonModel, on peut appeler toutes les méthodes non private.

    La meilleure façon de procéder n'est pas d'hériter mais d'appliquer le pattern decorator, comme ci dessous

    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
     
    public class MonModelDecorator {
     
    private MonModel modeleInterne;
     
    public MonModelDecorator( MonModel monModel) {
    modeleInterne = monModel;
    }
     
    	public TblService getService() {
    		return modeleInterne.getService();
    	}
     
    	public Date getDateJour() {
    		return  modeleInterne.getDateJour() ;
    	}
    }
    Voilà. Si tu utilises MonModelDecorator, tu ne peux que lire les informations, pas les écrire.
    les raisonnables ont duré, les passionné-e-s ont vécu

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    je n'ai compris la question de la même manière que rmaker. Ma réponse va donc être différente. A toi de nous dire qui a bien compris la question.

    La sous classe dont tu parles est-elle une sous-classe du modèle (ce qu'à visiblement compris rmaker), en effet, ce n'est pas possible sans changer un certain nombre de choses.

    En revanche, si la sous classe est une sous-classe de la classe principale, tu dois:
    • créer une interface qui ne contient que les getters
    • faire hériter ton model de l'interface
    • ajouter un getter vers le model dans la classe principale qui a pour type de retour l'interface


    Comme cela, ta sous-classe accède au modèle via le getter, mais ne voit que les méthodes de l'interface, pas celles que tu souhaites masquer.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    J'ai une préférence pour l'option de Deaf.

    Il reste aussi la possibilité de l'instance purement lecture seule (mais alors, tout le monde la verra en lecture seule):

    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
    public class MonModelReadOnly extends MonModel {
     
     
    	public MonModelReadOnly (TblService service, Date dateJour) {
    		super(service,dateJour);
    	}
            @override
    	public void setService(TblService service) {
    		throw new IllegalStateException("This object is readonly");
    	}
     
            @override
    	public void setDateJour(Date dateJour) {
    		throw new IllegalStateException("This object is readonly");
    	}
    }

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    J'ai une préférence pour l'option de Deaf.Il reste aussi la possibilité de l'instance purement lecture seule (mais alors, tout le monde la verra en lecture seule):
    Deaf a en effet une solution élégante.

    Avec ta solution, tu vas lever au runtime une exception non gérée, et arrêter net l'exécution. J'ai vu çà sur certaines collections, mais ça me parait hyper violent! Je ne vois pas une application en milieu pro s'arrêter net à cause d'une écriture non souhaitée. Qu'en dis tu?
    les raisonnables ont duré, les passionné-e-s ont vécu

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    J'en dit que dans tous les cas, on cherche à empêcher "le programmeur" de faire n'importe quoi. L'exception va se lancer dans les tests, bien avant d'être en production.

    Et si par le plus grand des hasard, un objet que ne dois pas être modifié se retrouve modifié en production, je préfère de loin l'exception violente à la corruption silencieuse de données

  7. #7
    Nouveau membre du Club Avatar de TheZopo
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Je crois ne pas avoir bien compris la question (ni l'utilité d'ailleurs).
    Comme l'a dit Deaf, j'écrirais un model qui ne contient que les getters et je ferais hérité ma sous-classe de ce dernier...

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bonjour à tous et merci pour vos réponse.

    L'énoncé de mon problème n'était pas assez clair. La classe principale (appelons la CLASSE A) crée une instance de la sous classe (CLASSE B). Il ne s'agit donc pas ici d'un héritage! (j'ai employé le terme sous classe qui peut induire en erreur)

    Voici le code de la CLASSE A en exemple pour vous donner une idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ClasseA {
    	private MonModel model;
    	private ClasseB classeB;
     
    	public ClasseA(MonModel model) {
    		this.model= model;
     
                    classeB = new ClasseB(model);
    	}
    }
    La classe A connait la classe B mais la classe B ne connait pas la classe A, elle n'aura accès qu'aux getter de son modèle.

    J'avais pensé écrire une interface du modèle comme l'a évoqué deaf, ainsi dans le constructeur de la classe B, je donnerai en paramètre l'interface du modèle, comme ça la classe B ne connaîtra que les méthodes défini dans l'interface du modèle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ]public class ClasseB {
    	private InterfaceMonModel model;
     
    	public ClasseB(InterfaceMonModel model) {
    		this.model= model;
    	}
    }
    Mon coeur balance aussi avec la solution donnée par rmaker avec le pattern décorateur, qu'elle est la solution la plus propre à vos yeux?

    Merci pour l’intérêt que vous apportez à mon problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  2. protéger une table
    Par david60 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/12/2004, 16h54
  3. Comment protéger ses sources?
    Par Titeuf21121 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 25/03/2004, 06h47
  4. programmation reseau - couche 2 du modele osi
    Par sahor dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/11/2002, 18h33

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