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 :

Conception objet + Liste d'objets


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut Conception objet + Liste d'objets
    et bonjour bonjour !

    je crois que je suis en train de devenir dépendant de ce forum !
    il me faut mon post par jour sinon je fais des crises !

    j'ai donc mon web service (analayse SpamAssassin) qui, entre autre, lit des rapports en fichier txt et qui renvoie des informations contenues dans ces derniers. Voilà deux des principales méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public float readScoreSA(string rapport) // renvoi la note générale contenu dans le rapport
     
    public ArrayList readWarningsSA(string rapport) // renvoi la liste des warnings (string) contenue dans le rapport
    je voudrais revenir sur la seconde méthode. c'est bien joli, mais du coup je suis un peu limité avec mon ArrayList.
    J'aimerais pouvoir mieux utiliser les warnings contenus dans le rapport. déjà il y a une note attribuée à chaque warning (figurant dans le rapport), et il serait intéressant que plus tard cela renvoi également pour chaque warning un "comment faire pour éviter ce warning !".

    Donc voilou, dois je créer une classe warning ?
    dans lequel je mettrais l'intitulé du warning, la note et le "commentaire".
    Et dans ma méthode readWarningSA, au lieu de remplir un arraylist de string, je remplis un arraylist d'objet Warnings ?

    Bon il faudrait du coup avoir une BD avec tous les warnings pour renvoyer le commentaire.

    Voilà, toutes mes questions..

    pouvez vous m'éclairer ?

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Je pense que tu es dans le vrai avec ta classe Warning

    Le mieux étant de retourner un List<Warning>.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    J'ai donc fait ma classe Warning. j'ai juste fait le constructeur qui prend en parametre l'intitulé du warning et sa note.

    donc dans ma méthode de lecture de fichier, pour chaque warning trouvé, je fait un new Warning avec les 2 éléments voulu, puis je fais un ArrayList.Add(Warning).

    au passage : je trouve pas la classe List, elle n'existe pas pour lui (j'ai fait un using System.Collections, dans lequel y'a le ArrayList)

    puis je renvoi le ArrayList

    Sauf que quand je teste, il gueule ! il n'arrive peut etre pas a afficher mes objets...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    tant qu'a faire, voilà l'exception qu'il me lève :

    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
    System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type WarningsSA was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
       at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
       at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
       at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write4_ArrayOfAnyType(Object o)
       at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayListSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
       at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
       --- End of inner exception stack trace ---
       at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
       at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
       at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces)
       at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
       at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
       at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
       at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
       at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
       at System.Web.Services.Protocols.WebServiceHandler.Invoke()

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Citation Envoyé par zoubidaman Voir le message
    Le mieux étant de retourner un List<Warning>.

    Le mieux est de renvoyer un IEnumerable<Warning> ; au besoin un IList<Warning> : il est préférable de ne pas exposer une List, mais plutot une interface.

    Sinon tu bosses avec .Net 2.0?
    List<T> est une collection generique, namespace System.Collections.Generics

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    Alors là si vous me parlez d'interface, je vais mourir
    J'ai réussi à mettre le type List<> (merci Chubyone), je n'ai maintenant plus d'erreur, mais il m'affiche une liste vide.

    j'ai déclaré comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public List<WarningsSA> readDetailsSA(string report)
    {
    List<WarningsSA> detailsList = new List<WarningsSA>();
    ...
    dans ma boucle de parcours, à chaque fois que je trouve ce qui m'intéresse, je fais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WarningsSA warning = new WarningsSA(ligne, scoreWarning);
     
    detailsList.Add(warning);
    j'ai essayé en faisant des List<string> puis detailsList.Add(ligne)

    ça marche

    pour mon problème précédent, j'ai cru comprendre qu'il y avait un problème de serialization... c'est encore le cas ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public IEnumerable<WarningsSA> readDetailsSA(string report)
    {
    
    foreach / for je sais pas quoi
    {
      yield return new WarningsSA(ligne, scoreWarning);
    }
    
    }
    Pas de collection intermédiaire (si tu n'en as pas le besoin) => performance++


    Sinon une List<T> hérite de IList<T>, donc tu peux l'exposer sans problème

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    c'est gentil de m'aider mais là t'es vraiment en train de me perdre...

    j'aurai peut etre du signaler [debutant] dans mon post...

    Je ne sais pas manipuler une interface, ni vraiment à quoi ça sert exactement... on peut pas l'instancier.
    Et sinon je vois pas trop comment marche le bout de code que tu viens de me passer.

    Bref, je patoge... (une fois de plus !)

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Il te faut surtout mater des cours objet, c'est important si tu veux coder proprement, ou tout simplement progresser.
    Pisser du code c'est pas dur, faire marcher un truc non plus...
    Faire un truc propre, "fermer à la modification mais ouvert au changement" c'est plus difficile


    Une interface c'est un "contrat" : tout objet qui en hérite doit OBLIGATOIREMENT posséder ses propriétés / méthodes

    Tu peux donc avoir deux objet différents, qui implémente la même interface, et les maipuler sans même savoir ce qu'ils sont : tu ne manipule que l'interface, tu te cogne de connaitre l'implémentation concrète. Si tu décide de créer un troisième objet, il n'y a que l'instanciation qui change, rien d'autre, pas une ligne / namespace à modifier nul part ailleurs pour faire marcher ton appli.


    Tu comprendra l'extrême puissance de ce mot clef quand tu pondera un algo récursif en l'utilisant

  10. #10
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    Un exemple bidon d'utilisation d'interface :
    Tu veux avoir un logiciel de dessin genre Photoshop, et donc tu veux des outils pour pouvoir creer des carres, des triangles, des cercles, ...
    L'utilite d'une interface dans ce cas est evident, toutes ces formes, tu veux pouvoir les sauvegarder, les dessiner, ...
    D'ou l'utilite d'une interface !
    Dans ton application tu va pouvoir stocker un dessin sous la forme d'une liste de formes et tu vas vouloir dessiner ton dessin a l'ecran je pense... :
    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
    interface forme
    {
        void dessiner();
    }
     
    Class Dessin
    {
        IList<Forme> _formes;
     
        void dessiner()
        {
            foreach(Forme f in _formes)
            {
                f.dessiner();
            }
        }
    }

    Donc en gros, sans savoir quelle forme je dessine, ou comment je le fais, le dessin veut tracer les formes, donc il dit : "f, dessine toi, peut importe qui t'es..."

    et un exemple de forme, le carre...
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Carre : Forme
    {
        int x, y; // Points d'origine
        int cote; // Longueur d'un cote du carre;
     
        void dessiner()
        {
            // Dessin de ton carre en fonction de x, y et cote...
        }
    }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    coooool... j'ai compris merci !

    c'est un peu une classe abstraite... du moins une classe qui implémente une interface possède les méthodes et les constantes déclarées dans celle-ci. donc normal qu'on peut pas l'instancier vu que c'est plus un "adjectif" qu'un "nom" (si on dit qu'une classe est un nom).

    en attendant vos réponses, j'avais réussi à remplir ma list d'objet en ajoutant [Serializable] sur ma classe Warning et [System.Xml.Serialization.XmlElementAttribute()] sur ses attributs. Ce qui fait que c'est très beau quand je lance ma fonction et que je vois des trucs du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      <?xml version="1.0" encoding="utf-8" ?> 
    - <ArrayOfWarnings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://localhost/MyWebServices/">
    - <Warnings>
        <Name>NOM1/Name> 
        <Score>3</Score> 
      </Warnings>
    - <Warnings>
        <Name>NOM2</Name> 
        <Score>4</Score> 
      </WarningsSA>
      </ArrayOfWarningsSA>


    donc je vois quand meme pas encore exactement en quoi les interfaces seraient mieux dans mon cas, mais j'ai compris déjà a quoi ça sert, donc j'y travaille là !

    merci encore.

  12. #12
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    En gros, ils te parlaient d'interface pour les listes, et en general, qd on utilise une liste dans une classe, on prefere utiliser l'interface, plutot que la classe concrete, ce qui te permet de pouvoir change de type de liste si tu as besoin...
    En gros, on cherche a laisse un maximum d'abstraction pour que la classe soit la plus facile a modifier et a comprendre...
    En reprenant mon exemple, c'est tjs plus facile de dire : "f, dessines toi", plutot que de dire : "f je crois que t'es un carre, donc tu vas te dessiner comme un carre". qd le programmeur qui utilise ta classe Dessin veut dessiner son dessin (), il n'est cense savoir comment la classe fait pour se dessiner, et surtout il en a rien a %$*&$#~.

    Conclusion :
    Plus t'as d'abstraction, plus c'est facile a programmer, car moins t'as besoin de savoir sur ce qu'il se passe en dessous

    J'irais meme jusqu'a comparer l'abstraction avec un langage !
    Au depart, on programmait en parlant a la memoire directement, et c'etait tres complique car il fallait tout gere soit meme. Maintenant, on a C# (ou autre langage recent), et on peut creer et utiliser toutes sortes d'outils comme des listes, sans meme savoir ce qui se passe vraiment.

  13. #13
    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 : 44
    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
    Par défaut
    Citation Envoyé par remsrock Voir le message
    c'est un peu une classe abstraite...
    Grosses différences quand même :
    - une classe abstraite peut implémenter certaines méthodes et propriété, et laisser les classes dérivées implémenter les autres; une interface ne contient aucune implémentation, seulement des déclarations
    - tu ne peux hériter que d'une seule classe (abstraite ou non), mais tu peux implémenter plusieurs interfaces.

    Citation Envoyé par remsrock Voir le message
    du moins une classe qui implémente une interface possède les méthodes et les constantes déclarées dans celle-ci
    pas automatiquement... elle DOIT posséder ces méthodes, mais c'est au programmeur de les implémenter

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 81
    Par défaut
    je me suis sans doute mal exprimé, ou peut etre encore un peu flou (car je n'ai pas encore utilisé), mais c'est bien ce que j'avais compris.

    merci pour toutes ces précisions.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Mettre une Liste d'objets dans un objet sélectionnable
    Par khadime27 dans le forum C#
    Réponses: 1
    Dernier message: 19/09/2012, 10h51
  2. [Débutant(e)][Conception] prob de programmation objet
    Par gregorian dans le forum Général Java
    Réponses: 3
    Dernier message: 07/07/2005, 11h20
  3. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11
  4. [Kylix] Composant - Liste d'objet
    Par Metal3d dans le forum EDI
    Réponses: 1
    Dernier message: 13/12/2002, 22h17
  5. liste d'objets
    Par Pierrot dans le forum Langage
    Réponses: 2
    Dernier message: 27/09/2002, 09h56

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