Dans nos applications pour la plupart volumineuses, nous n'avons généralement que quelques emplacements pour les "constantes":
- Une classe pour l'interface graphique et les constantes internes (titres de page d'onglet, titres de zone de groupe, facteurs de calcul, énumérations)
- Une classe pour les tables et colonnes de base de données (cette partie est du code généré) plus des noms lisibles pour eux (attribués manuellement)
- Une classe pour les messages d'application (journalisation, boîtes de message, etc.)
Les constantes sont généralement séparées en différentes structures dans ces classes. Dans nos applications C ++, les constantes ne sont définies que dans le fichier .h et les valeurs sont affectées dans le fichier .cpp.
L'un des avantages est que toutes les chaînes, etc. sont au même endroit et que tout le monde sait où les trouver quand quelque chose doit être changé.
C'est particulièrement quelque chose que les chefs de projet semblent aimer quand les gens vont et viennent et de cette façon, tout le monde peut changer des choses aussi triviales sans avoir à fouiller dans la structure de l'application.
En outre, vous pouvez facilement changer le titre de zones de groupe / onglets similaires, etc. à la fois. Un autre aspect est que vous pouvez simplement imprimer cette classe et la donner à un non-programmeur qui peut vérifier si les légendes sont intuitives et si les messages à l'utilisateur sont trop détaillés ou trop confus, etc.
Cependant, je vois certains inconvénients:
- Chaque classe est étroitement couplée aux classes de constantes
- Ajouter / supprimer / renommer / déplacer une constante nécessite une recompilation d'au moins 90% de l'application (Remarque: la modification de la valeur ne le fait pas, au moins pour C ++). Dans l'un de nos projets C ++ avec 1500 classes, cela signifie environ 7 minutes de temps de compilation (en utilisant des en-têtes précompilés; sans eux, c'est environ 50 minutes) plus environ 10 minutes de liaison avec certaines bibliothèques statiques.
- La création d'une version à vitesse optimisée via le compilateur Visual Studio prend jusqu'à 3 heures. Je ne sais pas si l'énorme quantité de relations de classe est la source, mais cela pourrait tout aussi bien l'être.
- Vous vous retrouvez dans des chaînes temporairement codées en dur directement dans du code parce que vous voulez tester quelque chose très rapidement et ne voulez pas attendre 15 minutes juste pour ce test (et probablement tous les suivants). Tout le monde sait ce qu'il advient des pensées «je réglerai ça plus tard».
- La réutilisation d'une classe dans un autre projet n'est pas toujours aussi simple (principalement en raison d'autres couplages étroits, mais la gestion des constantes ne facilite pas la tâche.)
Où stockeriez-vous des constantes comme ça? Quels arguments apporteriez-vous également pour convaincre votre chef de projet qu'il existe de meilleurs concepts qui répondent également aux avantages énumérés ci-dessus?
N'hésitez pas à donner une réponse spécifique ou indépendante en C ++.
PS: Je sais que cette question est un peu subjective mais honnêtement, je ne connais pas de meilleur endroit que ce site pour ce genre de question.
Mise à jour sur ce projet
J'ai des nouvelles sur le temps de compilation:
après les messages de Caleb et de gbjbaanb, j'ai divisé mon fichier de constantes en plusieurs autres fichiers quand j'ai eu le temps. J'ai également finalement divisé mon projet en plusieurs bibliothèques, ce qui était désormais beaucoup plus facile. La compilation en mode de publication a montré que le fichier généré automatiquement qui contient les définitions de la base de données (table, noms de colonne et plus - plus de 8000 symboles) et accumule certains hachages a causé les énormes temps de compilation en mode de publication.
Désactiver l'optimiseur de MSVC pour la bibliothèque qui contient les constantes DB nous a maintenant permis de réduire le temps total de compilation de votre projet (plusieurs applications) en mode release de jusqu'à 8 heures à moins d'une heure!
Nous n'avons pas encore découvert pourquoi MSVC a tant de mal à optimiser ces fichiers, mais pour l'instant, ce changement soulage beaucoup de pression car nous n'avons plus à nous fier uniquement aux versions nocturnes.
Ce fait - et d'autres avantages, tels qu'un couplage moins serré, une meilleure réutilisation, etc. - ont également montré que passer du temps à diviser les "constantes" n'était pas une si mauvaise idée après tout ;-)
Mise à jour2
Étant donné que cette question reçoit toujours une certaine attention:
voici ce que je fais depuis quelques années:
Mettez chaque constante, variable, etc. exactement dans la portée qui lui convient: Si vous utilisez une constante uniquement dans une seule méthode, il est OK de la définir dans cette méthode. Si une seule classe est intéressée, laissez-la comme détail d'implémentation privée de cette classe. Il en va de même pour l'espace de noms, le module, le projet, la portée de l'entreprise. J'utilise également le même modèle pour les fonctions d'assistance et similaires. (Cela peut ne pas s'appliquer à 100% si vous développez un cadre public.)
Cela augmente la réutilisabilité, la testabilité et la maintenabilité à un degré où vous passez non seulement moins de temps à compiler (au moins en C ++), mais aussi moins de temps sur la correction de bogues, ce qui vous laisse plus de temps pour réellement développer de nouvelles fonctionnalités. Dans le même temps, le développement de ces fonctionnalités ira plus vite car vous pouvez réutiliser plus de code plus facilement. Cela l'emporte sur tout avantage que le fichier de constantes centrales pourrait avoir d'une ampleur.
Jetez un œil en particulier au principe de ségrégation d'interface et au principe de responsabilité unique si vous voulez en savoir plus.
Si vous êtes d'accord, votez pour Caleb, car cette mise à jour est essentiellement une interprétation plus générale de ce qu'il a dit.