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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    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.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    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?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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

+ 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