Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/11/2012, à 22:48

Xun

[JAVA] Gestion des arguments lors de l’exécution

Bonsoir,

Actuellement en plein projet pour la fac, nous devons implémenter notre programme avec la gestion d'arguments.

En effet, nous devons pouvoir gérer comme suivant:

 java PROJET fichier1 [-param1 -param2[:complement param2 optionnel] ] [-param3 -param4] 

En sachant que param1 et 3 sont incompatibles.

Donc ma question est: comment faire ?
Actuellement, mon programme contient une succession de if...else alourdissant pas mal à l’exécution.

Bien sûr, j'ai cherché sur internet et je suis tombé sur ce site ou encore celui là.
Le problème est que ces méthodes ne sont pas "populaires". N'y-a-t'il pas une meilleure gestion de ces arguments ?

Appelle-t-on ce que j'appelle "arguments" des arguments ? Mes recherches ne m'ont pas vraiment débloquées.

Merci smile

Dernière modification par Xun (Le 28/11/2012, à 22:49)

Hors ligne

#2 Le 29/11/2012, à 00:39

Maisondouf

Re : [JAVA] Gestion des arguments lors de l’exécution

Quelque soit le langage, les arguments sont toujours traités de la même manière, soit des (if then else) en cascade, soit des (switch, case, break).

C'est pas beau, mais c'est béton et surtout plus rapide que tu le penses.

EDIT: Après pour des cas comme le tien (avec une interdiction), ça peut être un mix des deux solutions.

Dernière modification par Maisondouf (Le 29/11/2012, à 00:41)


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 29/11/2012, à 07:23

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Donc il n'y a pas de "jolies" manières ou de façons magiques pour gérer ça ? Venant de java ça m'étonne en fait ... On nous l'a tellement vendu comme étant un langage pensé que je m'attendais à une méthode élaborée.

Merci de cette réponse rapide !

Hors ligne

#4 Le 29/11/2012, à 07:50

ssdg

Re : [JAVA] Gestion des arguments lors de l’exécution

Bah y'a : http://commons.apache.org/cli/usage.html qui rend l'écriture un peu plus jolie,... mais ça fini quand même en suite de ifs.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#5 Le 29/11/2012, à 11:23

claudius01

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonjour,

J'utilise personnellement le package java-getopt qui propose un accès aux arguments comme en Langage C (sans if / else et arguments définis dans n'importe quel ordre ;-) et téléchargeable ici


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 29/11/2012, à 11:32)

Hors ligne

#6 Le 30/11/2012, à 07:06

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Merci beaucoup pour cette précision, ça ressemble grandement à ce que j'avais vu big_smile

Merci à tous wink

Hors ligne

#7 Le 06/12/2012, à 17:02

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonsoir,

Je ne comprends pas.
J'essaie d'utiliser la classe Options, donc cette classe là; Eclipse me signale pas mal d'erreurs...

Impossible donc de générer des arguments type

fichier1 [-param1 -param2[:complement param2 optionnel] ] [-param3 -param4] 

Hors ligne

#8 Le 07/12/2012, à 15:24

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

up

Hors ligne

#9 Le 07/12/2012, à 16:22

Epehj

Re : [JAVA] Gestion des arguments lors de l’exécution

Salut,

C'est quoi la question du coup?


Linux user #447629 - Ubuntu user # 21770
C'est en sciant que Léonard devint scie

Hors ligne

#10 Le 07/12/2012, à 16:54

claudius01

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonjour Xun,

- Désolé de ne pas répondre sur Options() ...
- J'imagine que c'est la syntaxe "-param2[:complement param2 optionnel]" qui bloque (le reste étant classique)
  => Et mettre entre double guillemets les arguments "complement optionnel" (sans le ':' et sans la répétition "param2"), cela répondrait-il au problème posé, c'est comme cela que je pratique en Langage C pour une liste d'arguments attachés à une option...

Je te donne le résultat avec le package java-getopt :

$ java TestGetOpt -H "localhost 8080" -n 1234

