Y a-t-il des avantages à coder en dur des valeurs de données dans un programme?

13

Je suis un codeur autodidacte novice, donc je m'excuse si je ne cloue pas le jargon du programmeur.

Je travaille sur un projet dans lequel je fournis des données, qui seront continuellement mises à jour, aux développeurs qui créeront essentiellement un outil pour générer des rapports à partir de requêtes sur les données.

Il semble que toutes les personnes impliquées pensent qu'elles doivent coder en dur les valeurs des données (pas le schéma, mais les domaines / valeurs eux-mêmes) dans le programme de génération de rapports.

Par exemple, supposons que nous rendions compte du personnel; le rapport serait divisé en catégories, avec un en-tête pour chaque département, puis sous chaque en-tête de département il y aurait des sous-titres de postes, puis sous chaque sous-titre une liste d'employés. Les développeurs veulent coder en dur les départements et les titres d'emploi. D'un autre côté, je penserais qu'ils pourraient / demanderaient ces choses au moment de l'exécution, trieraient les enregistrements par eux et généreraient des en-têtes de rapport dynamiquement en fonction des valeurs qui s'y trouvent.

Étant donné que la liste des valeurs potentielles changera au fil du temps (par exemple, les départements seront créés / renommés, de nouveaux titres d'emploi seront ajoutés), le code devra être continuellement mis à jour. Il me semble que nous pourrions ignorer les étapes de maintenance du code et organiser dynamiquement les rapports.

Comme je ne suis pas développeur, je me demande ce qui me manque. Quels avantages peut-il y avoir à coder en dur des valeurs dans un outil comme celui-ci? Est-ce généralement ainsi que les programmes sont conçus?

À M
la source
Les rapports sont-ils des tableaux croisés, ce qui signifie que les valeurs dans les lignes doivent apparaître sous forme de colonnes?
Tulains Córdova
1
@Brendan - Si vous codez en dur des valeurs dans le rapport, vous devrez modifier la liste à DEUX endroits (source de données et rapport) alors que si le rapport est dynamique, vous n'avez besoin de le changer qu'à un seul endroit (le rapport) .
kwah
1
@Brendan pourquoi voudriez-vous vous retrouver avec trois emplacements? Peut-être que ma compréhension est incorrecte mais j'envisage une requête SQL pour récupérer les données d'une base de données, l'application agrégera / groupera les valeurs retournées par, par exemple, le département. Si vous êtes prêt à avoir les frais généraux de plusieurs requêtes de base de données, vous pouvez sélectionner des départements / titres de rôle distincts si vous le souhaitez vraiment. À aucun moment, les données n'existent à plusieurs endroits - le rapport est généré par les données.
kwah
1
@Brendan Je suis également en désaccord avec votre définition du fait qu'il s'agit d'un seul endroit - la façon dont vous le décrivez est à plusieurs endroits, dispersés dans le code source.
kwah

Réponses:

9

Wikipédia:

Le codage en dur (également en codage en dur ou en codage en dur) fait référence à la pratique de développement de logiciels consistant à incorporer ce qui peut, peut-être seulement rétrospectivement, être considéré comme une entrée ou des données de configuration directement dans le code source d'un programme ou d'un autre objet exécutable, ou un formatage fixe de les données, au lieu d'obtenir ces données à partir de sources externes ou de générer des données ou un formatage dans le programme lui-même avec l'entrée donnée.

Le codage en dur est considéré comme un contre-modèle.

Considéré comme anti-modèle, le codage en dur nécessite que le code source du programme soit modifié à chaque fois que les données d'entrée ou le format souhaité changent, quand il pourrait être plus pratique pour l'utilisateur final de modifier les détails par un moyen extérieur au programme.

Parfois, vous ne pouvez pas l'éviter mais cela devrait être temporaire.

Un codage dur est souvent requis. Les programmeurs peuvent ne pas avoir de solution d'interface utilisateur dynamique pour l'utilisateur final, mais doivent toujours fournir la fonctionnalité ou libérer le programme. Ceci est généralement temporaire, mais résout, dans un sens à court terme, la pression pour livrer le code. Plus tard, un codage logiciel est effectué pour permettre à un utilisateur de transmettre des paramètres qui donnent à l'utilisateur final un moyen de modifier les résultats ou les résultats.

  • Le codage en dur des messages rend difficile l'internationalisation d'un programme.
  • Les chemins de codage en dur rendent difficile l'adaptation à un autre emplacement.

Le seul avantage du codage en dur semble être la livraison rapide de code.

Tulains Córdova
la source
5
D'accord, mais le "seul avantage" est souvent extrêmement important. Les décisions de conception dans la programmation concernent souvent le compromis entre l'épreuvage futur et la livraison rapide maintenant, et en tant que tel, le codage en dur peut être un choix parfaitement acceptable. Parfois, un codage non dur est un mauvais choix de conception.
-1 Je ne pense pas que ce soit une réponse utile. Il dit essentiellement que «l'incorporation de valeurs dans le code source de manière inappropriée» est inappropriée. Je pense que l'OP veut des conseils sur le moment où les choses peuvent appartenir au code source et donc tomber en dehors de votre définition Wikipedia.
Nathan Cooper
Le codage en dur devrait être une partie vitale de votre processus et le considérant comme un anti-modèle est obsolète à l'ère des micro-services, avec le tutoriel Angular Tour of Heroes étant un exemple très médiatisé d'une énorme maison de logiciels qui encore directement ou même impose comme une étape intermédiaire. De plus, lorsque vous passez à des données dynamiques, vous devez toujours conserver certaines données codées en dur comme solution de rechange, peut-être contrôlées par une variable d'environnement ou même une bascule booléenne sur le code lui-même afin que les bogues et les problèmes de sécurité puissent être correctement isolés dans le ligne.
Contenu d'une recherche Google du
24

Vraiment? Aucun cas d'utilisation valide possible?

Bien que je convienne que le codage en dur est généralement un anti-modèle ou au moins une très mauvaise odeur de code , il existe de nombreux cas où cela a du sens:

  • simplicité ( YAGNI ),
  • l'entrée est en fait constante et ne changera jamais (c'est-à-dire qu'elle représente une constante naturelle ou commerciale ou une approximation de une. Par exemple 0, PI, ...),
  • logiciels embarqués (les contraintes de mémoire et d'allocation viennent à l'esprit),
  • un logiciel sécurisé (ces valeurs ne sont pas disponibles et / ou faciles à décoder ou à rétroconcevoir, par exemple des jetons cryptographiques et des sels),
  • code généré (votre préprocesseur ou générateur est configurable, mais crache du code avec des valeurs codées en dur),
  • et probablement un peu plus.

Toujours un anti-modèle ? La suringénierie aussi ! Il s'agit de l'espérance de vie de votre logiciel !!

Non pas que je dis qu'il y a toutes de bonnes raisons, et généralement je rechigne à des valeurs codées en dur. Mais certains peuvent facilement obtenir un laissez-passer pour des raisons valables.

Et ne supervisez pas le premier concernant la simplicité / YAGNI en pensant que c'est trivial: il n'y a probablement aucune raison d'implémenter un analyseur et un vérificateur de valeur fou pour un script simple qui fait très bien un travail pour un cas d'utilisation étroit.

Il est difficile de trouver l'équilibre. Parfois, vous ne prévoyez pas qu'un logiciel grandira et durera plus longtemps que le simple script au départ. Souvent, cependant, c'est l'inverse: nous sur-concevons les choses, et un projet est abandonné plus rapidement que vous ne pouvez le lire dans le programmeur pragmatique. Vous avez perdu du temps et des efforts sur des choses qu'un premier prototype n'avait pas besoin.

Voilà les choses méchantes avec les anti-modèles: ils sont présents dans les deux extrêmes du spectre, et leur apparence dépend de la sensibilité de la personne qui examine votre code.

haylem
la source
C'est drôle, parce que j'ai piloté cela moi-même, et c'était beaucoup plus facile et plus rapide et plus propre pour moi de gérer les valeurs dynamiquement. Je l'ai fait en Python, alors que je crois que le produit final sera codé en Java - si cela fait une différence. Cela me semblait trop conçu lorsque je codais en dur les valeurs, car chaque colonne entrante devait être suivie à plusieurs endroits.
Tom
@Tom: Vous dites qu'il était plus facile et plus rapide d'implémenter (ou même de réutiliser) une bibliothèque de recherche de configuration que d'utiliser une valeur codée en dur? Super pour toi. De plus, je ne vois pas comment votre dernière phrase correspond à la définition de la suringénierie. Cela semblerait évidemment désordonné, et évidemment s'il est codé en dur et dupliqué, c'est encore pire (ce qui n'était pas le point de votre question, j'ai probablement mal compris, mais il me semblait que vous vouliez dire que la valeur n'était pas codée en dur en place à chaque fois, mais en un seul point du programme).
haylem
Quoi qu'il en soit, je signale simplement des cas où cela serait valable. Je souligne également que ce serait controversé dans ma dernière phrase. Vous ne pouvez pas plaire à tout le monde et les équipes ont des personnes avec des niveaux de compétences différents.
haylem
1
@ Tom, ne te vends pas trop court. Vous êtes définitivement sur quelque chose. Il semble plus facile et moins long d'écrire un algorithme rapide pour organiser les données en examinant les champs Département et Titre du poste, par opposition au codage en dur Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']. Il serait également beaucoup plus difficile de maintenir la matrice codée en dur dans le cas où un nouveau département ou titre serait introduit.
Chris G
1
Vous pouvez avoir des choses plus complexes qui sont toujours sensibles au code dur. Celui qui me vient à l'esprit que j'ai écrit il y a quelques années était toutes les permutations possibles d'un ensemble de valeurs. J'avais besoin de trouver une direction valide aléatoire, choisir une permutation aléatoire puis prendre le premier résultat valide était de loin la solution la plus efficace et comme c'était dans une boucle O (N ^ 3), l'efficacité comptait.
Loren Pechtel
4

