IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Utilisation d'un string comme paramètre passé à une méthode


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut Utilisation d'un string comme paramètre passé à une méthode
    Bonjour,

    Étant débutant en Csharp, je me permets de vous solliciter pour profiter vos lumières.

    Je développe une classe permettant d’instancier des objets capables de calculer la TVA. Mon code est ci-dessous.

    Ma question est la suivante : j’ai défini une méthode « GetMontant() » qui calcule et retourne une valeur de type double égale au montant de la TVA. Le taux de TVA utilisé est choisi au moyen d’un paramètre de type string passé à la méthode. Je voudrais faire en sorte de lancer une exception si le string passé à la méthode est inconnu. Je sais comment lancer des exceptions, ce n’est pas la question, mais ce qui me dérange c’est d'être obligé de faire retourner quelque chose (et, plus précisément, de type double) à ma méthode. En l’état je lui fais donc retourner 0D si le paramètre est inconnu. N’existe-t-il un moyen plus satisfaisant pour réaliser la tâche souhaitée ? Ce que je voudrais, c’est qu’une exception soit lancée si le taux est inconnu et qu’aucun montant de TVA ne soit retourné.

    Merci d’avance pour votre aide.

    Voici le code ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    // Classe de calcul de la Taxe sur la valeur ajoutée (TVA) version 1.0.
    // Code général des impôts (CGI).
    // Assujettissement : CGI art. 256, 256 A.
    class Tva
    {
    	// I- Constantes, champs et propriétés.
     
    	// Taux normal de 20 % : CGI art. 278.
    	private const double tauxNormal = 0.20D;
     
    	public double TauxNormal
    	{
    		get { return tauxNormal; }
    	}
     
    	// Taux réduit de 10 % : CGI art. 278 bis, 278 quater, 278 sexies A, 278 septies, 279, 279-0 bis, 279-0 bis A.
    	private const double tauxReduit10 = 0.10D;
     
    	public double TauxReduit10
    	{
    		get { return tauxReduit10; }
    	}
     
    	// Taux réduit de 5,5 % : CGI art. 278-0 bis, 278-0 bis A, 278 sexies.
    	private const double tauxReduit55 = 0.055D;
     
    	public double TauxReduit55
    	{
    		get { return tauxReduit55; }
    	}
     
    	// Prix HT base de la TVA.
    	private double prixHT;
     
    	public double PrixHT
    	{
    		get { return this.prixHT; }
    		set { this.prixHT = value; }
    	}
     
    	// Instantiacion avec le prix HT spécifié ou à défaut avec un prix HT égal à 0.
    	public Tva(double PrixHT = 0D)
    	{
    		this.prixHT = PrixHT;
    	}
     
    	// II- Méthode.
     
    	// Retourne le montant de la TVA en fonction du taux choisi ou à défaut au taux normal.
    	public double GetMontant(string Taux = "TAUX_NORMAL")
    	{
    		if (Taux == "TAUX_NORMAL") return this.prixHT * tauxNormal;
    		else if (Taux == "TAUX_REDUIT10") return this.prixHT * tauxReduit10;
    		else if (Taux == "TAUX_REDUIT55") return this.prixHT * tauxReduit55;
    		else
    		{
    			CustomException tauxInconnu = new CustomException("Le taux de TVA demandé n'existe pas ou n'est pas supporté.");
    			throw tauxInconnu;
    			return 0D;
    		}	
    	}
    }

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Après un throw tu sors de la méthode, donc pas besoin de renvoyer une valeur
    Tu peux faire l'essai, si tu enlèves les throw et le return 0D ; Visual Studio te sortira un warning comme quoi un chemin ne retourne pas de résultat ; mais avec juste le throw ce warning disparait.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Après un throw tu sors de la méthode, donc pas besoin de renvoyer une valeur
    Tu peux faire l'essai, si tu enlèves les throw et le return 0D ; Visual Studio te sortira un warning comme quoi un chemin ne retourne pas de résultat ; mais avec juste le throw ce warning disparait.
    Merci pour ta réponse Sehnsucht. Comme je n'ai pas VS sous la main au bureau je me suis servi d'un interpréteur en ligne qui m'a notifié un warning même en mettant un throw. Mais bon, si ça compile sous VS pas problème.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Je me permets juste une petite réflexion : Pour ma part, j'utiliserais un enum plutôt qu'une string pour la méthode GetMontant(...) et surtout, je ne mettrais pas les taux de TVA en dur dans le code !!! Maintenant, c'est peut-être juste un cas d'école et dans ce cas, on oublie ma réflexion

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bonjour,
    Je me permets juste une petite réflexion : Pour ma part, j'utiliserais un enum plutôt qu'une string pour la méthode GetMontant(...) et surtout, je ne mettrais pas les taux de TVA en dur dans le code !!! Maintenant, c'est peut-être juste un cas d'école et dans ce cas, on oublie ma réflexion
    Merci pour tes conseils ebastien.

    Je suis un peu « maniaque » quand je code. J’ai deux impératifs : 1°) la sécurité ; 2°) la performance.
    Pour moi, l’adaptabilité, la lisibilité et l’élégance du code passent après.

    J’ai choisi de mettre les taux de TVA dans le code pour les raisons suivantes : je veux être sûr que la méthode serve à calculer la TVA aux taux en vigueur à la date où je l’ai écrite. Elle ne doit servir à rien d’autre. Si les taux changent, je ferais une nouvelle version, d’autant que les réformes des taux de TVA sont relativement peu fréquentes. Par conséquent, j’ai estimé qu’il est préférable de ne pas mettre les taux dans un fichier de paramètres ou une base de données, ce qui permet aussi d’économiser des ressources.

    Concernant l’utilisation d’une variable de type string, j’ai pensé que ça serait plus performant qu’un enum. Je me doute que la différence doit être infinitésimale mais bon, je l’ai déjà dit, je suis manique sur ce plan.

    D’ailleurs, j’ai même décidé de supprimer les else pour écrire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (Taux == "TAUX_NORMAL") return this.prixHT * tauxNormal;
    if (Taux == "TAUX_REDUIT10") return this.prixHT * tauxReduit10;
    if (Taux == "TAUX_REDUIT55") return this.prixHT * tauxReduit55;
    CustomException tauxInconnu = new CustomException("Le taux de TVA demandé n'existe pas ou n'est pas supporté.");
    throw tauxInconnu;
    Cela dit, peut-être que je suis à côté de la plaque et qu’il y a d’autres raisons qui ont motivé tes remarques, auquel cas je serais ravi de profiter de tes conseils.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Points : 75
    Points
    75
    Par défaut
    Salut,

    Que tu gères tes taux "en dur" ou avec un fichier de conf / ou bdd, n'affectera en rien les performances !

    Par contre ton application ne sera pas flexible du tout si tu codes çà "en dur" et c'est une très mauvaise habitude.
    Pensez à utiliser les boutons et

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par djchou Voir le message
    Salut,

    Que tu gères tes taux "en dur" ou avec un fichier de conf / ou bdd, n'affectera en rien les performances !

    Par contre ton application ne sera pas flexible du tout si tu codes çà "en dur" et c'est une très mauvaise habitude.
    Bonjour djchou. Ça consomme quand mêmes de ressources de lire un fichier XML ou d'accéder à une basse de données, non ? Ça ne va pas affecter les performances, certes, mais si je peux l'éviter autant le faire, c'est une question de méthode (au sens commun du terme).

    Je conviens que c'est généralement une mauvaise approche de mettre ce type de données dans le code, mais en l'occurrence, c'est un choix délibéré. Je ne veux pas que l'application soit flexible, je veux qu'elle fasse rigoureusement ce que j'ai prévu et qu'on ne puisse pas le modifier (ou pas facilement en tous cas).

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par LaBoéthie Voir le message
    J’ai choisi de mettre les taux de TVA dans le code pour les raisons suivantes : je veux être sûr que la méthode serve à calculer la TVA aux taux en vigueur à la date où je l’ai écrite. Elle ne doit servir à rien d’autre. Si les taux changent, je ferais une nouvelle version, d’autant que les réformes des taux de TVA sont relativement peu fréquentes. Par conséquent, j’ai estimé qu’il est préférable de ne pas mettre les taux dans un fichier de paramètres ou une base de données, ce qui permet aussi d’économiser des ressources.
    mouais ...
    n'empeche que le jour où il va y avoir un nouveau taux tu va être obligé de refaire du code, alors que tu aurais une table pour gérer ca tu en ferais abstraction dans le code je pense
    et avec une classe TVA tu n'aurais pas à écrire 3 if (toi qui aime les nanosecondes ca t'en gagnerais une ou deux au passage ^^)


    Citation Envoyé par LaBoéthie Voir le message
    Concernant l’utilisation d’une variable de type string, j’ai pensé que ça serait plus performant qu’un enum. Je me doute que la différence doit être infinitésimale mais bon, je l’ai déjà dit, je suis manique sur ce plan.
    une enum c'est compilé en tant que nombre entier, donc c'est beaucoup plus performant qu'un string de plusieurs caractères où la comparaison nécessite la comparaison de plusieurs caractères
    de plus niveau sécurité du code une enum est safe, en cas de faute de frappe ca bloque à la compilation, un string ca fait un bug
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    une enum c'est compilé en tant que nombre entier, donc c'est beaucoup plus performant qu'un string de plusieurs caractères où la comparaison nécessite la comparaison de plusieurs caractères
    de plus niveau sécurité du code une enum est safe, en cas de faute de frappe ca bloque à la compilation, un string ca fait un bug
    Merci beaucoup pour ton aide Pol63. Tu m’apprends quelque chose pour les énumérations. Tu pensais à quelque chose comme ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public double GetAmount(string Taux = "TAUX_NORMAL")
    {
         tauxTva testTaux = (tauxTva)Enum.Parse(typeof(tauxTva), Taux);
     
         if (testTaux == (tauxTva)0) return this.Round(this.prixHT * tauxNormal);
         if (testTaux == (tauxTva)1) return this.Round(this.prixHT * tauxReduit10);
         if (testTaux == (tauxTva)2) return this.Round(this.prixHT * tauxReduit55);
     
         throw new System.ArgumentException("Le taux de TVA demandé n'existe pas ou n'est pas pris en charge.", "Taux");
    }

    Citation Envoyé par Pol63 Voir le message
    mouais ...
    n'empeche que le jour où il va y avoir un nouveau taux tu va être obligé de refaire du code, alors que tu aurais une table pour gérer ca tu en ferais abstraction dans le code je pense
    et avec une classe TVA tu n'aurais pas à écrire 3 if (toi qui aime les nanosecondes ca t'en gagnerais une ou deux au passage ^^)
    Là j’avoue que je ne comprends pas tout. Comment se passer des trois if si j’utilise une table ? En faisant un SELECT et en testant si ça ne retourne rien ? Et ouvrir une connexion avec une base données, faire un SELECT et récupérer les données c’est plus rapide que trois if ?

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par LaBoéthie Voir le message
    Tu pensais à quelque chose comme ça ? :
    non pas du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public enum tauxtva
      tauxnormal=1
      tauxreduit10=2
      tr55=3
    end enum
     
     
    public double GetAmount(tauxtva Taux)
    et pas de parse



    Citation Envoyé par LaBoéthie Voir le message
    Là j’avoue que je ne comprends pas tout. Comment se passer des trois if si j’utilise une table ? En faisant un SELECT et en testant si ça ne retourne rien ? Et ouvrir une connexion avec une base données, faire un SELECT et récupérer les données c’est plus rapide que trois if ?
    si c'est pour un programme de quelques lignes de code laisse le comme il est
    par contre ce n'est pas la peine de penser à ce point aux performances avec un petit programme et un manque de connaissance
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Juriste
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Juriste

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    non pas du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public enum tauxtva
      tauxnormal=1
      tauxreduit10=2
      tr55=3
    end enum
     
     
    public double GetAmount(tauxtva Taux)
    et pas de parse





    si c'est pour un programme de quelques lignes de code laisse le comme il est
    par contre ce n'est pas la peine de penser à ce point aux performances avec un petit programme et un manque de connaissance
    Pol63, je suis effectivement un débutant, comme je l’ai indiqué dans le titre du message. L’application devra faire d’autres choses que simplement calculer la TVA. C’est aussi un moyen d’apprendre et merci de m’aider à progresser. En tous les cas, toi et les autres m’avez convaincu. J’externaliserai les taux un peu plus tard, lorsque j’aurais décidé si j’utiliserais un fichier de configuration ou une base de données.

    J’ai réécrit le code en utilisant un tableau, histoire de ne pas manipuler des libellés de taux qui pourraient devenir obsolètes. Ça vous paraît bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // Classe de calcul de la Taxe sur la valeur ajoutée (TVA) version 1.0.
    // Code général des impôts (CGI).
    // Assujettissement : CGI art. 256, 256 A.
    class Tva
    {
        // I- Champs et propriétés.
     
        // Taux de TVA
        private readonly double[] tauxTva = new double[3]
    	{
    		// Taux normal de 20 % : CGI art. 278.
    		0.20D,
     
    		// Taux réduit de 10 % : CGI art. 278 bis, 278 quater, 278 sexies A, 278 septies, 279, 279-0 bis, 279-0 bis A.
    		0.10D,
     
    		// Taux réduit de 5,5 % : CGI art. 278-0 bis, 278-0 bis A, 278 sexies.
    		0.055D	
    	};
     
        // Prix HT base de la TVA.
        private double prixHT;
     
        public double PrixHT	
        {
            get { return this.prixHT; }
            set { this.prixHT = value; }
        }
     
        // Instantiacion avec le prix HT spécifié ou à défaut avec un prix HT égal à 0.
        public Tva(double PrixHT = 0D)
        {
            this.prixHT = PrixHT;
        }
     
        // II- Méthode.
     
        // Retourne le montant de la TVA en fonction du taux choisi ou à défaut au taux normal.
        public double GetAmount(byte TauxTva = 0)
        {   
            if (TauxTva >= tauxTva.Length)
    		throw new System.ArgumentException("Le taux de TVA demandé n'existe pas ou n'est pas pris en charge.");
     
    		return this.prixHT * tauxTva[TauxTva];
        }
    }
    Encore merci à tous pour votre aide.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/08/2011, 09h25
  2. Réponses: 1
    Dernier message: 01/08/2009, 10h54
  3. comment passer un ArrayList comme paramètre d'une méthode
    Par itmak dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 22/11/2008, 10h31
  4. Réponses: 11
    Dernier message: 08/07/2008, 13h16
  5. Réponses: 1
    Dernier message: 25/12/2007, 20h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo