1

Bonjour tout le monde. Je viens à vous car la personne qui a besoin d'aide est très timide mais également car elle ne veut pas arriver en hurlant "URGENT" sur son problème (qui l'est).

En gros, ils ont un cursus avec un peu de Java dedans et en gros, les fonctions suivantes sont à refaire et à coder "à-la-mano". Du contrôle de données principalement.

Sans réaliser tout l'exercice nécessairement à sa place, quelqu'un aurait des pistes, des bouts de code à fournir, des "goods practices", de liens.

Je ne veux pas dramatiser sur le contexte mais ça serait carrément super d'avoir un bon pédagogue.

J'offre un ticket pour un slam à celui qui pourra l'aider.

Merci d'avance.
package org.esgi.javaweb; import java.text.SimpleDateFormat; public interface StringUtility { /** * Test if the String is empty or null * @param input The String to test * @return true if String is empty or null, else false. */ public boolean isEmpty(String input); /** * Test if the String is a representation of an Integer * @param input The String to test * @return true if this is an Integer, else false */ public boolean isInteger(String input); /** * Test if the String is a representation of a Float value * Integer are float. * @input The String to test * @return true if this is an Integer, else false */ public boolean isNumeric(String input); /** * Test if the String is a valid representation of a email. * @param input The String to test * @return true if it's an email. */ public boolean isEmail(String input); /** * Test if the String is a representation of a boolean. * Accepted values are : TRUE, true, FALSE, false, 0, 1 * * @param input The String to test * @return true if it is a boolean */} public boolean isBoolean(String input); /** * Check if the String contains a representation of * a Date according to the Giving pattern. * @see SimpleDateFormat for the possibles patterns. * @param pattern the pattern the input must be conform * @param input the String to Test * @return */ public boolean isDate(String pattern, String input); /** * Remove SQL for preventing code and data injection * in server Side. * @param input a Suspicious String. * @return a clear String. */ public String removeSQL(String input); /** * Remove Javascript for preventing code injection * in client side. * * @param input a Suspicious String. * @return a clear String. */ public String removeJavascript(String input); /** * Remove all Xml Tags * @param input The String to parse. * @return a copy of the String without tags. */ public String removeXmlTags(String input); /** * Remove tags from the same kind. * @param tag, The kind of tag to remove * @param input The String to parse. * @return a copy of the String without tags. */ public String removeXmlTags(String /** * remove accents and special char create a readable ascii string. - Accents letters are binded to (ie é=>e, à=>a ...) - specials chars (spaces, tabs, tag, String input); from a String to their ascii representation ... ) are replaced * * * * * * * * */ width the _ symbol. @param input The String to parse. @return the normalized String public String normalize(String input);
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

2

Il y a un problème avec la dernière méthode, non ?

3

Bon, on y voit déjà un peu plus clair.

import java.text.SimpleDateFormat ;


public interface StringUtility
{
   /**
    * Test if the String is empty or null
    * @param input The String to test
    * 
    * @return true if String is empty or null, else false.
    */
   public boolean isEmpty( String input ) ;





   /**
    * Test if the String is a representation of an Integer
    * @param input The String to test
    * 
    * @return true if this is an Integer, else false
    */

   public boolean isInteger( String input ) ;





   /**
    * Test if the String is a representation of a Float value
    * Integer are float.
    *
    * @input The String to test
    *
    * @return true if this is an Integer, else false
    */
   public boolean isNumeric( String input ) ;





   /**
    * Test if the String is a valid representation of a email.
    * @param input The String to test
    *
    * @return true if it's an email.
    */
   public boolean isEmail( String input ) ;





   /**
    * Test if the String is a representation of a boolean.
    * Accepted values are : TRUE, true, FALSE, false, 0, 1
    *
    * @param input The String to test
    *
    * @return true if it is a boolean
    */
   public boolean isBoolean( String input ) ;





   /**
    * Check if the String contains a representation of a Date according
    * to the giving pattern.
    *
    * @see SimpleDateFormat for the possibles patterns.
    * @param pattern the pattern the input must be conform
    * @param input the String to Test
    *
    * @return
    */
   public boolean isDate( String pattern, String input ) ;





   /**
    * Remove SQL for preventing code and data injection in server Side.
    * @param input a Suspicious String.
    *
    * @return a clear String.
    */
   public String removeSQL( String input ) ;





   /**
    * Remove Javascript for preventing code injection in client side.
    * @param input a Suspicious String.
    *
    * @return a clear String.
    */
   public String removeJavascript( String input ) ;





   /**
    * Remove all Xml Tags
    * @param input The String to parse.
    *
    * @return a copy of the String without tags.
    */
   public String removeXmlTags( String input ) ;

   // /** * Remove tags from the same kind.
   // * * @param tag, The kind of tag to remove * @param input The String to
   // parse. * @return a copy of the String without tags. */
   // public String removeXmlTags(String /**
   // * remove accents and special char
   // create a readable ascii string. - Accents letters are binded to
   // (ie é=>e, à=>a ...) - specials chars (spaces, tabs,
   // tag, String input);
   // from a String to their ascii representation ... ) are replaced
   // width the _ symbol. @param input The String to parse.
   // @return the normalized String public String normalize(String input);
}

4

C'est à faire à la main jusqu'à quel point ?

5

Integer are float.
\o/

6

(pourquoi écrire en anglais des commentaires qui sont visiblement traduits du français ? confus)

Pour les IsMachin(), il y a la méthode TryParse en .NET, j'imagine qu'il doit y avoir un équivalent en Java.
Pen^2 (./3) :
Remove Javascript for preventing code injection in client side.
Danger !
Essayer de "nettoyer" les données entrantes n'est pas une bonne méthode contre les injections SQL, il y a toujours le risque d'oublier un cas de figure.
Utiliser à la place des requêtes SQL avec des paramètres, c'est plus simple et plus sûr.
Pen^2 (./3) :
* Remove Javascript for preventing code injection in client side.
Idem. À moins qu'on autorise un sous-ensemble du HTML, il est beaucoup plus simple d'échapper les caractères spéciaux en HTML (<, >, &, ;, ...), du coup on est protégé contre toutes les balises (et donc contre les injections de script).
Pen^2 (./3) :
create a readable ascii string. - Accents letters are binded to // (ie é=>e, à=>a ...)
Mauvaise idée si tu vises d'autres langues que le français. Dans certains cas, changer les accents change complètement le sens.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

(pitié, je n'ai pas écrit ça, hein embarrassed)

8

(PS : urgent pour quand ?)

9

Zerosquare (./7) :
Pour les IsMachin(), il y a la méthode TryParse en .NET, j'imagine qu'il doit y avoir un équivalent en Java.


public EPIC isInt(string machin) {
    try {
        int result = Integer.decode(machin);
        return EPIC.WIN;
    } catch(NumberFormatException e) {
        return EPIC.FAIL;
    }
}

10

(bien sûr on peut faire ça, mais il n'y a pas d'équivalent direct de cette méthode ?)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

11

pas que je connaisse, même si je peux toujours me tromper. On utilise très souvent les exceptions pour signaler des cas d'erreurs en java, et puis pourquoi dupliquer le code si decode() fait déja le job?

12

Pen^2 (./8) :
(PS : urgent pour quand ?)

Urgent pour cette nuit.

D'où le fait que ne mette la pression à quiconque. C'est vraiment pour savoir si vous avez des pistes, des idées. Des lignes simples si c'est possible.

Le contexte est très particulier pour la personne et la précipitation de la chose. Je n'aime pas moi-même qu'on arrive en demandant de cette manière, mais tout ce qu'il y a de bon à prendre, il le prend.

Je n'y connais personnellement pas grand chose en Java alors pour les commentaires en anglais, je ne sais pas trop.

L'idée est qu'il souhaiterait "remplir" ces fonctions avec les méthodes adéquates.

Vous avez des idées les java-istes ?
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

13

squalyl (./11) :
pas que je connaisse, même si je peux toujours me tromper. On utilise très souvent les exceptions pour signaler des cas d'erreurs en java, et puis pourquoi dupliquer le code si decode() fait déja le job?

Parce que c'est dégueulasse. Je me demande vraiment où t'as appris à coder cheeky pas que je mette en doute tes capacités, mais plutôt que je serais prêt à émettre quelques doutes sur les qualités pédagogiques de ceux qui t'ont appris ces "bonnes pratiques" grin
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

14

je vois pas trop de quoi tu parles trifus c'est quoi ton alternative alors? faire un parseur à la main sans enregistrer le résultat ? triso les runtime exceptions sont pas faites pour les chiens, elles sont la méthode standard pour rapporter les cas exceptionnels. La méthode demandée teste l'ocurrence d'un comportement exceptionnel.

public interface StringUtility 
{ 
	public boolean isEmpty( String input ) {
		if(input==null) return true;
		return input.length==0;
	}
	
	public boolean isInteger( String input ) {
		if(input==null) return false;
		try {
			long john = Long.parseLong(input);
			return true;
		} catch(NumberFormatException e) {
			return false;
		}
	}
	
	public boolean isNumeric( String input ) {
		if(input==null) return false;
		try {
			double v = Double.parseDouble(input);
			return true;
		} catch(NumberFormatException e) {
			return false;
		}
	}
	
	public boolean isEmail( String input ) {
		
	}
	
	public boolean isBoolean( String input ) {
		if(input==null) return false;
		if(input.equalsIgnoreCase("true")) return true;
		if(input.equalsIgnoreCase("false")) return true;
		if(input.equals("0") || input.equals("1") return true;
		return false;
	}
	
	public boolean isDate( String pattern, String input ) {
		//TODO
	}
	
	public String removeSQL( String input ) {
		//TODO
	}
	
	public String removeJavascript( String input ) {
		//TODO
	}
	
	public String removeXmlTags( String input ) {
		//TODO
	}
	
	public String normalize(String input) {
		return input.replace('é','e').replace('è','e').replace('à','a').exetera;
	}
}

15

squalyl (./14) :
je vois pas trop de quoi tu parles trifus

Hint: dans Exception il y a "cas exceptionnel". Que isInt("z") retourne false n'est pas vraiment exceptionnel, c'est exactement ce que tu as demandé cheeky
Après je peux comprendre que tu considères exceptionnel que ton code marche, mais cette sémantique n'est pas équivalente avec celle de l'exception en POO cheeky
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

16

c'est une RuntimeException. Il est prévu qu'elle se produise sans que ce soit un bug.

quand on parse un int, trouver Z est un comportement qui empêche la fonction parse() de continuer mais ce n'est pas un bug. On ne fait que catcher cette interruption et la transformer en boléen.

17

En C# les méthodes ".TryParse" ont précisément pour objectif d'éviter de lancer des exceptions, parceque lancer des exceptions c'est lent et que quand c'est pour la catcher 2 lignes plus bas, on évite grin (mais bon, je veux bien croire que les performances en Java, c'est une notion assez vague tongue #troll#)

Sinon pour compléter le post de squalyl, même si ça n'est pas trop dans les habitudes du forum de poster du code prêt à copier-coller...

(100% google powered, je ne fais pas de Java, donc c'est peut-être totalement faux ^^)
public boolean isDate( String pattern, String input ) { SimpleDateFormat sdf = SimpleDateFormat (pattern); return sdf.parse (input, new ParsePosition (0)) != null; } public String removeXmlTags( String input ) { return input.replaceAll ("<[^>]*>", ""); }
Pour celles qui suppriment les "SQL injections" et le javascript, je pense qu'il faudrait avoir plus de précisions, parceque là comme ça il me semble que ça peut correspondre à pas mal de trucs.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

18

lancer des exceptions est rapide en java embarrassed

19

Bien sûr oui
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

20

C'est pas une bonne pratique de lancer des exceptions à tout va.
En théorie déjà parce qu'une exception dénote un cas exceptionnel, qui n'est pas censé arriver (s'il arrive alors c'est que ton appli a PLANTE, pas juste qu'une méthode ne peut pas continuer pour une raison ou une autre), si bien que certains langages ou libs (comme celle de Objective-C il me semble) ne te garantissent même pas que le programme pourra continuer proprement après une exception (sans leak ou autre).
Et en pratique, c'est lent et ça cause plein de problèmes, dès que tu fais du RMI, dès que tu fais par exemple interagir des EJB avec des SpringBean, et j'en passe. Je ne compte pas les fois où on est revenu en arrière en remplaçant les possibles exceptions par une énumération comme valeur de retour.
Mais évidemment si tu es cantonné dans ton monde Java tu ne peux pas comprendre, car c'est un langage qui du fait qu'il est mal foutu force à utiliser des exceptions là où il ne faudrait pas. L'absence de paramètres out par exemple qui permettrait de faire:
[NSString stringWithContentsOfURL:@"http://caca.com" error:&errorDetailsIfNeeded]
Même le fait qu'on ne puisse pas se connecter à un serveur n'est pas forcément un cas exceptionnel, c'est quelque chose qui peut arriver, à gérer. Si par contre l'appli ne peut pas fonctionner du tout sans connexion, alors là seulement lancer une exception en cas d'échec serait justifié.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

21

Brunni (./20) :
C'est pas une bonne pratique de lancer des exceptions à tout va.
va le dire aux implémenteurs de la JRE
Brunni (./21) :
En théorie déjà parce qu'une exception dénote un cas exceptionnel, qui n'est pas censé arriver (s'il arrive alors c'est que ton appli a PLANTE
Si un utilisateur de webservice ou autre t'envoie une mauvaise valeur et que ça divise par zéro, tu préfères dire OH SHI-- I DIVIDED BY ZERO et que ton jboss fasse harakiri parce que c'est exceptionnel, ou intercepter la RuntimeException et signaler l'erreur à l'utilisateur?
Brunni (./21) :
si bien que certains langages ou libs (comme celle de Objective-C il me semble) ne te garantissent même pas que le programme pourra continuer proprement après une exception
RAF si ce sont des langages de merde. On parle pas d'address error 68k hein, mais de langage managé qui s'exécute dans une vm (j'ai pas dit virtualisation hein, mais vm java)
Brunni (./21) :
si tu es cantonné dans ton monde Java tu ne peux pas comprendre
laught
Brunni (./21) :
[NSString stringWithContentsOfURL:@"http://caca.com" error:&errorDetailsIfNeeded]
sick

22

iwannabeamaki (./17) :
En C# les méthodes ".TryParse" ont précisément pour objectif d'éviter de lancer des exceptions, parceque lancer des exceptions c'est lent et que quand c'est pour la catcher 2 lignes plus bas, on évite biggrin.gif (mais bon, je veux bien croire que les performances en Java, c'est une notion assez vague tongue.gif #troll#)


En fait, il n'est vraiment pas JAVA (si je peux aider et/ou éclaircie), mais c'est un truc imposé, même si ça n'a rien à voir avec son cursus en fait ("marketing web").
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

23

T'es juste détestable squalyl, ça me ferait plaisir de répondre et d'argumenter car c'est un sujet qui m'intéresse, mais tu es insupportable.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

24

on peut pas plaire à tout le monde. l'objective C a une syntaxe que je trouve moche, what else?

je demande juste que tu me prouves pourquoi les runtime exceptions ne sont pas un bon moyen de retourner des erreurs, avec de vrais arguments, et ce que tu proposes pour les remplacer. un enum ne me convient pas car il faut avoir la possibilité de renvoyer la valeur en cas de succès. on pourrait imaginer des paramètres par référence ou des objets mutables pour renvoyer des données par les paramètres, rien n'empêche de le faire d'ailleurs.

et puis de toute on se bat sur des choix d'implémentations qui nous dépassent, alors c'est tellement facile de raconter de la merde tongue

25

Vous pensez que c'est vraiment le bon endroit pour troller sur le Java ? neutral
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

26

J'ai pris l'Obj-C parmi d'autres. La syntaxe n'a rien à voir avec les qualités intrinsèques.
Ensuite une solution parmi d'autres je t'en ai montré: le doSomething:withError: en Obj-C.
Mes arguments ne sont pas plus faibles que les tiens qui reposent sur le fait que "chez sun ils ont fait comme ça alors c'est bien".
Zerosquare (./25) :
Vous pensez que c'est vraiment le bon endroit pour troller sur le Java ? neutral

Ben oui, la réponse a été donnée ^^ pour les pistes ou best practises c'est un exercice presque trivial, donc il n'y a pas de débat à avoir, il faut qu'il se réfère à la théorie de son cours et à l'API String.
La seule chose que j'ajouterais c'est que les expressions régulières apportent une solution élégante au problème. Vu ce qui est demandé, il a sûrement dû voir ça en cours, et cet exercice tourne là autour. Et ça fait aussi office d'argument contre les RuntimeException's.
(Hé oui, peut être que parseInt("2147483648") va exceptionner car overflow, alors que c'est un entier parfaitement valide hehe)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

27

Puisque squalyl n'a pas l'air convaincu, histoire d'apporter quelques justifications à ce que je disais en ./17 :

- Les exceptions en Java sont lentes : http://blog.developpez.com/adiguba/p1075/java/perfs/exception-et-performances/
- Les préconisations de MS pour C# : http://msdn.microsoft.com/en-us/library/ms229009.aspx

Entre autres :
MSDN:
Consider the TryParse pattern for members that may throw exceptions in common scenarios to avoid performance problems related to exceptions.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

28

C'est vrai que c'est super courant de lancer quelques millions (ou même milliers (ou même centaines)) d'exceptions dans une boucle tritop
À vouloir mesurer n'importe quoi n'importe comment, on trouve... n'importe quoi, aussi.

D'ailleurs, les regexp ne sont pas particulièrement rapides non plus, hein cheeky (par contre elles éliminent le problème d'overflow, OK).

29

Ben non, à réutiliser du code de merde on obtient Eclipse Netbeans glassfish <insert any java software here>. Mettons que je veux réutiliser la super méthode de squalyl pour parser un fichier de valeurs séparées par des virgules, et qu'un champ peut contenir soit des entiers, soit des floats, soit des identificateurs, je vais faire:
String token = fichier.nextToken();
if (classePourrie.isInteger(token))
    recordSet.addField(Integer.parseInt(token));
else if (classePourrie.isFloat(token))
    ...

Et si mon client a justement un recordset de même 10'000 lignes, ben l'exception catchée à chaque 'if' je vais la sentir passer.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

30

Brunni (./29) :
Et si mon client a justement un recordset de même 10'000 lignes, ben l'exception catchée à chaque 'if' je vais la sentir passer.


d'après le lien de Bob :
250 ms pour 50 000 exceptions
fichtre !


Bon, dans l'absolu, je suis plus ou moins d'accord avec toi, mais faut pas déconner non plus.