Parfois, il est OK de coder en dur les valeurs. Par exemple, il existe des nombres comme 0, ou une ou plusieurs valeurs n ^ 2-1 pour les masques de bit qui doivent être certaines valeurs à des fins algorithmiques. Autoriser de telles valeurs au configurable n'a aucune valeur et ouvre seulement la possibilité de problèmes. En d'autres termes, si la modification d'une valeur ne faisait que casser des choses, elle devrait probablement être codée en dur.

Dans l'exemple que vous avez donné, je ne vois pas où le codage en dur serait utile. Tout ce que vous mentionnez devrait / devrait déjà être dans la base de données, y compris les titres. Même les éléments qui déterminent la présentation (comme l'ordre de tri) peuvent être ajoutés s'ils ne s'y trouvent pas.

JimmyJames
la source
Merci. L'ordre de tri était la seule préoccupation que j'avais. Cependant, dans notre cas, cela n'a pas d'importance, et je n'ai même pas pensé qu'il pourrait être ajouté comme une autre table dans la base de données.
Tom
1
Je dois noter que la gestion de tout cela dans la base de données est une option. Vous pouvez également utiliser des fichiers de configuration ou d'autres solutions, mais le codage en dur semble être un mauvais choix. L'option DB est souvent utilisée car il est facile de créer une interface pour permettre aux options d'être gérées par les utilisateurs. Il existe également des outils comme celui-ci qui sont spécialement conçus à cet effet.
JimmyJames
-1

La mise en œuvre d'une solution robuste qui permet à des valeurs qui auraient autrement été codées en dur d'être configurées à la place par les utilisateurs finaux nécessite une validation robuste de ces valeurs. Ont-ils mis une chaîne vide? Ont-ils mis quelque chose de non numérique où il aurait dû être un nombre? Font-ils l'injection SQL? Etc.

Le codage en dur évite beaucoup de ces risques.

Ce qui ne veut pas dire que le codage en dur est toujours, ou même souvent, une bonne idée. Ce n'est là qu'un des facteurs à prendre en compte.

Topher Eliot
la source