2017-10-03 6 views
0

Je travaille dans un environnement qui met lentement à jour les anciens c vers C++. Les enums non-classe sont souvent utilisés dans les déclarations d'égalité. Maintenant, je suis sûr que quiconque a suivi un cours de programmation ou a lu un livre qui couvre les bonnes pratiques sait que les égalités entre les valeurs et les valeurs doivent être structurées avec la valeur à gauche pour éviter des modifications accidentelles des données 'est substitué par' = '. Je n'ai jamais vu cela avec des énumérations. La réponse facile est d'utiliser la classe enum mais cela ne peut pas toujours être fait immédiatement avec de grands corps de code plus ancien. Puisqu'une énumération est fondamentalement juste un nombre entier, est-ce que cela serait considéré comme une bonne pratique de garder également les valeurs à gauche pour les énumérations?Bonne pratique avec des égalités pour les enums hors classe (rvalues ​​à gauche?)

j'ai écrit un petit exemple pour mieux illustrer ci-dessous

#include <iostream> 
using namespace std; 
    int number; 
    enum Color { RED, GREEN, BLUE }; 
int main() { 
    number = 1234; 
    Color color = BLUE; 

    // This is done 
    if (555 == number) { /*...*/ } 

    // So that this never accidently happens 
    if (number = 555) { /*...*/ } 

    // Resulting in this (number changed to 555) 
    cout << number <<endl; 

    // I have never seen this done 
    if (RED == color ) { /*...*/ } 

    // should it be to, prevent this 
    if (color = RED) { /*...*/ } 

    //Resulting in this (color changed to 0 or RED) 
    cout << color <<endl; 

    return 0; 
} 
+0

Vous parlez des comparaisons de "style Yoda", que certains considèrent comme obsolètes de nos jours car les compilateurs modernes ont des avertissements sur les affectations suspectes. Certains sont en désaccord. –

+2

* "Je suis sûr que quiconque a suivi un cours de programmation ou lu un livre qui couvre les bonnes pratiques sait que les égalités doivent être structurées avec la valeur à gauche pour éviter les '='." * Ce n'est pas vrai. Et tout compilateur décent déclenchera un avertissement pour ces cas de toute façon. – sidyll

+1

^* Quod Erat Demonstrandum * :) –

Répondre

2

serait-il considéré comme une bonne pratique de ne garder rvalues ​​à gauche pour les énumérations aussi?

Ce n'est pas précisément une "bonne pratique" même avec des littéraux, en fait. Ce concept est apparu dans le passé, mais pour la plupart des gens ayant un littéral à droite est beaucoup plus lisible (et plus cohérent avec la notion mathématique que les variables, spécialement celles qui changent le plus, viennent en premier).

La suppression de la prévention des fautes de frappe pour des raisons de lisibilité n'est pas toujours souhaitable. Le code lisible est en fait un vieux concept qui n'a jamais changé et ne le sera probablement jamais. Donc, à la fin, s'en tenir à ce qui a plus de sens et est plus facile à maintenir. Empêcher ce genre d'erreurs devrait être laissé au compilateur, et tout compilateur décent déclenchera un avertissement dans ces cas.

+0

Bien que je suis entièrement d'accord que la lisibilité est importante, le problème est que dans ma situation, je pourrais faire un changement à un fichier source de 8000 lignes, qui doit être lié à 30 autres fichiers, dans un référentiel maintenu par de nombreuses personnes et plus que je suis. La compilation prend une heure et demie en utilisant 30 cœurs. Il est normal de voir des centaines d'avertissements.Bien sûr, ce n'est pas une bonne chose mais à la fin de la journée, je dois m'inquiéter de mon code, pas de quelqu'un d'autre. – mreff555

+0

@DanFeerst Je ne suis pas sûr de comprendre votre commentaire. Quel est exactement le problème, à part considérer normal de voir des centaines d'avertissements? Devez-vous suivre une convention de projet? Et si oui, pourquoi publier cette question de toute façon? – sidyll

+0

Son préféré, mais pas forcé, et comme je l'ai dit, personne ne le fait avec des enums. Je posais la question parce que j'étais curieux de savoir quelle était l'approche la plus syntaxique. Ma curiosité est venue de la reconnaître comme quelque chose qui pourrait causer un problème dans un grand code. Je suppose que votre message répond à ma question (+1), cela ne règle tout simplement pas mon problème. – mreff555