Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

utilité d'un trim sur une chaine vide ?

15 réponses
Avatar
Bruno13
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code qui
vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine concernée.
Mais ici la chaine est "" qui par définition ne contient rien.
Qui peut m'expliquer ce mystère ???

10 réponses

1 2
Avatar
Cenekemoi
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code
qui vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine
concernée. Mais ici la chaine est "" qui par définition ne contient
rien.
Qui peut m'expliquer ce mystère ???


Je pense sincèrement qu'il n'y en a pas !

Le "trim()" ne sert évidemment à rien et vous êtes bien bon de ne pas
citer l'ouvrage où cette ineptie apparait....

--
Cordialement, Thierry ;-)

Avatar
Bruno13
"Cenekemoi" a écrit dans le message de
news:45129f7f$0$28134$
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code
qui vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine
concernée. Mais ici la chaine est "" qui par définition ne contient
rien.
Qui peut m'expliquer ce mystère ???


Je pense sincèrement qu'il n'y en a pas !

Le "trim()" ne sert évidemment à rien et vous êtes bien bon de ne pas
citer l'ouvrage où cette ineptie apparait....

--
Cordialement, Thierry ;-)



Trop bon ... trop con !!!
Je me lance : il s'agit de "Développement Java sous Struts" de Jean charles
FELICITE (page109)
je précise quand même que je trouve ce bouquin pas trop mal.


Avatar
Dominique
je pense qu'il s'agit d'une erreur de frappe , ce serait plutôt :

