Bon exemple de calculatrice

Description

Il y a de nombreux codes sources de calculatrices en C# ou VB.Net.

Les projets de calculatrices, sont des exercices de débutant.
Les codes que l'ont trouve, reflètent donc le niveau du codeur à ce moment de sa formation.
Par conséquent, ces codes présentent tous (enfin ceux que j'ai regardé) des défauts de débutants.
Ils sont généralement fonctionnels, et répondent certainement à la demande du professeur ou cours en ligne que suit le débutant.
Mais CodeS SourceS n'a pas vocation à montrer le résultat d'un exercice.
CodeS SourceS a vocation à montrer ce qu'il faudrait faire.

Ces codes enfreignent souvent quelques précepts généraux de la programmation.
Le principal est la duplication de code.
Il y a un code complet pour la touche "0", et un code pour la touche "1" etc...
Cependant au chiffre près ces codes sont identiques.
On a donc 10 codes quasiments identiques, ça prend du temps à écrire et s'il y a une erreur, il faudra la corriger 10 fois.
Il faut donc factoriser ce code de façon à avoir en paramètre le chiffre à saisir.
Un autre principe souvent oublié est la réutisabilité du code.
En effet, souvent le code est directement écrit dans l'interface, si on veut faire une autre calcultrice et bien on ne pourra pas réutiliser le code directement.
Il faudra en copier un bout ici et en réécrire un bout là.

De plus, C# et VB.Net sont des langages objets, et là encore des principes de la programmation objet ne sont pas appliqués.
Bien souvent, il n'y a pas d'objet métier (c'est l'idée de base....)
En plus un objet métier bien écrit, résout automatiquement les problèmes de duplication et de réutilisabilité.

C'est ce que je veux montrer avec ce dépôt.

Il y a un projet "dll" qui contient le code métier, la dll c'est pas obligé, mais comme j'ai fait 3 interfaces différentes, c'était plus simple.
Pour les interfaces, il y en à une en mode console (pas très ergonomique, ça reste un exemple et une calculatrice en mode console, n'a pas vraiment d'intêret), une en Winform et une en WPF.
Dans l'interface Winform les "chiffres" pointent tous vers une seule méthodes coté interface, idem pour les opérateurs.
Dans l'interface WPF, j'ai factorisé un peu plus, tous les boutons pointent vers une méthode unique.
Pour choisir quelle interface lancer, il faut définir le projet de démarage avec un clic droit sur le nom du projet dans l'explorateur de solution.


Il y a un autre point qui me chagrine dans les dépots de débutants.
La saisie est construite comme du texte, on ajoute un caractère, puis un autre ect...
Sans être un défaut, ça ne me parrait pas logique, on calcule avec des nombres pas du texte.
Et puis si on construit le texte avec un point comme symbole décimal, il faut gérer les pc ou c'est la virgule qui est utilisée.
Aussi, il faut vérifier qu'un point n'a pas déjà été saisi.
J'ai donc construis ma saisie avec des nombres, et bindé l'affichage pour les interfaces fenétrées, comme ça pas de soucis avec le symbole décimal.

Cet exemple n'est pas complet, il ne montre que les 4 opérations de base.
On pourrait le recoder de 1000 façons différentes, tout en appliquant correctement les principes que j'ai cité.
Mais c'est un exemple de "ce qu'il faudrait faire".

Mise à jour du 21/06/2019 => prise en compte des remarques de pascal16m.

Mise à jour du 29/06/2019, suite aux nouvelles remarques de pascal16m sur le problème de précision des doubles:
-changement de la façon de calculer le nombre en cours de saisie, il n'est plus calculé au fur est à mesure en fonction du résultat précédent, mais recalculé entièrement à chaque frappe (utlisation de 2 listes de int)
-limitation à 16 chiffres significatifs, ce qui permet quand même de saisir de 0,00000000000001 à 9999999999999999, en passant par exemple par 12345678,12345678, ce qui est je pense amplement suffisant pour un exemple destiné aux débutants.

Si vous voulez plus d'informations sur les doubles, vous pouvez jetter un oeil à cette discussion (notamment les réponses de Revivax et Dalfab), et à l'article wikipédia que je cite.
Pour effectuer des calculs avec une meilleure précision, on peut utiliser le type Decimal, qui reste un nombre à virgule flottante mais codé sur 64bits.
Ou pour les très grands nombres ou les très petits nombres utiliser ou écrire des classes dédiées.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.