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 :

type de données : km et km/h


Sujet :

C#

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    D'accord, c'est un calcul...

    Mais sinon, on pourrait peut être utiliser des lambda + tables de hash type1/type2 > fonction de conversion ? (je n'ai pas beaucoup réfléchit : simple intuition).


    Egalement on pourrait envisager un petit moteur de règles : induction du bon chemin pour aboutir la conversion de A > C (en passant par B si nécessaire).
    Ce qui pourrait avoir d'autres types d'applications (Rete un peu amélioré par exemple).

    Mais effectivement, ça sort du scope de la lib de dev.net telle que définie actuellement.

  2. #22
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par tomlev Voir le message
    2) à chaque fois qu'on ajoute une unité, il faudrait modifier toutes les autres pour gérer les divisions par cette nouvelle unité. Or je veux que l'API reste extensible, et que ça puisse fonctionner de la même manière avec des unités créées par l'utilisateur... donc cette option ne convient pas non plus...
    Et en utilisant MEF cela pourrait rester extensible non ?

    Citation Envoyé par tomlev Voir le message
    Mais bon, ça n'a pas un intérêt fou il me semble... De toutes façons le but de cette API est avant tout la conversion d'unités, pas les calculs savants
    Beh la conversion d'unités cela reste du calculs savants Comment convertir des kms parcourut par un avion en joules ou en électron volt ou en énergie primaire
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #23
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par hegros Voir le message
    Beh la conversion d'unités cela reste du calculs savants Comment convertir des kms parcourut par un avion en joules ou en électron volt ou en énergie primaire
    Non décidable, car cela suppose de connaitre la masse de l'avion,l'altitude de vol (masse volumique du fluide dans lequel le mobile se déplace), la surface de maitre-couple, le profil alaire (on optimise pour la vitesse ou la maniabilité à basse vitesse ? - si on décide qu'un avion peut s’accommoder d'une piste d'atterrissage de navette spatiale, le bilan énergétique peut être beaucoup plus positif).

    Quant à la conversion Joule <=> eV , cela relève plus de l'âne savant et de la classe de 3ème (ou de 2nde peut être, je ne sais plus).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #24
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Cela dit, il est possible de faire des calculs juste sur l'homogeneité des unités. Je me souviens qu'au bac ca m'avait bien servi sur ma TI
    Si je multiplie du Coulomb par du Pascal en divisant par des Newtons paf! Ca fait des chocapics
    C'était ce genre de calcul qu'elle me faisait.

  5. #25
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    J'ai mis +1 à Nathanaël, juste pour les Chocapics
    Un peu de douceur dans ce post scientiste

  6. #26
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Cela dit, il est possible de faire des calculs juste sur l'homogeneité des unités. Je me souviens qu'au bac ca m'avait bien servi sur ma TI
    Si je multiplie du Coulomb par du Pascal en divisant par des Newtons paf! Ca fait des chocapics
    C'était ce genre de calcul qu'elle me faisait.
    Tu vas peut être rentrer dans l’histoire pour avoir énoncé "la version du pauvre du théorème de Vaschy-Buckingham" (qui est une base de l'AD (*)).






    (*) mais nooooon pas l'Active Directory ! l'Analyse Dimensionnelle

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #27
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Alikendarfen Voir le message
    (je n'ai pas beaucoup réfléchit : simple intuition).
    Moi si

    Citation Envoyé par Nathanael Marchand Voir le message
    Cela dit, il est possible de faire des calculs juste sur l'homogeneité des unités. Je me souviens qu'au bac ca m'avait bien servi sur ma TI
    Si je multiplie du Coulomb par du Pascal en divisant par des Newtons paf! Ca fait des chocapics
    C'était ce genre de calcul qu'elle me faisait.
    Justement je suis depuis tout à l'heure sur une idée qui permet ce genre de trucs... C'est juste un proto pour l'instant, si ça donne quelque chose ce sera peut-être intégré à Dvp.NET

    Petit aperçu :

    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
    using System;
    using SharpMeasure;
    using SharpMeasure.Length;
    using SharpMeasure.Time;
     
    namespace ConsoleTests
    {
        // Alias pour les unités composites
        // Pas obligatoire, mais plus pratique...
        using Kmh = FractionalUnit<Kilometer, Hour>;
        using Mph = FractionalUnit<Mile, Hour>;
     
        class Program
        {
            static void Main(string[] args)
            {
                // distance est en mètres (Measure<Meter>)
                var distance = 100.Unit<Meter>();
     
                Console.WriteLine("Distance:");
                Console.WriteLine(distance);
                Console.WriteLine(distance.Convert<Foot>());
                Console.WriteLine();
     
                // distance est en secondes (Measure<Second>)
                var time = 9.58.Unit<Second>();
     
                Console.WriteLine("Time:");
                Console.WriteLine(time);
                Console.WriteLine(time.Convert<Minute>());
                Console.WriteLine();
     
                // speed est en m/s (Measure<FractionalUnit<Meter, Second>>)
                var usainBoltSpeed = distance.DivideBy(time);
                var speedKmh = usainBoltSpeed.Convert<Kmh>();
                var speedMph = speedKmh.Convert<Mph>();
     
                Console.WriteLine("Usain Bolt's speed:");
                Console.WriteLine(usainBoltSpeed);
                Console.WriteLine(speedKmh);
                Console.WriteLine(speedMph);
                Console.ReadLine();
            }
        }
    }
    Ce qui donne :

    Distance:
    100 m
    328,083989501312 ft

    Time:
    9,58 s
    0,159666666666667 min

    Usain Bolt's speed:
    10,4384133611691 m/s
    37,5782881002088 km/h
    23,3500656790647 mi/h
    Les unités "composites" (m/s, km/h...) sont "créées" automatiquement, comme en F#

    Par contre ça fout par terre tout l'API qui est déjà en place dans Dvp.NET

  8. #28
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Non décidable, car cela suppose de connaitre la masse de l'avion,l'altitude de vol (masse volumique du fluide dans lequel le mobile se déplace), la surface de maitre-couple, le profil alaire (on optimise pour la vitesse ou la maniabilité à basse vitesse ? - si on décide qu'un avion peut s’accommoder d'une piste d'atterrissage de navette spatiale, le bilan énergétique peut être beaucoup plus positif).

    Quant à la conversion Joule <=> eV , cela relève plus de l'âne savant et de la classe de 3ème (ou de 2nde peut être, je ne sais plus).
    Ce n'est pas une unité du SI pourtant elle a une correspondance en joule.je découvre l'analyse dimensionnelle après ce sont des estimations cela ne prédit rien d'une distance ou vitesse sur l'énergie consommée puisque l'on ne connaît pas la force du vent, des résistances etc...il faut que ces unités soient convertibles par groupes de 2,3 ou+

    le problème du typage en double est bien encapsulé
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  9. #29
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Je sais pas si ça vous intéresse, mais à la suite des discussions sur la précision des différents types, je vous propose un petit document sur lequel je suis tombé il y a un mois environ, très intéressant :
    What Every Computer Scientist Should Know About Floating Point

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                // speed est en m/s (Measure<FractionalUnit<Meter, Second>>)
    Les unités "composites" (m/s, km/h...) sont "crées" automatiquement, comme en F#
    C'est très esthétique

    Citation Envoyé par tomlev Voir le message
    ça par contre, c'est en "dur" ?

    On peut ajouter des correspondances ? Traiter d'autre types de conversions (par ex: ° => F) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Convert.Define<Celsius, Fahrenheit>( c => a * c + b );
    ?

    ... ce qui supposerait de définir Fahrenheit comme... quel type ?

  11. #31
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par hegros Voir le message
    Ce n'est pas une unité du SI pourtant elle a une correspondance en joule.
    C'est évident et c'est pour cela que je disais que la conversion relevait de l'âne savant puisqu'il suffit de faire une division de la valeur en J par 1.6e-19 (à peu près).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #32
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Alikendarfen Voir le message
    ... ce qui supposerait de définir Fahrenheit comme... quel type ?
    Si tu avais regardé la librairie DVP.Net, tu aurais vu que les types Celsius et Farhenheit y sont. (ainsi que les conversions que tu mentionnes).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  13. #33
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par hegros Voir le message
    des résistances
    Les résistances, c'est (en gros) du Bernouilly et elles se calculent en fonction de la vitesse a partir du profil alaire, de la surface de maître couple et de la masse volumique du fluide. C'est pour cela que je ne le mentionnais pas.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #34
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Les résistances, c'est (en gros) du Bernouilly et elles se calculent en fonction de la vitesse a partir du profil alaire, de la surface de maître couple et de la masse volumique du fluide. C'est pour cela que je ne le mentionnais pas.
    "C'est pas faux."

    +1 juste parce que j'ai rien compris.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Si tu avais regardé la librairie DVP.Net, tu aurais vu que les types Celsius et Farhenheit y sont. (ainsi que les conversions que tu mentionnes).
    La lib actuelle c'est une chose (et j'ai bien vu que les températures y figurent).

    Ce dont je parlais, c'est de cette nouvelle version indiquée par Tomlev et du fait qu'elle soit extensible (ou pas).

  16. #36
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Alikendarfen Voir le message
    ça par contre, c'est en "dur" ?
    Comment ça ? Ici Minute est un paramètre de type générique, tu peux utiliser quel autre type d'unité à la place. Ca doit juste implémenter une interface IUnit qui définit comment faire la conversion vers l'unité du SI

    Citation Envoyé par Alikendarfen Voir le message
    On peut ajouter des correspondances ? Traiter d'autre types de conversions (par ex: ° => F) ?
    Oui, on peut ajouter de nouvelles unités en créant des nouvelles classes qui implémentent IUnit, ça prend 3 lignes... Par contre avec le prototype actuel la conversion entre °C et °F n'est pas possible, parce que ça ne gère que les conversions de type ax, pas ax + b. Mais ça va s'arranger


    Citation Envoyé par Alikendarfen Voir le message
    ... ce qui supposerait de définir Fahrenheit comme... quel type ?
    une classe Fahrenheit qui implémente une interface IUnit

    Si ça t'intéresse le code est là :
    http://code.google.com/p/tomsoft/sou...2FSharpMeasure

  17. #37
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Rooh, la discussion a pris un tour bien intéressant.

    Permettez-moi d'ajouter une solution qui me semble plus robuste en m'appuyant sur mon passé de physicien.

    A la base, nous n'avons besoin que d'une poignée d'unités, une par dimension, c'est à dire sept. Concentrons-nous pour l'instant sur distance, temps et masse, et toutes leurs combinaisons possibles (vitesse = distance/temps, énergie = masse*vitesse^2, etc) et choisissons les unités du S.I.

    12 km/h = 12 * (1/3.6) m^1 * s^-1 * kg^0 [3.33 m/s]
    Donc pour représenter 12 km/h, il nous faut 5 valeurs : 12 ; 1/3.6 ; +1 ; -1 ; 0


    Commençons par la classe de base qui contient l'essentiel de notre code.
    Code C# : 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
    public abstract class DimensionnedValue
    {
       protected double m_value;
       private readonly double m_coefficient;
       private readonly int m_massDimension;
       private readonly int m_timeDimension;
       private readonly int m_lengthDimension;
     
       protected Dimensonnedalue() { }
     
       protected DimensionnedValue(double value, double coefficient, int massDimension, int timeDimension, int lengthDimension) { ...  }
     
       public Value { get { return m_value; } }
     
       public bool IsDistance { get { return m_lengthDimension == 1 && m_massDimension == 0 && m_timeDimension == 0; } }
     
       protected double ConvertFrom(DimensionnedValue other)
       {
          // Vérifier que les massDimension, lengthDimension, etc... Sont bien les mêmes pour this et other.
         // Car on peut seulement convertir une vitesse en vitesse, pas une vitesse en distance.
          AssertDimensionsMatchWith(other);
     
          return m_coefficient * other.m_value / other.m_coefficient;
       }
     
       public static DimensionnedValue operator *(DimensionnedValue x, DimensionedValue y)
       {
           return new DimensionnedValue(
               x.m_value * y.m_value,
               x.m_coefficient * y.m_coefficient,
               x.m_massDimension * y.m_massDimension,
               ...);
     
       } 
    }

    Définir une unité est ensuite très court et très facile.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public sealed class MetersPerSecond : DimensionnedValue
    {
        public MetersPerSecond(double value) 
           : base(value, 1.0, 0, -1, 1)
     
        public static MetersPerSecond operator implicit(DimensionnedUnit x)
        {
            return new MetersPerSecond(ConvertFrom(x));
        }
    }

    Voilà !
    Du coup, on peut implémenter très facilement de nouvelles unités sans avoir explicitement à spécifier des tonnes de conversions, il suffit d'une conversion implicite depuis DimensionnedValue par classe. Et voilà le résultat...

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    KmPerHour speed = new KmPerHour(5);
     
     // On utilise la conversion implicite définie sur MetersPerSecond depuis n'importe quelle unité
    MetersPerSecond speed2 = (MetersPerSecond)speed;
     
    // Même chose de m/s en km/h
    DimensionnedUnit speed3 = new Meters(5) * new Seconds(4);
    KmPerHour speed4 = (KmPerHour)speed3;
     
    // La conversion suivante renverra une exception (via AssertDimensionsMatchWith que je n'ai expliqué sans fournir le code) puisqu'on ne peut pas convertir une vitesse en distance.
    var distance = (Meters)speed4;


    Enfin, le système crée implicitement de nouvelles unités à la volée sans avoir besoin de classe ! Par exemple, si Joules (kg*m^2*s^-2) n'a pas été définit, on peut simplement faire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var energyInJoules = new Kg(5) * new MetersPerSecond(4) * new MetersPerSecond(4);  // 80J
     
    // AJoutons une bête fonction de clonage "NewValue" avec ne changeant que m_value et...
    var newEnergyInJoules = energyInJoules.NewValue(12); // 12J

    EDIT : Correction de l'introduction qui faisait l'amalgame entre dimension et unité.

  18. #38
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bien vu, j'avais pas pensé à cette approche là

    Par contre c'est bien si tu ne travailles qu'avec des unités du SI... si tu veux faire des conversions en Mile, Ounce, Gallon etc ça marche plus

  19. #39
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Mais si on peut travailler avec des miles & co.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public sealed class Miles : DimensionnedValue
    {
        public Miles(double value) 
           : base(value, 1609.344, 0, 0, 1)
     
        public static Miles operator implicit(DimensionnedUnit x)
        {
            return new Miles(ConvertFrom(x));
        }
    }


    On pourrait ajouter le constructeur suivant à DimensionnedValue afin de rendre les choses plus claires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected DimensionnedUnit(double value, DimensionnedValue one)
    {
       m_value = value;
       m_cofficient = one.m_value * one.m_coefficient;
       m_massDimension = one.m_massDimension;
       ...
    }
     
    // En code ça donnerait ceci:
    public MilesPerHour(double value) : base (value, new Meters(1609.344) / new Seconds(3600))
    Je crois que la seule faille concerne les unités obtenues par translation, comme le Kevin et le Celsius (0°c = 273K ; 100°C = 373K). Mais ça se corrige facilement.

  20. #40
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah oui, au temps pour moi...

    Reste juste un problème à mon sens : si tu définis par exemple l'opérateur d'addition, comment vérifies-tu que ce sont des valeurs "compatibles" ? Par exemple pour qu'on ne puisse pas additionner des mètres et des secondes ? Certes, tu peux vérifier les dimensions et lever une exception, mais l'erreur ne sera détectée qu'à l'exécution... Alors qu'avec ma solution, les unités sont fortement typées, donc ce genre d'erreur est détectée à la compilation

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. interbase : types de donnés : AutoIncrement et Date ???
    Par delphien dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/04/2004, 17h29
  2. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 14h50
  3. Types de données interbase
    Par Clotilde dans le forum InterBase
    Réponses: 2
    Dernier message: 18/11/2003, 14h10
  4. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  5. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 15h15

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