Magazine

Article de fond: Le prix du non-sens (T)

Publié le 18 avril 2008 par Wtf

Quelques années plus tôt, Pete, un programmeur astucieux, développa une application qui suivait les commissions pour les transactions commerciales. Pete a quitté depuis longtemps la société , son rôle ayant été repris par Andy.

Andy n'avait pas beaucoup à modifier le code de Pete, seulement lors de bugs occasionnels. D'ailleurs Andy  n'était jamais très à l'aise pour corriger les bugs de Pete, bien que ce soit principalement des erreurs de logique.


Quand Andy apprit que son équipe allait devoir porter le code de Pete sur une nouvelle application, lui et son équipe se battirent corps et âme pour obtenir une réécriture complète du code. Les erreurs de logique sont les pires argumentait avec force Andy. Les bugs peuvent rester cachés pendant des semaines avant qu'on doive se bousculer pour corriger les données erronées. Qu'importe, la direction n'avait pas les budgets, on demanda à Andy d'effectuer un portage du code.
Pete était célèbre pour ses bidouilles. Souvent, cela signifiait résoudre un problème qui n'existait pas avec la pire solution imaginable. Dans notre cas c'était une bidouille pour le type MONEY, DECIMAL et SMALL MONEY de SQL Server.
L'application devait stocker des dollars et des centimes dans sa base. Pour se faire, Pete créa une colonne ENTIER dans la table commission appelée "prix_en_centime". Heureusement, il avait prévu de créer sa propre classe "Money" pour utiliser "prix_en_centime" plus facilement, et il s'en servait comme adaptateur pour toutes ses opérations d'insertion mises à jour.
Money myMoney = new Money(0.10); // $.10
return myMoney.DBValue; // retourne 10
Andy ouvrit Money.cs et eu un bref aperçu des changements de précisions :
public int DBValue
{
// Pete 01/05- precision en centimes:
// get { return Convert.ToInt32(_value * 100.0); }
// Pete 01/20- precision en 1/10 de centimes:
// get { return Convert.ToInt32(_value * 1000.0); }
// Pete 02/13- precision en 1/100 de centimes:
get { return Convert.ToInt32(_value * 10000.0); }
}
Deux (imaginaires) décimales ne suffisant pas pour suivre les commissions, ils avaient eu besoin d'une précision au dixième de centime. Heureusement pour Pete, chaque "prix_en_centime" était écrit pour cela. Le champ avait d'abord été passé par sa classe Money et injecté à partir de sa propriété dbvalue, qui contiendrait la valeur effective à écrire dans la base de données. Concrètement, 0.1 € était stocké 10. Maintenant 10 centimes était stocké 100.
Une autre mise à jour ajouta un nouveau zéro à la conversion pour encore plus de précision, donc maintenant, la valeur en base de Money(0.10) serait 1 000.
Ce fut à ce moment qu'Andy se retrouva avec plusieurs tables dont les données avaient des valeurs différentes dans la colonne 'prix_en_centime' qui d'ailleurs devraient être nommées 'prix_en_centaines_de_centimes'. Ainsi, les valeurs ne signifiaient plus rien : une valeur de 500 000 pouvait aussi bien signifier 5 000€, ou 500 ou 50 en fonction de la version de la librairie utilisée pour encoder le prix.
Bien qu'il le désirait plus que tout, Andy n'était pas en mesure d'abandonner le système de gestion monétaire. Les directives de la direction étaient claires : "Adaptez mais ne changez rien". Malgré cela, il fut capable d'introduire en douce une petite modification. Prix_en_centime fut transformé en un type DECIMAL et le système devint (un peu) plus stable.

Retour à La Une de Logo Paperblog

A propos de l’auteur


Wtf 169 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte