Une correction de bogue récente m'a obligé à passer en revue le code écrit par d'autres membres de l'équipe, où j'ai trouvé ceci (c'est C #):
return (decimal)CostIn > 0 && CostOut > 0 ? (((decimal)CostOut - (decimal)CostIn) / (decimal)CostOut) * 100 : 0;
Maintenant, admettant qu'il y ait une bonne raison pour tous ces lancers, cela semble toujours très difficile à suivre. Il y avait un bug mineur dans le calcul et j'ai dû le démêler pour résoudre le problème.
Je connais le style de codage de cette personne lors de la révision du code, et son approche est que raccourcir est presque toujours préférable. Et bien sûr, il y a une valeur à cela: nous avons tous vu des chaînes inutilement complexes de logique conditionnelle qui pourraient être mises de l'ordre avec quelques opérateurs bien placés. Mais il est clairement plus apte que moi à suivre des chaînes d'opérateurs regroupés dans une seule déclaration.
Bien entendu, c’est finalement une question de style. Mais est-ce que quelque chose a été écrit ou fait des recherches pour reconnaître le point où aspirer à la brièveté du code cesse d'être utile et devient un obstacle à la compréhension?
La raison des conversions est Entity Framework. La base de données doit les stocker en tant que types nullables. Décimal? n’est pas équivalent à Decimal en C # et doit être converti.
CostOut
est égal à Double.Epsilon
, et est donc supérieur à zéro. Mais (decimal)CostOut
est dans ce cas zéro, et nous avons une erreur de division par zéro. La première étape devrait consister à obtenir le code correct , ce qui, à mon avis, ne l’est pas. Corrigez-le, créez des cas de test, puis rendez-le élégant . Le code élégant et le code bref ont beaucoup en commun, mais parfois la brièveté n'est pas l'âme de l'élégance.