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

VB.NET Discussion :

Tester si une classe est "vide" [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Tester si une classe est "vide"
    Bonjour,

    J'ai une classe Traitements dont la signature peut se résumer à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Traitements(ByRef Classe1
                    ByRef Classe2,
                    ByRef Classe3)
    Classe1 est la seule obligatoire.
    Classe2 et Classe3 sont facultatives. Classe2 "peut être renseignée" et pas Classe3 ou l'inverse. Ou les 2 "peuvent être renseignées"
    Quand Classe2 ou Classe3 "sont renseignées", des traitements sont effectués et mémorisés dans des attributs de Classe2 ou Classe3 (d’où la déclaration avec ByRef)

    Dans la Form qui utilise la classe Traitements, j'instancie Classe1, Classe2 et Classe3, même si je sais très bien que Classe2 ou Classe3 est vide et que je n'aurais donc pas de traitement à faire dessus.

    Et dans la Classe Traitements, je n'arrive pas à tester si Classe2 est "vide" ou si Classe3 est "vide".
    Car bien sûr,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Classe2 Is Nothing Then
    ne marche pas car je suppose que la Classe a été déjà instanciée.

    Donc je ne sais pas comment faire.
    Pouvez-vous m'aider ?
    Merci.

  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
    Bon, je poste principalement pour quelque chose qui n'est pas en lien direct avec le sujet (désolé )
    Tu n'as pas besoin de passer tes classes ByRef pour pouvoir modifier leurs attributs ; la seule chose que permet ByRef c'est de pouvoir réassigner l'instance associée à l'identificateur "nom_du_parametre", mais même en passant ta classe ByVal ses attributs sont modifiables

    En ce qui concerne le sujet, c'est un peu dommage d'instancier des classes à l'avance plutôt que lorsque tu en as besoin (c'est en partie la cause de ton problème, si tes instances n'étaient pas créées en amont tu pourrais, comme tu l'as mentionné tester si elles valent Nothing).
    Tu pourrais créer une propriété dans tes classes (une dans une interface implémentée par tes classes) spécifiant l'état (modifié ou pas) de l'instance en cours mais ça reste bancal comme design (pour moi au moins)

    Cdlt.
    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
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci Sehnsucht pour ce "hors-sujet" instructif.

    J'avais pensé à ce genre de solution en mettant un booléen flaggant vide ou pas.
    Mais comme toi, je ne trouve pas ça propre.

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Bonjour
    Bonjour,

    Moi ce qui me tique un peu c'est dans la signature de ta procédure tu ne type pas tes classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Traitements(ByRef Instance1 As Classe1,  ByRef Instance2 As Classe2, ByRef Instance3 As Classe3)
    Si tant est qu'il s'agisse de trois classes différentes... Car si tu as 3 traitements vraiment différents, dans ce cas tu peux faire de la surcharge : Même nom, mais 3 procédures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Traitements(ByRef Instance1 As Classe1,  ByRef Instance2 As Classe2)
    Sub Traitements(ByRef Instance1 As Classe1,  ByRef Instance3 As Classe3)
    Sub Traitements(ByRef Instance1 As Classe1,  ByRef Instance2 As Classe2, ByRef Instance3 As Classe3)
    (Ce qui n'empêche pas de faire des sous procédures communes.)

    Et pour moi en amont, tu devrait mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Instance1 = Nothing
    Instance2 = Nothing
    Instance3 = Nothing
    Et tu n'instancie que si tu as besoin, c'est le moyen le plus facile de tester.

    Mais l'autre solution ne me choque pas non plus: mettre un Boolean, qui passe à True lorsque tu charges réellement l'objet.
    Pour être propre, ce boolean est en Private, tu créer une proprity Readonly, instancier à False dans le constructeur, il passe à True dans la Sub qui charge l'objet (si pas d'erreur), ainsi il n'est pas modifiable de l'extérieur, il n'est même pas à gérer, il se gère tout seul, c'est l'encapsulation !
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Si, mactwist69, je type bien les classes comme tu l'écris. C'est juste passé à la trappe quand j'ai préparé mon exemple

    J'ai adopté la solution est le booléen. J'ai fais exactement la même chose sauf pour la propriété. Je ne l'ai pas mise à ReadOnly.
    Donc si je comprends on peut affecter une valeur à une propriété ReadOnly mais seulement à l'intérieur de la classe elle-même ?

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Et bien tout dépend de ce que tu veux faire.

    Si tu veux pouvoir modifier la valeur en dehors de la classe : Donc la passer à True ou False, alors tu créer la propriété avec ET le Get ET le Set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Property IsLoaded As Boolean
                Get
                    Return IsLoaded 
                End Get
                Set(value As Boolean)
                    IsLoaded  = value
                End Set
    End Property
    Du coup, il faudra le gérer à l’extérieur de la classe, Donc tu charges ton objet, et après tu feras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet.Isloaded = True
    Mais il faudra le gérer "à la main" à chaque fois.

    Car l'autre solution, tu n'as plus à le gérer (depuis l’extérieur)
    Dans ta classe, dans le constructeur tu le passes à False et dans la procédure (toujours dans la classe) qui charge l'objet, tu feras:

    Et pour savoir si il est chargé, tu mets à disposition QUE le Get :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public ReadOnly Property IsLoaded As Boolean
                Get
                    Return IsLoaded 
                End Get
    End Property
    Et à tout moment, tu peux checker :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If MonObjet.IsLoaded Then
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Très bien. Merci pour ces précisions.
    J'ai modifié mon code en conséquence

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/10/2011, 18h18
  2. Tester si une classe est dans le classpath
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2008, 12h37
  3. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 09h17

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