if (login..trim().equals(""){ //traitement de l'erreur

"Bruno13" a écrit dans le message de news:
45129dc3$0$24490$
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code qui
vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine
concernée.
Mais ici la chaine est "" qui par définition ne contient rien.
Qui peut m'expliquer ce mystère ???




Avatar
Bruno13
"Dominique" a écrit dans le message de
news:4512a2ac$0$429$
je pense qu'il s'agit d'une erreur de frappe , ce serait plutôt :

if (login..trim().equals(""){ //traitement de l'erreur

"Bruno13" a écrit dans le message de news:
45129dc3$0$24490$
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code qui
vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine
concernée.
Mais ici la chaine est "" qui par définition ne contient rien.
Qui peut m'expliquer ce mystère ???





Je suis d'accord avec toi pour le codage correct du test :
if (login.trim().equals(""){ //traitement de l'erreur
Je ne sais pas s'il s'agit d'une erreur de frappe car cette ligne est
répétée plusieurs fois sur d'autres pages (mais il s'agit peut être d'un
malencontreux copié/collé)
Quoi qu'il en soit mon propos n'était pas d'accabler l'auteur mais de
m'assurer qu'il n'y avait pas un truc qui m'aurait échapper dans la
compréhension des Strings.

Merci
Bruno


Avatar
TestMan
Salut,

Dans un bouquin à la réputation établie, j'ai trouvé ce bout de code qui
vérifie la validité d'un login.

if (login.equals("".trim()){ //traitement de l'erreur ...

Je ne comprend pas l'utilité du trim().

J'ai compris que trim enlève les espaces avant et après la chaine concernée.
Mais ici la chaine est "" qui par définition ne contient rien.
Qui peut m'expliquer ce mystère ???


Bonsoir,

Emm... ça ressemble à une coquille, je m'attendrais plutôt à :

assert(login!=null);
if("".equals(login.trim()){
// traitement erreur
}

Optimisé ;-)

A+
TM

Avatar
Sylvain
TestMan wrote on 22/09/2006 00:50:

assert(login!=null);
if("".equals(login.trim()){
// traitement erreur
}

Optimisé ;-)


optimisé ? ben justement...

- l'erreur 1 est évidente et largement discuté, je passe.

- l'erreur 2 est de virer les blancs dans un temporaire:

trim retournes une copie de l'instance dans lesquels les blancs sont
virés, or si l'auteur pense qu'un mot de passe ne peut pas contenir
d'espace en début ou en fin, il fera obligatoirement par la suite:

if (login.trim().equals(leMotDePasseDeReference)) ...

et ceci peut être dans une boucle.

il aurait donc fallu:

// étant donné
String typedLogin;
...
// définir
String workingLogin = typedLogin.trim();
// puis
if (workingLogin.equals("")) ...

- mais erreur 3: la méthode equals reçoit un objet (pas un char*
global!!); donc on créé ici un autre temporaire (new String(""))
également inutilement couteux.

il aurait du coder:

if (workingLogin.length() == 0) ...

ah, l'optimisation, ça se perd ! ... ;)

Sylvain.

Avatar
TestMan
TestMan wrote on 22/09/2006 00:50:

assert(login!=null);
if("".equals(login.trim()){
// traitement erreur
}

Optimisé ;-)


optimisé ? ben justement...

- l'erreur 1 est évidente et largement discuté, je passe.

- l'erreur 2 est de virer les blancs dans un temporaire:

trim retournes une copie de l'instance dans lesquels les blancs sont
virés, or si l'auteur pense qu'un mot de passe ne peut pas contenir
d'espace en début ou en fin, il fera obligatoirement par la suite:

if (login.trim().equals(leMotDePasseDeReference)) ...

et ceci peut être dans une boucle.

il aurait donc fallu:

// étant donné
String typedLogin;
...
// définir
String workingLogin = typedLogin.trim();
// puis
if (workingLogin.equals("")) ...

- mais erreur 3: la méthode equals reçoit un objet (pas un char*
global!!); donc on créé ici un autre temporaire (new String(""))
également inutilement couteux.

il aurait du coder:

if (workingLogin.length() == 0) ...

ah, l'optimisation, ça se perd ! ... ;)

Sylvain.


Effectivement, si le cas le plus probable est un utilisateur qui rentre
plein de login vide (ou avec que des espaces) vous serez plus rapide au
final ! Mais connaissez vous beaucoup d'utilisateurs qui font ça à
longeur de journée (sauf les testeurs) ? Et pensez-vous que votre
système monte mieux en charge grace à ce code ?

Je persiste donc.

En utilisant une méthode sur constante de chaine vide "" (qui est
interné dans le pool de constante), on crée un point chaud à cet
emplacement sur cet objet qui va être optimisé par le JIT (hotspot, il
adore les points chauds !).

Ainsi, on optimise tous les cas et pas seulement ceux ou l'utilisateur
n'a rien tapé (qui arrivera d'ailleur certainement assez rarement ...
mais c'est un autre débat) et on conserve un code épuré et lisible.

A chacun son style ;-)

A+
TM


Avatar
Sylvain
TestMan wrote on 22/09/2006 03:56:

En utilisant une méthode sur constante de chaine vide "" (qui est
interné dans le pool de constante), on crée un point chaud à cet
emplacement sur cet objet qui va être optimisé par le JIT (hotspot, il
adore les points chauds !).


un point quoi ? y-a un pragma "c'est chaud" dans Java ??

le gestionnaire de références peut garder (ou pré-construire) une
référence à une String vide soit, il ira dans ce cas, vérifier que la
réf. existe toujours dans le pool, c'est pas vraiment mieux.

Ainsi, on optimise tous les cas et pas seulement ceux ou l'utilisateur
n'a rien tapé (qui arrivera d'ailleur certainement assez rarement ...
mais c'est un autre débat) et on conserve un code épuré et lisible.


pas sur de piger, "JIT" c'est "Just In accordance with Typed-in text"?
que la saisie soit nulle ou pas le code est, si JIT, optimisé pour faire
une comparaison ente le contenu de 2 instances de String.

et le vrai besoin est plutôt ici de faire un test sur la longueur d'une
instance; test sûrement nécessaire (dans le contexte) pour vérifier que
la saisie respecte les longueurs min et max attendues pour un mot de
passe (de telles règles étant très souvent présentes).

A chacun son style ;-)


à ça, je consens sans peine.

Sylvain.

Avatar
TestMan
TestMan wrote on 22/09/2006 03:56:

En utilisant une méthode sur constante de chaine vide "" (qui est
interné dans le pool de constante), on crée un point chaud à cet
emplacement sur cet objet qui va être optimisé par le JIT (hotspot, il
adore les points chauds !).


un point quoi ? y-a un pragma "c'est chaud" dans Java ??


<reponse-au-premier-degre>
Point chaud / hot spot, la technique qu'utilise le compilateur
juste-à-temps (Just-In-Time Compiler) de la JVM :
http://java.sun.com/products/hotspot/docs/whitepaper/Java_HotSpot_WP_Final_4_30_01.html#pgfId82375
</reponse-au-premier-degre> non mais :)

le gestionnaire de références peut garder (ou pré-construire) une
référence à une String vide soit, il ira dans ce cas, vérifier que la
réf. existe toujours dans le pool, c'est pas vraiment mieux.


Ce n'est pas "peut" ! Il le fait tout le temps dans le cas en instance ;-)

Voir :
http://www.xyzws.com/faq.do?catúq&article=3

Ainsi, on optimise tous les cas et pas seulement ceux ou l'utilisateur
n'a rien tapé (qui arrivera d'ailleur certainement assez rarement ...
mais c'est un autre débat) et on conserve un code épuré et lisible.


pas sur de piger, "JIT" c'est "Just In accordance with Typed-in text"?
que la saisie soit nulle ou pas le code est, si JIT, optimisé pour faire
une comparaison ente le contenu de 2 instances de String.

et le vrai besoin est plutôt ici de faire un test sur la longueur d'une
instance; test sûrement nécessaire (dans le contexte) pour vérifier que
la saisie respecte les longueurs min et max attendues pour un mot de
passe (de telles règles étant très souvent présentes).


Qui code encore ses test de validation techniques à la main ? :P
Hibernate Validator en force ...

A chacun son style ;-)


à ça, je consens sans peine.


A+
TM


Avatar
KiLVaiDeN
TestMan wrote:

assert(login!=null);
if("".equals(login.trim()){
// traitement erreur
}

Optimisé ;-)


Tout à fait d'accord avec ce bout de code, mis à part le fait qu'il est
parfois utile d'inclure le test à null dans le if, afin d'en faire un
traitement d'erreur personnalisé ( plutôt que l'assert ) donc :

[code]*

if( login == null || "".equals(login.trim()) ) {
// Traitement de l'erreur de paramètre
}

*[/code]

Encore plus optimisé ;-)

K

1 2