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

Java Discussion :

Généricité dans les paramètres


Sujet :

Java

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Généricité dans les paramètres
    Bonjour,

    pour la petite histoire, j'ai besoin de créer une sorte d'interface "Computable", qui me permettrait de savoir si une classe peut effectuer certains calculs.
    Donc j'aurai une méthode "Compute(BufferedImage)" pour exécuter mes calculs.

    Mais je souhaiterai aussi avoir une méthode "setParameters(...)" pour pouvoir affecter les paramètres de calculs aux classes.
    Sauf que bien entendu, les paramètres sont évidemment différents en nombre et en type, en fonction des classes.

    Donc ma première question est comment faire ?

    Je sais qu'il existe deux solutions :
    - avoir un argument de type String qui contient tous les noms des paramètres, leur valeur, le tout avec des séparateurs.
    - une liste d'objets que l'on cast.
    La première est lente mais souple d'utilisation, la deuxième est rapide mais impose d'avoir tous les arguments biens répartis.

    Est ce que quelqu'un aurait une autre idée ?


    Merci par avance...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    La première solution qui me vient à l'esprit est de garder la deuxième option avec une liste de type acceptés (style des objets de type Comparable ou autre) :

    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
    	protected static List<Comparable<?>> acceptedTypes = null;
     
            static 
            {
    		acceptedTypes = new ArrayList<Comparable<?>> ();
    		acceptedTypes.add(new GregorianCalendar ());
    		acceptedTypes.add(new Integer(0));
    		acceptedTypes.add(new Double(0));
    		acceptedTypes.add(new Float(0));
    		acceptedTypes.add(new BigDecimal(0));
    		acceptedTypes.add(new GenericOperand ());		
            }
    	public static List<Comparable<?>> getAcceptedTypes() 
    	{
    		return acceptedTypes;
    	}
     
    	public static boolean isTypeAccepted(Class<?> type) 
    	{
    		Iterator<Comparable<?>> iter = acceptedTypes.iterator();
    		while (iter.hasNext())
    		{
    			Comparable<?> typeinlist = iter.next();
    			if (typeinlist.getClass() == type)
    				return true;
    		}
    		return false;
    	}
    ou alors faire une List<ParametersAuth> ou chacun des type passés en paramètre doit étendre une inteface ParametersAuth avec dans les classes d'implémentation de cette interface un style de Wrapper.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    merci. Effectivement ce serait une version "propre" de ma deuxième proposition.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    D'ailleurs, petite question annexe : comment faire si un des paramètres est un tableau à deux dimensions ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Points : 645
    Points
    645
    Par défaut
    Une autre solution encore plus souple serait d'utiliser une Map<String, Object> : la clé est le nom du paramètre, l'objet sera le paramètre. De cette manière, tu ne seras plus lié par l'ordre des paramètres, tu les récupères par le nom directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    param = (Type) map.get("nom")
    Il reste à connaître le type du paramètre selon son nom, mais je pense qu'une Map<String, Class> peut résoudre ce problème. Je ne sais pas si on peut faire un cast dynamique, sans connaître le type au moment de la compilation. Je pense que oui, mais je n'ai jamais pensé à tester ça.

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Effectivement c'est une solution hybride sympathique.
    Mais après réflexion, j'aime bien l'idée d'imposer le passage de tous les paramètres afin de minimiser les erreurs et l'éventuel casse tête du "qu'est ce que j'ai passé ou pas passé comme paramètre".
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    D'ailleurs, petite question annexe : comment faire si un des paramètres est un tableau à deux dimensions ?
    Il suffirait d'avoir un tableau d'objet acceptés du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected static List<Class> acceptedTypes = null;
    En y ajoutant les collections et mettre une clause de récursivité pour voir si les Objets contenus dans les Collections sont acceptés.

  8. #8
    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
    interfaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface Computable<T extends ComputeParameter>{
        public boolean compute(Image image, T parameters);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    interface ComputeParameters{
        public int getParameterCount();
        public Object getParameter(int x);
    }

    implémentations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class IntegerParameters implements ComputeParameters{
        @override    
        public int getParameterCount(){....}
        @override
        public Integer getParameter(int x){....}    
        public IntegerParameters(Integer[] parameters){....}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class IntegerBufferComputing implements Computable<IntegerParameters>{
     @override
     public boolean compute(Image image, IntegerParameters parameters){
        //....
     }
    }


    alternative, j'aime pas trop car les vararg et les generics, c'est pas vraiment recommandé...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface Computable<T extends Object>{
        public boolean compute(Image image, T... parameters);
    }

    implémentations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class IntegerBufferComputing implements Computable<IntegerParameters>{
     @override
     public boolean compute(Image image, Integer... parameters){
        //....
     }
    }

  9. #9
    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!

    Citation Envoyé par ToTo13 Voir le message
    Sauf que bien entendu, les paramètres sont évidemment différents en nombre et en type, en fonction des classes.
    Si tes paramètres changent en fonction de l'implémentation de Computable, cela signifie que celui qui paramètre doit connaîter l'implémentation utilisée pour paramétrer.

    Donc pourquoi avoir un paramétrage générique?

    Je vois deux possibilités:
    - soit tu cast directement avec ton implémentation (puisque tu dois la connaître pour pouvoir paramétrer correctement),
    - soit tu ajoutes un niveau d'interface supplémentaire entre Computable et ton implémentation pour regrouper les implémentations en fonction du paramétrage et tu cast avec cette interface.

  10. #10
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    merci pour vos propositions, je vais faire des tests et me décider.
    Finalement j'avais en tête les deux familles possibles et visiblement il n'en existe pas de troisième.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Une autre solution basé sur l'exemple de tchize_ serait d'utiliser un objet pour paramétrer chaque "Computable", qui pourrait éventuellement être lié à une factory.

    L'interface serait toute simple et se contenterait d'un argument Generics :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface Computable<A>{
        public boolean compute(Image image, A args);
    }
    Ce qui sera déjà très pratique dans le cas où l'on utilise un seul paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class SimpleComputable implements Computable<Integer> {
    	@Override
    	public boolean compute(Image image, Integer value) {
    		// *** 
    		return false;
    	}
    }

    Et dans les cas où l'on a besoin d'arguments plus nombreux, on passerait alors par une classe dédiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MyComputable implements Computable<MyArgs> {
     
    	@Override
    	public boolean compute(Image image, MyArgs args) {
    		return compute(image, args.getValue(),
    				args.getText(), args.getDate());
    	}
     
    	private boolean compute(Image image, int value, String text, Date date) {
    		// ...
    		return false;
    	}
    }
    Avec la classe MyArgs représentant un simple beans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyArgs {
     
    	private int value;
    	private String text;
    	private Date date;
     
    	// + getter/setter
    }
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MyComputable c = ...
    MyArgs args = new MyArgs();
    args.setValue(5);
    args.setText("Hello");
    args.setDate(new Date());
    c.compute(image, args);
    Si on veut forcer l'utilisation de tous les attributs, on pourrait éventuellement utiliser un constructeur spécifique ou une simple factory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public static MyArgs create(int value, String text, Date date) {
    		MyArgs args = new MyArgs();
    		args.setValue(value);
    		args.setText(text);
    		args.setDate(date);
    		return args;
    	}
    L'utilisation n'en serait que plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyComputable c = ...
    c.compute(image, MyArgs.create(5, "Hello", new Date()));

    a++

  12. #12
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    merci pour cette nouvelle solution.
    Petite précision : si je comprends correctement (rien n'est moins sûr), il y aura dans ce cas une classe d'argument par classe qui implémente Computable afin de pouvoir mettre ce que l'on souhaite dedans.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  13. #13
    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
    heu non, regarde l'exemple, il y a une classe prenant un Integer, tout bete. Mais le problème reste entier, pour faire l'appel, tu devra savoir qu'on travaille avec un MyComputable et non pas avec un IntegerComputable.

  14. #14
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Euh... dsl mais il y a quelque chose que je ne saisi pas
    Comment cela se passerait il si j'ai besoin de plusieurs int en paramètre.
    Ce que je vois dans la classe MyArgs c'est des paramètre figés.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  15. #15
    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
    soit tu fais un Computable<List<Integer>>
    soit tu fais une class "arg" qui contient les ints dont tu as besoin et tu fais un Computable<MesAutresArgs>

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    personnellement j'utilise un truc un peu plus complexe:

    Des paramètres avec un visiteur pour pouvoir les parcourir de manière générique
    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
     
    interface VisitorParameter{
     
    	void visitParameter(ParameterInteger i);
    	// and all other parameters
    }
     
    interface Parameter{
    	void visit(VisitorParameter visitor);
    }
     
    class ParameterInteger implements Parameter{
    	public int i;
     
    	@Override
    	public void visit(VisitorParameter visitor) {
    		visitor.visitParameter(this);
    	}
     
    	public int get() {
    		return i;
    	}
    }
    des interfaces pour les traitements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    interface Arguments<T extends Parameter>{
    	List<T> getAllArguments();
    	void use();
    }
     
    interface Compute<E extends Arguments<?>>{
    	void compute(E arguments);
    	E createArgument();
    }
    une implémentation de traitement:
    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
     
    class ComputeExemple implements Compute<ComputeExempleArgument>{
     
    	@Override
    	public void compute(ComputeExempleArgument arguments) {
    		arguments.i.get();
    		// TODO Auto-generated method stub
    	}
     
    	@Override
    	public ComputeExempleArgument createArgument(){
    		return new ComputeExempleArgument();
    	}
     
    	class ComputeExempleArgument implements Arguments<ParameterInteger>{
     
    		ParameterInteger i ;
     
    		@Override
    		public List<ParameterInteger> getAllArguments() {
    			return Arrays.asList(i);
    		}
     
    		@Override
    		public void use() {
    			ComputeExemple.this.compute(this);
    		}
     
    	}
    }
    du coup, quand on possède une liste de traitements, on peut leurs demander de nous créer leurs paramètres, on peut les remplir et les utiliser pour exécuter le traitement.

    exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static void main(String[] args) {
    	VisitorParameter visiteur = null;
     
    	Compute<?> comp = null;
    	//create args
    	Arguments<?> arg = comp.createArgument();
    	// do things on args like set
    	for (Parameter parameter : arg.getAllArguments()){
    		parameter.visit(visiteur);
    	}
    	// use it
    	arg.use();
    }
    Le point problématique étant que le pattern visitor ne tolère pas/mal l'héritage, rendant l'ajout de nouveaux parameter moche si l'on ne peux pas modifier la définition du visitor.

  17. #17
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    soit tu fais un Computable<List<Integer>>
    soit tu fais une class "arg" qui contient les ints dont tu as besoin et tu fais un Computable<MesAutresArgs>
    Ok, c'est ce que je pensais. J'aimais pas les argument en dur sans une list.


    Citation Envoyé par merill Voir le message
    personnellement j'utilise un truc un peu plus complexe...
    Merci pour cette version.
    Mais je ne vois pas vraiment l'intérêt de quelque chose aussi "complexe".
    J'utilise List<Object> que je cast à ma guise, donc que mes classes peuvent reconstruire.
    Si je souhaite avoir un nombre d'argument variable pour une même classe (ce n'est pas mon cas), je modifierai en faisant utilisant une Map<,> comme cela m'a été conseillé plus haut.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  18. #18
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Comment cela se passerait il si j'ai besoin de plusieurs int en paramètre.
    Ce que je vois dans la classe MyArgs c'est des paramètre figés.
    Oui chaque classe doit proposer sa propre "MyArgs" avec les paramètres qu'il lui faut...




    Question subsidiaire : tu veux avoir quel niveau de vérification des paramètres ? A la compilation ou à l’exécution ?

    Parce qu'en fait je me demande si une simple varargs ne serait pas suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Computable {
        public boolean compute(Image image, Object... args)
            throws ClassCastException, ArrayIndexOutOfBoundsException;
    }

    Que tu implémenterais tout simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyComputable implements Computable {
     
    	@Override
    	public boolean compute(Image image, Object... args) {
    		return compute(image, (Integer)args[0], (String)args[1], (Date)args[2]);
    	}
     
    	public boolean compute(Image image, int value, String text, Date date) {
    		// ...
    		return false;
    	}
    }

    Non ?

    a++

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut

    C'est sûr que ton besoin, c'est un peu tuer un moustique avec un bazooka.

    Avantage 1: Tu peux réussir à remplir tes paramètres de manière générique, sans avoir besoin de connaitre les implémentations des traitements.

    Avantage 2: pas de cast.

    A noter que si l'avantage 1, on s'en fout, on peut très bien virer l'histoire des Parameter et visitor. On se retrouve alors avec la première solution de adiGuba, qui a l'intérêt de ne pas avoir de cast à faire (je trouve cela plus safe).

    C’est quoi un argument "en dur sans une liste"?

  20. #20
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Oui chaque classe doit proposer sa propre "MyArgs" avec les paramètres qu'il lui faut...
    C'est ce qu'il me semblait avoir compris.


    Citation Envoyé par adiGuba Voir le message
    Question subsidiaire : tu veux avoir quel niveau de vérification des paramètres ? A la compilation ou à l’exécution ?

    Parce qu'en fait je me demande si une simple varargs ne serait pas suffisant
    Non ?
    Oui :-)
    Effectivement cela me suffit, car pour l'instant je passe par des listes d'arguments que je cast.

    Du coup, petite question supplémentaire : quel est le problème avec les varargs qui ont été critiqué plus haut (du style, "moins on les utilise mieux c'est") ?
    Est ce déconseillé ? Performance, compilation, lisibilité, etc. ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2009, 18h06
  2. Réponses: 7
    Dernier message: 21/08/2008, 11h57
  3. [RegEx] preg_replace : utiliser une fonction dans les paramètres
    Par Hell dans le forum Langage
    Réponses: 2
    Dernier message: 24/05/2008, 19h32
  4. Ajout de variable (par le code) dans les Paramètres d'application
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 13
    Dernier message: 31/07/2007, 17h50
  5. passer un & dans les paramètres de la page
    Par see++ dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 08/03/2006, 16h48

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