2012-12-07 16:38:40,625 INFO  - TestGetOpt.java:39   - TestGetOpt: Starting in progress...
2012-12-07 16:38:40,625 INFO  - TestGetOpt.java:40   - with:
2012-12-07 16:38:40,625 INFO  - TestGetOpt.java:42   -    [-H]
2012-12-07 16:38:40,625 INFO  - TestGetOpt.java:42   -    [localhost 8080]
2012-12-07 16:38:40,640 INFO  - TestGetOpt.java:42   -    [-n]
2012-12-07 16:38:40,640 INFO  - TestGetOpt.java:42   -    [1234]
2012-12-07 16:38:40,640 INFO  - TestGetOpt.java:75   - case 'H': You picked option 'H' with argument [localhost 8080]
2012-12-07 16:38:40,640 INFO  - TestGetOpt.java:83   - case 'n': You picked option 'n' with argument [1234]
2012-12-07 16:38:40,640 INFO  - TestGetOpt.java:123  - TestGetOpt: Stopped

NB: Je n'ai pas réussi avec la syntaxe que tu souhaites : fichier1 [-param1 -param2[:complement param2 optionnel] ] [-param3 -param4], syntaxe qui me parait lourde avec la répétition du nom de l'option 'param2'


Cordialement, A+
--
Claude

Dernière modification par claudius01 (Le 07/12/2012, à 17:01)

Hors ligne

#11 Le 07/12/2012, à 17:47

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonsoir Claude,

Je ne m'étais pas préoccupé de getOpt parce que je n'en avais pas compris son fonctionnement ...
Mais je l'ai désormais importé par Eclipse et je pense que je peux commencer à l'utiliser.

En fait, quand je dis

 fichier1 [-param1 -param2[:complement param2 optionnel] ] [-param3 -param4] 

je veux signifier

 fichier1 [-param1 -param2[:complement-de-param2-optionnel] ] [-param3 -param4] 

en voulant dire que ça peut être -param1 -param3 -param4 comme -param2 -param3 -param4 ou encore -param2:qqchose -param3.

Je suis en train de voir comment coder ces paramètres, merci de ta réponse smile

Hors ligne

#12 Le 07/12/2012, à 17:57

claudius01

Re : [JAVA] Gestion des arguments lors de l’exécution

Ok Xun, je comprends mieux, le but est de faire comprendre à getopt (ou autre) le bout d'argument:

-param2[:complement-de-param2-optionnel]

avec ':' signifiant "paramètre optionnel" derrière l'option 'param2'


Cordialement, A+
--
Claude

Dernière modification par claudius01 (Le 07/12/2012, à 17:57)

Hors ligne

#13 Le 07/12/2012, à 18:01

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

C'est exactement ça ! smile

Pour le moment, je suis "bloqué" à la déclaration de getOpt; serais-tu d'accord pour m'aider davantage ?

Je déclare actuellement ainsi:

Getopt g = new Getopt("monProgramme", args, "param1::param2::param3::param4")

ne sachant pas vraiment à quoi servent les doubles :: comme dans la doc (j'avoue avoir du mal à la comprendre) -- de ce que j'ai compris les '::' servent à séparer "param1" de "param2" etc... ?)

Hors ligne

#14 Le 07/12/2012, à 21:20

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Bon alors ...

En cette fin de soirée, j'arrive à un code de ce genre:

		    LongOpt[] longopts = new LongOpt[4];
		    StringBuffer sb = new StringBuffer();

		    longopts[0] = new LongOpt("parametre1", LongOpt.NO_ARGUMENT, null, 's');
		    longopts[1] = new LongOpt("parametre2", LongOpt.OPTIONAL_ARGUMENT, null, 'm');
		    longopts[2] = new LongOpt("parametre3", LongOpt.OPTIONAL_ARGUMENT, sb, 'c'); 
		    longopts[3] = new LongOpt("parametre4", LongOpt.NO_ARGUMENT, null, 'h');
		    Getopt g = new Getopt("Hosto", args, "-:s::m:a::c::h::b",longopts);
		    int c;
		    String arg;
		    while((c=g.getopt())!=-1){
		    	switch(c){
		    	case 's':
		    		arg = g.getOptarg();
		    		System.err.println("parametre1");
		    		break;
		    	case 'm':
		    		arg=g.getOptarg();
		    		System.err.println("parametre2");
		    		//System.exit(0);
		    		break;
		    		
		    	case 'c':
		    		arg=g.getOptarg();
		    		System.err.println("parametre4");
		    		//System.exit(0);
		    		break;
		    		
		    	default:
		    		System.err.println("getopt() returned "+c);
		    		//help();
		    		break;
		    	}
		    }

