web-dev-qa-db-fra.com

Faire simple si les déclarations plus courtes

Si nous supposons que nous avons ce petit extrait de code:

string str = "checked";
bool test1;

if (str == "checked")
{
    test1 = true;
}
else
{
    test1 = false;
}

Est-ce une mauvaise pratique de changer une simple déclaration comme celle-ci à ce qui suit?:

bool test2 = (str == "checked");

Parce qu'ils travaillent exactement le même et travaillent comme requis, donc je ne peux pas imaginer comment ce serait. Cependant, en tant que jeune programmeur inexpérimenté, je ne suis pas au courant de savoir si une telle chose est fronçée ou non. Quelqu'un peut-il me dire, si ce n'est pas ok, pourquoi pas?

Le programme de test suivant:

using System;

public class Test
{

    public static void Main()
    {
        string str = "checked";

        bool test1;

        if (str == "checked")
        {
            test1 = true;
        }
        else
        {
            test1 = false;
        }

        bool test2 = (str == "checked");

        bool test3 = (str != "checked");

        Console.WriteLine(test1.ToString());
        Console.WriteLine(test2.ToString());
        Console.WriteLine(test3.ToString());
    }
}

Les sorties:

True
True
False

Toute perspicacité, etc. est appréciée.

6
Felix Weir

Je serais très ennuyé de quelqu'un qui a utilisé la forme longue lorsque la déclaration est aussi simple.

Il allonge que celui qui l'a écrit ne comprend pas les types de données booléens ou ne réalise pas == est indépendant de if.

12
Izkata

Bien que la forme plus courte soit plus élégante et compacte, il y a un avantage sur la forme longue: vous pouvez facilement définir un point d'arrêt à test1 = true, pendant que vous ne pouvez pas avec la forme plus courte.

6
Jonathan

Qui verra votre code?

Si vous pensez que d'autres personnes qui pourraient voir que votre code seront confondues avec des instructions if, utilisez la version complète d'une sortie. De plus, si vous pensez que vous pourriez inverser accidentellement la logique, puis épelez-le.

Exemple:
[.____] Au cours d'un emploi précédent, j'avais des collègues qui nécessitaient la logique complète, épelée. Quand ils ont essayé d'utiliser les doublures, ils obtiendraient régulièrement la logique à l'envers. D'où je suis maintenant, la société est remplie de personnes intelligentes qui feraient très rarement (si jamais) faire cette erreur. Ici, nous nichons les déclarations ternaires if notions sans confusion.

2
Richard

Répondre à l'hypothèse selon laquelle cette déclaration booléenne sera toujours aussi simple, je ne doute pas que la doublure simplifiée:

bool test2 = (str == "checked");

serait suffisant, et cela produit définitivement moins de lignes d'IL. Dans mon expérience avec Mono j'ai trouvé la déclaration d'une ligne produite:

IL_0000: ldstr "test"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldstr "test"
IL_000c: call bool [mscorlib]System.String::op_Equality(string, string)
IL_0011: stloc.1
IL_0012: ldloc.1

Alors que la déclaration traditionnelle if-d'autre produite:

IL_0000: ldstr "test2"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldstr "test2"
IL_000c: call bool [mscorlib]System.String::op_Equality(string, string)
IL_0011: brfalse IL_001d

IL_0016: ldc.i4.1
IL_0017: stloc.1
IL_0018: br IL_001f

IL_001d: ldc.i4.0
IL_001e: stloc.1

IL_001f: ldloc.1
IL_0020: ret
IL_0013: ret

Il semble que, dans mon cas, le compilateur mono a créé plusieurs sous-routines et gère une pile d'appels afin de gérer le si-autre.

Cela étant dit, si votre opération booléenne devient plus complexe, alors pour l'amour de la lisibilité, dans un environnement de développement professionnel, je le changerais au moins pour:

if (/*complex boolean operation*/)
    // set state in case of true evaluation
else
    // set state in case of false evaluation

Sans autre contexte, je ne peux pas vous fournir une meilleure solution.

2
nathandelane