158 votes

Attribuer une variable dans une condition si conditionnelle, bonne pratique ou non?

J'ai déménagé un ans de classique OO langages tels que Java, JavaScript. Le code suivant est certainement pas recommandé (ou même pas correct) en Java:

if(dayNumber = getClickedDayNumber(dayInfo))
{
    alert("day number found : " + dayNumber);
}
function getClickedDayNumber(dayInfo)
{
    dayNumber = dayInfo.indexOf("fc-day");
    if(dayNumber != -1) //substring found
    {
        //normally any calendar month consists of "40" days, so this will definitely pick up its day number.
        return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8));
    }
    else return false;
}

Fondamentalement, je viens de découvrir que je peux affecter une variable à une valeur de un si de l'état, et de vérifier immédiatement la valeur assignée comme si il est un booléen.

Pour un pari plus sûr, j'ai l'habitude de séparer en deux lignes de code, d'attribuer d'abord, puis vérifiez la variable, mais maintenant que j'ai trouvé cela, je me demandais simplement s'il est de bonne pratique ou pas dans les yeux expérimentés et les développeurs JavaScript?

166voto

Matthew Crumley Points 47284

Je ne le recommande pas. Le problème est, il ressemble à une erreur commune où vous essayez de comparer des valeurs, mais l'utilisation d'un seul = au lieu de == ou ===. Par exemple, lorsque vous voyez ceci:

if (value = someFunction()) {
    ...
}

vous ne savez pas si c'est ce qu'ils signifient, ou s'ils ont l'intention d'écrire ceci:

if (value == someFunction()) {
    ...
}

Si vous voulez vraiment faire de l'assignation en place, je vous recommande de faire une comparaison explicite ainsi:

if ((value = someFunction()) === <whatever truthy value you are expecting>) {
    ...
}

39voto

Je ne vois aucune preuve que ce n'est pas une bonne pratique. Oui, cela peut sembler être une erreur, mais il est facile d'y remédier par des commentaires judicieux. Prenons par exemple:

 if (x = processorIntensiveFunction()) { // declaration inside if intended
    alert(x);
{
 

Pourquoi cette fonction devrait-elle être autorisée à s'exécuter une deuxième fois avec:

 alert(processorIntensiveFunction());
 

Parce que la première version semble mauvaise? Je ne peux pas accepter cette logique.

22voto

SHiNKiROU Points 6052

Je l'ai fait plusieurs fois. Pour contourner l'avertissement JavaScript, j'ajoute deux parenthèses:

 if ((result = get_something())) { }
 

Vous devriez l’éviter. Si vous voulez vraiment l’utiliser, écrivez un commentaire au-dessus indiquant ce que vous faites.

3voto

Nitrodist Points 721

Vous pouvez également effectuer des affectations dans des instructions if en Java. Un bon exemple serait de lire quelque chose et de l'écrire:

http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new

Le code:

 // Copies src file to dst file.
// If the dst file does not exist, it is created
void copy(File src, File dst) throws IOException 
{
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
 

3voto

Ben Zotto Points 32105

Vous pouvez aussi le faire en Java. Et non, ce n'est pas une bonne pratique. :)

(Et utilisez les === en Javascript pour l'égalité typée. Lisez le livre de Crockford The Good Parts sur JS.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X