Je cherche vraiment hein! J'essaie de bien lire la doc, mais elle m'est vraiment difficile et je commence à être dégouté de ce projet. Cette gestion d'argument n'est qu'en fait qu'un plus puisque celle-ci a déjà été faite avec beaucoup (beaucoup...trop!) de if/else et c'est juste histoire d'avoir une meilleure/plus belle gestion des arguments, ainsi que pour de nouvelles connaissances, que je fais cela.

Hors ligne

#15 Le 09/12/2012, à 20:49

claudius01

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonsoir Xun,

Patience, le problème que tu soumets n'est pas immédiat pour qui n'a pas pratiqué le getopt() du Langage C ;-)
Je pense que tu as compris le principe (je me permets de copier en fin de réponse une variante de ton programme avec le résultat)

Sinon s'agissant des "::", sauf erreur de ma part la syntaxe du 3rd argument de "new Getopt(...) peut être réduit à "sm:c:h" dans le cas qui t'intéresses. Le ':' derrière la lettre de l'option (courte) indique qu'une valeur est attendue (eg -m et -c ou respectivement --parametre2 et --parametre3 à l'inverse de -s et -h qui n'ont pas de valeurs qui suivent et attendues).

Maintenant, après la collecte des options [et leur(s) argument(s)], un traitement de cohérence est à faire pour chaque option (double définition, valeur absente ou invalide, etc.). Le new Getopt(...) + switch/case que je n'ai pas développé ... désolé.

package Modules;

import gnu.getopt.Getopt;
import gnu.getopt.LongOpt;

public class TestGetOpt {

	public static void getArgs(String args[]) {

		LongOpt[] longopts = new LongOpt[4];
		StringBuffer sb = new StringBuffer();

		longopts[0] = new LongOpt("parametre1", LongOpt.NO_ARGUMENT, null, 's');
		longopts[1] = new LongOpt("parametre2", LongOpt.OPTIONAL_ARGUMENT, null, 'm');
		longopts[2] = new LongOpt("parametre3", LongOpt.OPTIONAL_ARGUMENT, sb, 'c'); 
		longopts[3] = new LongOpt("parametre4", LongOpt.NO_ARGUMENT, null, 'h');
		//Getopt g = new Getopt("Hosto", args, "-:s::m:a::c::h::b",longopts);
		Getopt g = new Getopt("Hosto", args, "sm:c:h",longopts);
		int c;
		String arg;
		while((c=g.getopt())!=-1){
			switch(c){
			case 's':
				arg = g.getOptarg();
				System.err.println("-s or --parametre1 (without value: value [" + arg +"])");
				break;
			case 'm':
				arg=g.getOptarg();
				System.err.println("-m or --parametre2 with [" + arg + "] value");
				//System.exit(0);
				break;
    		
			case 'c':
				arg=g.getOptarg();
				System.err.println("-c or --parametre3 with [" + arg + "] value");
				//System.exit(0);
				break;
    		
			case 'h':
				arg=g.getOptarg();
				System.err.println("-h only (without value) with [" + arg + "] value");
				//System.exit(0);
				break;
    		
			default:
				System.err.println("getopt() returned "+c);
				//help();
				break;
			}
		}
    }

	public static void main(String args[]) throws Exception {

		System.out.println("Test with:");
		for (String arg: args) {
			System.out.println("   [" + arg + "]");
		}
		
		getArgs(args);
		
	}
}


Résultat d'un test:

Test with:
   [-h]
   [--parametre1]
   [-m]
   [arg_m]
   [-c]
   [arg_c]
-h only (without value) with [null] value
-s or --parametre1 (without value: value [null])
-m or --parametre2 with [arg_m] value
-c or --parametre3 with [arg_c] value

Cordialement, A+
--
Claudius

Hors ligne

#16 Le 15/12/2012, à 21:13

Xun

Re : [JAVA] Gestion des arguments lors de l’exécution

Bonsoir Claudius,
Je te remercie de tes explications et de ton code ! Ayant d'autres travaux à effectuer en parallèle j'ai mis de côté un peu mon projet.

Mais je te ferai signe dès que j'ai des questions wink
Merci encore !

Xun

Hors ligne